尝试使用 CryptoJS 打印十六进制字符串

Trying to print hex string with CryptoJS

我正在尝试使用 CryptoJS 来加密一些内容,然后生成加密文本的十六进制字符串。

function EncryptAES(text, key) {
  var encrypted = CryptoJS.AES.encrypt(text, key);
  return CryptoJS.enc.Hex.stringify(encrypted);
}

var encrypted = EncryptAES("Hello, World!", "SuperSecretPassword");

console.log(encrypted);

但是,控制台上打印的不是十六进制字符串,而是空行。我做错了什么?

CryptoJS.AES.encrypt() returns 封装多个数据的 CipherParams 对象,包括作为 WordArray 的密文(s. here)。默认情况下,.toString() returns WordArray:

的十六进制编码数据

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

var encrypted = EncryptAES("Hello, World!", "SuperSecretPassword");

console.log(encrypted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

请注意,在您的示例中,密钥 material 作为字符串传递,因此被解释为密码短语 (s. here),通过密钥派生函数结合 random 8 bytes salt,这就是为什么对于相同的输入数据每次密文都会变化的原因。
因此,解密不仅需要密文,还需要盐,盐也封装在CipherParams对象中。
对于 CipherParams 对象,.toString() returns Base64 编码的 OpenSSL 格式的数据由 Salted__ 的 ASCII 编码组成,后跟 8 字节盐和实际密文,以及因此包含解密所需的所有信息。