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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java解密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 = "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字节加密数据+填充。

以上是关于使用Java解密CryptoJS DES编码字符串的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

【uniapp】Vue.js CryptoJs 中的 3des 加密解密

CryptoJS和Java进行加解密

功能强大的JS加密库-CryptoJS

java des加密解密

对称加密-DES加密解密

怎么把mysql数据库中现有的数据进行des加密,加密后的结果和java中des加密的结果一样。