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

时间:2018-03-02 09:47:07

标签: 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 = "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加密字符串的方式)。非常感谢你。

1 个答案:

答案 0 :(得分:1)

加密和解密的IV必须相同。在该示例中,正在创建用于解密的新随机IV:secureRandom.nextBytes(ivspec);

您需要仔细并全面查看CryptoJS文档,以确定如何处理IV。通常,IV会加密到加密数据,以便在解密期间使用。

encryptedString似乎是Base64编码的,解码长度是32字节,恰好适合16字节的IV和16字节加密数据+填充。