加密js从base64解密

时间:2019-09-16 08:15:19

标签: javascript aes cryptojs

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

小提琴更新:https://jsfiddle.net/n6wL9a40/

2 个答案:

答案 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/

要回答您的另一个问题,由于生成的ivsee explanation here),第一版中的每次加密文本都不相同。通过在ECB模式下将密钥与AES-128一起使用,iv不会自动生成并且未定义(显然,当尝试指定一个密钥时,没有任何变化,可能是因为未按照说明链接中的说明使用)< / p>

答案 1 :(得分:0)

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