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.如果这是生产代码,请考虑获取帮助.
| 归档时间: |
|
| 查看次数: |
50798 次 |
| 最近记录: |