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>
这是问题
基本上,我有一个使用 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>