Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Java解密CryptoJS DES编码字符串的正确方法?_Javascript_Java_Encryption_Cryptojs_Des - Fatal编程技术网

Javascript 使用Java解密CryptoJS DES编码字符串的正确方法?

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

在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必须相同。在该示例中,正在创建一个新的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的工作原理知之甚少。