我正在处理cryptojs,并想尝试使用aes
var encrypted = CryptoJS.AES.encrypt("TEST_TEXT", '9021D105A446', {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
var decrypt = CryptoJS.AES.decrypt(encrypted, '9021D105A446', {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(decrypt.toString(CryptoJS.enc.Utf8));//Yeah! TEST_TEXT output as expected
现在,我尝试使用base64中的加密功能,但无法按预期输出
var encryptedText = encrypted.ciphertext.toString(CryptoJS.enc.Base64)
var encrypted2 = CryptoJS.enc.Base64.parse(encryptedText);
var decrypt2 = CryptoJS.AES.decrypt(encrypted2, '9021D105A446', {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(decrypt2.toString(CryptoJS.enc.Utf8));// Ops! empty output
您知道第二个示例中的解密出了什么问题吗?
另一个问题,每运行一次示例1,encryptedText
就与之前的运行有所不同。这是正常行为吗?
答案 0 :(得分:1)
首先,实际上CryptoJS.enc.Base64.parse(encryptedText)
并没有给您返回Base64字符串,而是一个对象,您应该将其与toString
一起使用,例如:CryptoJS.enc.Base64.parse(encryptedText).toString()
来获取原始字符串是在Base64中编码的
但是真正的问题是您使用了加密对象的错误部分(请参阅链接的小提琴,尝试解密.ciphertext
无效,因为密文只是解密所需的加密结果的最后一部分,缺少第一部分)。另外,根本不需要将输出转换为Base64,因为它已经在Base64中了!
console.log(encrypted.toString()); //will already be Base64
在更新的小提琴中查看所有这些内容:https://jsfiddle.net/gqkcvjxo/
编辑: 对于您的其他问题,我引用the docs:
CryptoJS支持AES-128,AES-192和AES-256。它将根据您传入的密钥的大小来选择变体。如果您使用密码短语,它将生成一个256位密钥
您可以通过使用长度为16(128/8)的密码来生成AES-128的密钥,在小提琴中您会看到它起作用,加密的文本长度减半。
var pass = 'abcdefghijklmnop'; //must be length 16 (because 128/8)
var key = CryptoJS.enc.Utf8.parse(pass);
更新的小提琴:https://jsfiddle.net/o3975jtd/3/
要回答您的另一个问题,由于生成的iv
(see explanation here),第一版中的每次加密文本都不相同。通过在ECB模式下将密钥与AES-128一起使用,iv
不会自动生成并且未定义(显然,当尝试指定一个密钥时,没有任何变化,可能是因为未按照说明链接中的说明使用)< / p>
答案 1 :(得分:0)
您不需要将加密的值转换为base64
,encrypted.toString()
返回base64
值。
var base64Value = encrypted.toString();
// base64Value is U2FsdGVkX19s42BDpx8A9I265vm+zGKSk8nEbQwNjfw=
var encryptedText = CryptoJS.enc.Base64.parse(base64Value)
var encrypted2 = encryptedText.toString(CryptoJS.enc.Base64);
var decrypt2 = CryptoJS.AES.decrypt(encrypted2, '9021D105A446', {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(decrypt2.toString(CryptoJS.enc.Utf8));// TEST_TEXT