从 base64 加密 js 解密

Crypto js decrypt from base64

我处理 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 与之前的 运行ning 不同。这是正常行为吗?

Fiddle 更新:https://jsfiddle.net/n6wL9a40/

首先,实际上 CryptoJS.enc.Base64.parse(encryptedText) 并没有给你返回一个 Base64 字符串,而是一个对象,你应该像这样将它与 toString 一起使用: CryptoJS.enc.Base64.parse(encryptedText).toString() 来取回你原来的以 Base64

编码的字符串

但真正的问题是你使用了加密对象的错误部分(见linked fiddle,试图解密.ciphertext是行不通的,因为密文是只有解密所需的加密结果的最后一部分,缺少第一部分)。此外,根本不需要将输出转换为 Base64,因为它已经在 Base64 中了!

console.log(encrypted.toString()); //will already be Base64

在更新的 fiddle 中查看所有内容:https://jsfiddle.net/gqkcvjxo/

编辑: 对于你的其他问题,我引用 the docs:

CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key

您可以使用长度为 16 (128/8) 的通道生成 AES-128 密钥,您会在 fiddle 中看到它有效,加密文本长度减半。

var pass = 'abcdefghijklmnop'; //must be length 16 (because 128/8)
var key =  CryptoJS.enc.Utf8.parse(pass);

已更新 fiddle:https://jsfiddle.net/o3975jtd/3/

回答你的另一个问题,由于生成的iv),第一个版本中每次加密的文本都不相同。通过在 ECB 模式下使用带有 AES-128 的密钥,iv 不会自动生成并且未定义(显然,当尝试指定一个时,没有任何变化,可能是因为它没有按照解释中的说明使用 link)

您不需要将加密值转换为 base64encrypted.toString() returns 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