这是问题Trying to print hex string with CryptoJS的第二部分
基本上,我有一个使用CryptoJS加密消息并将密码文本作为十六进制字符串输出的函数。
function EncryptAES(text, key) {
var encrypted = CryptoJS.AES.encrypt(text, key);
return encrypted.ciphertext.toString()
}
字符串
我想写一个函数DecryptAES,它接受十六进制字符串、密钥和salt(我显然需要这些),并返回原始明文。问题是我不知道如何将十六进制字符串转换为CryptoJS.AES.decrypt
可以接受的形式,而且我在文档中找不到任何地方实际解释如何做到这一点。也许我忽略了什么。请帮帮我
2条答案
按热度按时间a1o7rhls1#
CryptoJS在内部使用
WordArray
数据类型,并提供编码器进行转换。如果你想将一个十六进制编码的字符串转换为WordArray
,可以使用十六进制编码器,如下所示:字符串
或者反过来
型
或者简称
型
此外,
CryptoJS.AES.encrypt()
返回一个CipherParams
对象,其中封装了密文和salt等。这个CipherParams
对象将被传递给CryptoJS.AES.decrypt()
进行解密。有了这个,你想要的可以实现如下:
但是,有一种更简单的方法来处理salt和密文。对于
CipherParams
对象,.toString()
以Base64编码的OpenSSL格式返回数据,该格式包括Salted__
的十六进制编码,后跟8字节的salt和实际的密文。CryptoJS.AES.decrypt()
隐式地将这样的Base64字符串转换为CipherParams
对象:c0vxltue2#
CryptoJS期望其加密数据具有某种格式。如果只提供密文的十六进制字符串,则在解密时需要重新构造此格式化数据。下面是一个例子:
字符串
在EncryptAES函数中,通过调用encrypted.toString(),它将生成一个包含salt、iv和密文的字符串。当我们解密它时,我们不需要单独处理盐和iv。
但是,如果您只处理密文(十六进制字符串),则可以使用以下命令对其进行解密:
型
DecryptFromHex获取十六进制密文字符串,将其解析回CryptoJS可以理解的格式,然后对其进行解密。请注意,key和iv也从UTF8解析为CryptoJS使用的WordArray格式。
确保用于
decryption
的密钥和iv与用于encryption
的密钥和iv匹配。