crypto-js 从十六进制解密
crypto-js decrypt from Hex
我正在尝试使用包 crypto-js 制作一个 JavaScript 函数来解码 AES(CBC 模式)。
我在在线解码工具中输入了数据并正确解密,所以我确定以下数据是正确的,但我无法通过JavaScript重现它。
这里是在线解密(所以我确定数据,密钥,iv是正确的):http://aes.online-domain-tools.com/link/deb718giF4dUxZylq/
我使用 crypto-js@3.1.8 的代码:
// 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 数据
解码后的字符串应该是:(link不重要)
https://emogo-media-testing.s3.amazonaws.com/1503342403787_blob?AWSAccessKeyId=AKIAI5MUDCK6XYWKGAKA&Expires=1534882403&Signature=t1PFesQuOpOlIMKoOqje%2Bs7I%2Fhg
如有任何提示,我们将不胜感激。谢谢!
我知道你问这个问题已经有一段时间了,但我会回答只是为了让下一个人不会偶然发现一个未回答的问题。
您的代码工作正常,它解密 AES.CBC 加密数据正确,问题在于您的输入 data
。
您的加密 data
字符串应该如下所示:
80b7c4881334675693ef9c95259e70b24d0736e98f8424233d5e37f353261c2a589287bc3f675449f7d8ed4e2289a4c06b22d7f83efc09cfb72abe3a76e193a8efbdc968232d29b9b58135bfa24d51e60e34791f652a0aa806d0be7734dd61a930a30c99f31f08740cdb182af07b19d5b4274deb958d984b3ccb9d6e2be0cfa3a026dd6b734dbf1dd3635bc7bcceface9c55dfb9455ca834a6dbd1aa0f3c23923ce6aeba59acbc80d681fee73487b9004496540830d44102b94e35eac291c4e3b8c9ac168ae799e46cde45ee652415ae69992d0f7527045fd42b82e9e6946cfb2dbcc3b93f19ff0e5035ab12250f7a917975b2f7c069cbd8a0ba0d94b318634a
此示例才能正常工作。
您使用的密钥不是十六进制字符串,而是文本字符串。您的在线示例不再有效,但我在尝试了几次后弄明白了。
如果更改以下行:
var _key = CryptoJS.enc.Hex.parse(key);
至:
var _key = CryptoJS.enc.Utf8.parse(key);
您的代码示例将适用于您的原始数据字符串。
当您在 http://aes.online-domain-tools.com/ 上解密文本时,您可能选择了明文文本框而不是十六进制作为您的密钥输入。
我正在尝试使用包 crypto-js 制作一个 JavaScript 函数来解码 AES(CBC 模式)。
我在在线解码工具中输入了数据并正确解密,所以我确定以下数据是正确的,但我无法通过JavaScript重现它。
这里是在线解密(所以我确定数据,密钥,iv是正确的):http://aes.online-domain-tools.com/link/deb718giF4dUxZylq/
我使用 crypto-js@3.1.8 的代码:
// 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 数据
解码后的字符串应该是:(link不重要)
https://emogo-media-testing.s3.amazonaws.com/1503342403787_blob?AWSAccessKeyId=AKIAI5MUDCK6XYWKGAKA&Expires=1534882403&Signature=t1PFesQuOpOlIMKoOqje%2Bs7I%2Fhg
如有任何提示,我们将不胜感激。谢谢!
我知道你问这个问题已经有一段时间了,但我会回答只是为了让下一个人不会偶然发现一个未回答的问题。
您的代码工作正常,它解密 AES.CBC 加密数据正确,问题在于您的输入 data
。
您的加密 data
字符串应该如下所示:
80b7c4881334675693ef9c95259e70b24d0736e98f8424233d5e37f353261c2a589287bc3f675449f7d8ed4e2289a4c06b22d7f83efc09cfb72abe3a76e193a8efbdc968232d29b9b58135bfa24d51e60e34791f652a0aa806d0be7734dd61a930a30c99f31f08740cdb182af07b19d5b4274deb958d984b3ccb9d6e2be0cfa3a026dd6b734dbf1dd3635bc7bcceface9c55dfb9455ca834a6dbd1aa0f3c23923ce6aeba59acbc80d681fee73487b9004496540830d44102b94e35eac291c4e3b8c9ac168ae799e46cde45ee652415ae69992d0f7527045fd42b82e9e6946cfb2dbcc3b93f19ff0e5035ab12250f7a917975b2f7c069cbd8a0ba0d94b318634a
此示例才能正常工作。
您使用的密钥不是十六进制字符串,而是文本字符串。您的在线示例不再有效,但我在尝试了几次后弄明白了。
如果更改以下行:
var _key = CryptoJS.enc.Hex.parse(key);
至:
var _key = CryptoJS.enc.Utf8.parse(key);
您的代码示例将适用于您的原始数据字符串。
当您在 http://aes.online-domain-tools.com/ 上解密文本时,您可能选择了明文文本框而不是十六进制作为您的密钥输入。