Javascript 使用Java解密CryptoJS DES编码字符串的正确方法?
在JavaScript方面,我使用:Javascript 使用Java解密CryptoJS DES编码字符串的正确方法?,javascript,java,encryption,cryptojs,des,Javascript,Java,Encryption,Cryptojs,Des,在JavaScript方面,我使用: CryptoJS.DES.encrypt('Content', 'password').toString() 结果是: U2FsdGVkX1/25rW2q0X7/pOtExFyP7MD 在Java端,我尝试解密它: public static void main(String[] args) throws Exception { String password = "password"; String encryptedString = "U2FsdG
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必须相同。在该示例中,正在创建一个新的random IV进行解密:
secureRandom.nextBytes(ivspec)代码>
您需要仔细全面地查看CryptoJS
文档,以确定如何处理IV。通常在加密数据前面加上IV,以便在解密过程中使用
encryptedString
似乎是Base64编码的,解码长度为32字节,正好适合16字节IV和16字节加密数据+填充。通常填充错误表示解密失败。不要将DES用于新工作,它不再被认为是安全的,并且已被AES取代(高级加密标准)DES仅有的密钥大小仅为56位,这被认为是不安全的,AES支持128192和256位的密钥大小。请参阅。数据始终以53616c7465645f5f开头。这来自OpenSSL格式化程序,因此您需要使用此格式解码以获得IV和数据字节。这是针对AES的,但应该类似:感谢fgb,我终于解决了在你的链接中使用示例的问题。如果你发布一个答案,我会将其标记为已接受。谢谢zaph,这很有见地。我显然对DES的工作原理知之甚少。