aes - crypto-js 从十六进制解密

标签 aes cryptojs

我正在尝试使用 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/

相关文章:

android - AES 加密数据库条目大小

javascript - Crypto-js 本地端到 php 服务器端

Node.js Crypto 类返回更新版本的不同结果

javascript - 如何使用aes-128-cbc算法实现CryptoJS解密?

c# - 加密 QRCode 有效负载,输入长度与输出长度相同

javascript - 是使用 AES 或 SHA256 的 sjcl.encrypt

encryption - 从文件中查找加密算法

javascript - 客户端 JavaScript 中的 HMAC 和身份欺骗

node.js - 如何使用 cryptoJS 或 Node 的默认加密为 AES 选择密码?

java - 在 android 中遵循与 CryptoJS 中开发的相同的加密