从 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)
您不需要将加密值转换为 base64
、encrypted.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
我处理 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
(iv
不会自动生成并且未定义(显然,当尝试指定一个时,没有任何变化,可能是因为它没有按照解释中的说明使用 link)
您不需要将加密值转换为 base64
、encrypted.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