我正在尝试使用 crypto-js 包创建一个 JavaScript 函数来解码 AES(CBC 模式)。
我在在线解码工具中输入数据并且它正确解密,因此我确信以下数据是正确的,但我无法通过JavaScript重现它。
这是在线解密(所以我确定数据、 key 、iv都是正确的):http://aes.online-domain-tools.com/link/deb718giF4dUxZylq/
我的代码为 [email protected] :
// data, key, iv are all Hex
var data = "bd6e0a73147a2c224c7c20346d0e9a138b744a5d94463cdff6dbb965055f974f097104399d2c40af2f0ac667f3857e70e9703bf27f6411f7e97c3449e8921f3c98e665914689b4b77b5bbcc8d8bc319e680eb89eedb1c25178923ae57fb3fb476755d6009f1aed88fffcb9b2ed3b4cf6f23d9c4c56da1dde6619e45a8d6f06412853ae1941cf554b6824112a913750a7485ed67fb38b950411310410de998f2597c2fcc81a305b0df369f54b75426176";
var key = 'befce5c6da98837ea421811c832817ae';
var iv = "a884a7edd5d06a48d6da9ad11fd36a75";
// transfer Hex to WordArray
var _data = CryptoJS.enc.Hex.parse(data);
var base64_data = _data.toString(CryptoJS.enc.Base64);
var _key = CryptoJS.enc.Hex.parse(key);
var _iv = CryptoJS.enc.Hex.parse(iv);
decrypted = CryptoJS.AES.decrypt(
base64_data, // pass base64
_key, // pass WordArray
{iv: _iv, // pass WordArray
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
})
console.log(decrypted.toString(CryptoJS.enc.Utf8));
// out put fail to match Utf8
输出错误:格式错误的 UTF-8 数据
解码后的字符串应该是:(链接不重要)
https://emogo-media-testing.s3.amazonaws.com/1503342403787_blob?AWSAccessKeyId=AKIAI5MUDCK6XYWKGAKA&Expires=1534882403&Signature=t1PFesQuOpOlIMKoOqje%2Bs7I%2Fhg
任何提示表示赞赏。谢谢!
最佳答案
我知道你问这个问题已经有一段时间了,但我会回复,这样下一个人就不会偶然发现未回答的问题。
您的代码工作正常,它正确解密 AES.CBC 加密数据,问题出在您的输入数据
。
您的加密data
字符串应该如下所示:
80b7c4881334675693ef9c95259e70b24d0736e98f8424233d5e37f353261c2a589287bc3f675449f7d8ed4e2289a4c06b22d7f83efc09cfb72abe3a76e193a8efbdc968232d29b9b58135bfa24d51e60e34791f652a0aa806d0be7734dd61a930a30c99f31f08740cdb182af07b19d5b4274deb958d984b3ccb9d6e2be0cfa3a026dd6b734dbf1dd3635bc7bcceface9c55dfb9455ca834a6dbd1aa0f3c23923ce6aeba59acbc80d681fee73487b9004496540830d44102b94e35eac291c4e3b8c9ac168ae799e46cde45ee652415ae69992d0f7527045fd42b82e9e6946cfb2dbcc3b93f19ff0e5035ab12250f7a917975b2f7c069cbd8a0ba0d94b318634a
为了让这个例子正常工作。
您使用的 key 不是十六进制字符串,而是文本字符串。您的在线示例不再有效,但我在几次尝试后找到了答案。
如果更改以下行:
var _key = CryptoJS.enc.Hex.parse(key);
至:
var _key = CryptoJS.enc.Utf8.parse(key);
您的代码示例将与您的原始数据字符串一起正常工作。
当您解密 http://aes.online-domain-tools.com/ 上的文本时您可能选择了纯文本文本框而不是十六进制作为您的按键输入。
关于aes - crypto-js 从十六进制解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45923666/