[在db中持久保存/更新销售人员数据时出错:00530000000dXXnAAM] java.lang.Exception:javax.crypto.IllegalBlockSizeException文本: “id”:“0011300001iidq1AAA”,“name”:“Svebo Sveis L ???? ft Svein V Bondal”,“sic”:0 消息:>输入长度不是8个字节的倍数。 com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1016) 在com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:984) 在com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824) 在com.sun.crypto.provider.DESedeCipher.engineDoFinal(DESedeCipher.java:294) 在javax.crypto.Cipher.doFinal(Cipher.java:2165)
这里是我正在使用的代码,顺便说一下,它在大多数情况下工作但是没有输入如上所述。
for encryption
{
// create a cipher using a key to initialize it
Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
// perform the actual encryption
byte[] ciphertext = cipher.doFinal(text);
return ciphertext;
}
for decryption
{
// create a cipher using a key to initialize it
Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, iv);
// perform the decryption
byte[] decryptedText = cipher.doFinal(text);
return decryptedText;
}
答案 0 :(得分:1)
错误非常明确:输入长度不是8字节的倍数。
您已指定NOPadding
,将其更改为PKCS5Padding
。
DES是一种基于块的加密算法,因此输入必须是块大小的精确倍数,DES为8字节。当输入不是总是时,必须添加精确的多个填充,这是让实现通过指定填充(通常为DES的PKCS#5)为您执行此操作的最简单方法。
注1:
代码有"DESede/CBC/NOPadding"
,有拼写错误,应为"DESede/CBC/NoPadding"
,请参阅Class Cipher。
注2:
最好不要使用3DES,不应该在新工作中使用它,而是使用当前的标准:AES。