我使用以下算法在Java中加密/解密 -
cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
加密/解密方法如下 -
public String encryptString(String originalString) {
String encryptedString = null;
try {
cipher.init(Cipher.ENCRYPT_MODE, secKey);
byte[] encryptedBytes = cipher.doFinal(originalString.getBytes("UTF8"));
encryptedString = new String(encryptedBytes,"UTF8");
} catch (Exception ex) {
LOGGER.error("Could not encrypt String {}", originalString, ex);
ex.printStackTrace();
}
return encryptedString;
}
public String decryptString(String encryptedString) {
String decryptedString = null;
try {
cipher.init(Cipher.DECRYPT_MODE, secKey);
byte[] encryptedBytes = cipher.doFinal(encryptedString.getBytes("UTF8"));
decryptedString = new String(encryptedBytes,"UTF8");
} catch (Exception ex) {
LOGGER.error("Could not decrypt String {}", encryptedString, ex);
ex.printStackTrace();
}
return decryptedString;
}
但它给了我以下错误
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
如果我删除字符串中的所有UTF-8并且getBytes()
在我的本地Windows 7计算机上正常工作但在我的linux框(部署tomcat)上不起作用,并且具有与上面相同的错误。任何帮助或建议表示赞赏。
它可能没有关系,但我正在保存并从DB2数据库中检索值。
由于现有的数据设置,我无法在base64编码后用于在DB2中存储String。我需要使用上面的alogo来解密现有数据。它适用于Windows机器,但不适用于Linux(全部没有utf格式)。
经过一些调试后,看起来new String()
和getBytes()
正在使用默认的平台特定区域设置。新的String()中的UTF-8
也会将编码的字节(根据DES的8个字节的倍数)更改为8的非倍数,因为解密失败。 使用base64不是一种选择。