CryptoJS AES 解密十六进制字符串?

CryptoJS AES decrypt Hex String?

这是问题

的第二部分

基本上,我有一个使用 CryptoJS 加密消息并将密文作为十六进制字符串吐出的函数。

function EncryptAES(text, key) {
  var encrypted = CryptoJS.AES.encrypt(text, key);
  return encrypted.ciphertext.toString()
}

我想编写一个函数 DecryptAES,它采用十六进制字符串、密钥和盐(我显然需要)和 returns 原始明文。问题是我无法弄清楚如何将十六进制字符串恢复为 CryptoJS.AES.decrypt 将接受的形式,而且我在文档中找不到实际解释如何执行此操作的任何地方。也许我忽略了什么。请帮忙。

CryptoJS 内部使用 WordArray 数据类型,并提供 encoders 进行转换。如果要将十六进制编码的字符串转换为 WordArray,可以使用十六进制编码器,如下所示:

CryptoJS.enc.Hex.parse(<your hex encoded string>)

或反过来

<your WordArray>.toString(CryptoJS.enc.Hex)

或简称

<your WordArray>.toString()

此外,CryptoJS.AES.encrypt() returns 一个 CipherParams 封装密文和盐的对象,等等。此 CipherParams 对象将传递给 CryptoJS.AES.decrypt() 进行解密。

有了这个,你想要的可以实现如下:

function EncryptAES(text, key) {
    var encrypted = CryptoJS.AES.encrypt(text, key);
    return {ciphertext: encrypted.ciphertext.toString(), salt: encrypted.salt.toString()}
}

function DecryptAES(ciphertext, salt, key){
    var decrypted = CryptoJS.AES.decrypt({ciphertext:CryptoJS.enc.Hex.parse(ciphertext), salt:CryptoJS.enc.Hex.parse(salt)}, key); 
    return decrypted;
}

var {ciphertext, salt} = EncryptAES('The quick brown fox jumps over the lazy dog', 'my passphrase');
console.log('Ciphertext (hex): ', ciphertext);
console.log('Salt (hex): ', salt);

var decrypted = DecryptAES(ciphertext, salt, 'my passphrase');
console.log('Decrypted: ', decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>


但是,有一种更简单的方法来处理盐和密文。对于 CipherParams 对象,.toString() returns Base64 编码的 OpenSSL 格式的数据由 Salted__ 的十六进制编码组成,后跟 8 字节盐和实际密文。 CryptoJS.AES.decrypt() 将这样的 Base64 字符串隐式转换为 CipherParams 对象:

var encrypted = CryptoJS.AES.encrypt('The quick brown fox jumps over the lazy dog', 'my passphrase').toString();
console.log("Salt, ciphertext (OpenSSL format, Base64): ", encrypted);

var decrypted = CryptoJS.AES.decrypt(encrypted, 'my passphrase');
console.log("Decrypted: ", decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>