Java 解密错误:";当需要一个时,无iv设置;
我对加密几乎是新手 我试图解密一个字节数组,当我提供IV时,我得到一个异常: InvalidAlgorithmParameterException(预期时未设置iv) 这是我的代码(iv是一个16字节的数组,它不是空的,并且具有加密时使用的值): 如果我没有指定IV,密码将初始化为ok: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
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");