当前位置: 首页 > 知识库问答 >
问题:

使用CryptoJS解密Java AES/CBC/PKCS5Padding

邵兴庆
2023-03-14

我有一些问题,解密文本的CryptoJS已经用Java加密。解密应使用AES/CBC/PKCS5Padding完成。加密的字符串是base64编码的,我在尝试解密字符串之前对其进行解码。

这就是Java代码的样子:

private static byte[] doAES(int mode, byte[] dataToEncrypt, String secretKey, String salt) throws Exception {
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKeySpec secretKeySpec = new SecretKeySpec(tmp.getEncoded(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(mode, secretKeySpec, ivspec);
        
        return cipher.doFinal(dataToEncrypt);
}
let decoded = Buffer.from(encodedString, 'base64')
console.log("Result: " + CryptoJS.AES.decrypt({
  ciphertext: CryptoJS.enc.Hex.parse(decoded.toString().substring(32))
}, CryptoJS.enc.Hex.parse(CryptoJS.SHA1(sharedSecretKey).toString().substring(0,32)),  
  {
    iv: CryptoJS.lib.WordArray.create(Buffer.alloc(16)),
  }).toString(CryptoJS.enc.Utf8))

共有1个答案

申高峰
2023-03-14

在CryptoJS代码中,缺少PBKDF2的密钥派生。默认情况下,CryptoJS为此使用SHA1。
密文可以通过Base64编码传递,并将隐式转换为CipherParams对象:

var encodedString = "0O15lUg8sE1G0+BjO5N2j8AjVKXV4J+18z5DinbM6tYjoILhL0WDTFWbcTiN+pG/";
var key = CryptoJS.PBKDF2(
  "my passphrase", 
  "my salt", 
  {
    keySize: 256 / 32, 
    iterations: 65536
  }
);
var decryptedData = CryptoJS.AES.decrypt(encodedString, key,  
  {
    iv: CryptoJS.enc.Utf8.parse("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"),
  }
);

console.log("Result: " + decryptedData.toString(CryptoJS.enc.Utf8));
html prettyprint-override"><script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
 类似资料:
  • 我使用JavaAPI生成128bit密钥。下面是我使用的算法: 我可以通过这些方法轻松地使用secretKey加密和解密消息。由于Java默认使用128bit AES加密,因此它使用SHA1生成原始密钥的哈希,并将哈希的前16字节用作AES中的密钥。然后以十六进制格式转储IV和密文。 但是,它返回一个空字符串。

  • 以下示例有什么问题? 问题是解密字符串的第一部分是无意义的。不过,其余的都很好,我明白了...

  • 注意,这只提供salt和密码,openssl应该自动处理key和IV。我是不是太乐观了,当浏览器解密时也会发生这种情况?如果可能的话,我希望只使用那些加密设置,或者增加的复杂性最小。在浏览器中,我正在尝试使用CryptoJS解密,如下所示: 但使用的属性“0”,。cryptojs.aes.decrypt的文档很薄,我知道在调用该函数时要更改的任何设置似乎都会给出相同的错误。感谢任何一个能发光的人!

  • 下面是我到现在为止所尝试的 下面是适用于我的node.js代码。在CryptoJ中,我没有成功地实现类似的功能。根据我的理解,crypto是内置库,其中的节点在其上有自己的包装器。

  • 在我的jsfiddle中查看我失败的尝试或在这里查看: 知道为什么解密失败了吗?