crypto-js从Hex解密

时间:2017-08-28 16:36:51

标签: aes cryptojs

我正在尝试使用包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数据

解码后的字符串应为:(链接不重要)

https://emogo-media-testing.s3.amazonaws.com/1503342403787_blob?AWSAccessKeyId=AKIAI5MUDCK6XYWKGAKA&Expires=1534882403&Signature=t1PFesQuOpOlIMKoOqje%2Bs7I%2Fhg 

任何提示都表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

我知道你问了这个问题已经有一段时间了,但我会做出回应,所以下一个人不会偶然发现一个悬而未决的问题。

您的代码运行正常,它会正确解密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/上的文字时,您可能选择了明文文本框而不是十六进制用于键输入。

相关问题