Java 解密错误:";当需要一个时,无iv设置;

Java 解密错误:";当需要一个时,无iv设置;,java,android,cryptography,Java,Android,Cryptography,我对加密几乎是新手 我试图解密一个字节数组,当我提供IV时,我得到一个异常: InvalidAlgorithmParameterException(预期时未设置iv) 这是我的代码(iv是一个16字节的数组,它不是空的,并且具有加密时使用的值): 如果我没有指定IV,密码将初始化为ok: Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, encriptionKe

我对加密几乎是新手

我试图解密一个字节数组,当我提供IV时,我得到一个异常: InvalidAlgorithmParameterException(预期时未设置iv)

这是我的代码(iv是一个16字节的数组,它不是空的,并且具有加密时使用的值):

如果我没有指定IV,密码将初始化为ok:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, encriptionKey);
为了找到答案,我确实找到了JCEStreamCipher()的一个实现,它可能与我正在使用的版本不一致,但有一些代码使我无法正确理解它

代码如下:

   if ((ivLength != 0) && !(param instanceof ParametersWithIV))
    {
        SecureRandom    ivRandom = random;

        if (ivRandom == null)
        {
            ivRandom = new SecureRandom();
        }

        if ((opmode == Cipher.ENCRYPT_MODE) || (opmode == Cipher.WRAP_MODE))
        {
            byte[]  iv = new byte[ivLength];

            ivRandom.nextBytes(iv);
            param = new ParametersWithIV(param, iv);
            ivParam = (ParametersWithIV)param;
        }
        else
        {
            throw new InvalidAlgorithmParameterException("no IV set when one expected");
        }
    }
看起来我无法在解密时提供IV,但这对我来说没有太多意义

任何帮助都将不胜感激

非常感谢, 理查德。

问题解决了

我使用了错误的SecretKey,而不是您可以为AES创建的SecretKey

以前我有:

KeySpec spec = new PBEKeySpec(password.toCharArray(), encryptionKeySalt, 12345,256);
SecretKey encriptionKey = factory.generateSecret(spec);
它创建了一个JCEPBEKey

我失踪了:

Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES"); 

这为AES创建了一个合适的密钥。

抱歉,我不太理解您的问题。也许你最好发布你正在使用的代码(超过两行),而不是JCEStreamCipher中的代码。你说,“看起来我解密时无法提供IV”为什么不呢?通常的方法是将IV前置到密文的前面,并将它们一起传输。接收者使用前16个字节作为IV来解密消息的其余部分。我就是这样做的,但是我在向解密程序提供IV时遇到了一个异常,这让我感到困惑。我在创建密钥时出错(刚刚发布了答案)。非常好。此错误仅发生在办公室中的一个较旧版本的4.0.3设备上,其他设备上没有。现在,它可以跨平台工作。
Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES");