需要解决AES中错误的IV长度问题

Sha*_*hed 5 java aes initialization-vector

我正在尝试在Java中实现AES,这是我使用的代码:

 byte[] sessionKey = {00000000000000000000000000000000};
 byte[] iv = {00000000000000000000000000000000};
 byte[] plaintext = "6a84867cd77e12ad07ea1be895c53fa3".getBytes();
 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

 cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
 byte[] ciphertext = cipher.doFinal(plaintext);

 cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
 byte[] deciphertext = cipher.doFinal(ciphertext);
Run Code Online (Sandbox Code Playgroud)

我需要这个固定密钥和IV用于测试目的,但我得到以下异常:

Exception in thread "main"
java.security.InvalidAlgorithmParameterException: 
  Wrong IV length: must be 16 bytes long    at
com.sun.crypto.provider.SunJCE_h.a(DashoA12275)     at
com.sun.crypto.provider.AESCipher.engineInit(DashoA12275)   at
javax.crypto.Cipher.a(DashoA12275)  at
javax.crypto.Cipher.a(DashoA12275)  at
javax.crypto.Cipher.init(DashoA12275)   at
javax.crypto.Cipher.init(DashoA12275)
Run Code Online (Sandbox Code Playgroud)

如何在此AES实现中使用此固定IV?有什么办法吗?

Vin*_*lds 38

首先,

byte[] iv = {00000000000000000000000000000000};
Run Code Online (Sandbox Code Playgroud)

创建一个大小为1的字节数组,而不是一个大小为32的字节数组(如果这是你的意图).

其次,AES的IV大小应为16字节或128位(这是AES-128的块大小).如果使用AES-256,则IV大小应为128位大,因为AES标准仅允许128位块大小.原始Rijndael算法允许其他块大小,包括256位长块大小.

第三,如果您打算使用AES-256,这不是开箱即用的.您需要下载并安装JCE Unlimited Strength Jurisdiction Policy Files(滚动到页面底部); 我还建议阅读随附的许可证.

这将导致您的代码发生以下更改:

byte[] iv = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Run Code Online (Sandbox Code Playgroud)

最后,初始化向量意味着唯一且不可预测.16字节的序列,每个字节由值0表示,不适合IV.如果这是生产代码,请考虑获取帮助.

  • 使用十六进制解码器,如[Apache Commons Codec中的一个](http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html#decodeHex(char []))解码十六进制编码的值并获取字节数组.如果您有任何进一步的问题,我建议将其作为一个新问题,因为评论区域并不是真正用于提出新问题. (2认同)

Dam*_*ver 14

高级加密标准:

该标准包括三个分组密码,AES-128,AES-192和AES-256,采用最初发布为Rijndael的大型系列.这些密码中的每一个都具有128位块大小,密钥大小分别为128,192和256位

(重点补充)

初始化向量:

对于分组密码操作模式,IV通常与密码的块大小一样大

将这两个因素结合在一起,您可以得到AES始终为128位AES,与密钥大小无关.