在JavaScript方面,我使用:
CryptoJS.DES.encrypt('Content', 'password').toString()
结果:
U2FsdGVkX1/25rW2q0X7/pOtExFyP7MD
在Java方面,我尝试解密它:
public static void main(String[] args) throws Exception {
String password = "password";
String encryptedString = "U2FsdGVkX1/25rW2q0X7/pOtExFyP7MD";
DESKeySpec key = new DESKeySpec(password.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
SecureRandom secureRandom = new SecureRandom();
byte[] ivspec = new byte[cipher.getBlockSize()];
secureRandom.nextBytes(ivspec);
IvParameterSpec iv = new IvParameterSpec(ivspec);
cipher.init(Cipher.DECRYPT_MODE, keyFactory.generateSecret(key), iv);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedString.getBytes()));
System.out.println(new String(Base64.getEncoder().encode(decryptedBytes)));
}
但是我收到了错误的填充错误:
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
任何人都可以告诉我出了什么问题以及解密它的正确方法是什么?假设无法更改JavaScript端代码(即使用DES加密字符串的方式)。非常感谢你。
加密和解密的IV必须相同。在该示例中,正在创建用于解密的新随机IV:secureRandom.nextBytes(ivspec);
。
您需要仔细并全面查看CryptoJS
文档,以确定如何处理IV。通常,IV被加在加密数据之前,以便在解密期间使用。
encryptedString
似乎是Base64编码的,解码长度是32字节,恰好适用于16字节的IV和16字节加密数据+填充。