Crypto.js 用字节数组中的密钥和 iv(向量)解密

Posted

技术标签:

【中文标题】Crypto.js 用字节数组中的密钥和 iv(向量)解密【英文标题】:Crypto.js decrypt with key and iv (vector) in byte arrays 【发布时间】:2016-02-13 02:54:56 【问题描述】:

我必须解密一些 AES 加密的字符串。

示例加密字符串:129212143036071008133136215105140171136216244116

我有一个密钥,以及一个以字节数组格式提供给我的向量 (iv):

键:[ 123, 217, 20, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 115, 222, 209, 241, 24, 175, 144, 175, 53, 196、29、24、23、17、218、131、226、53、209]

向量 (iv): [ 146, 66, 191, 151, 23, 3, 113, 119, 231, 131, 133, 112, 79, 32, 114, 136 ]

我应该能够解密字符串并得到:

正确的输出:testtest

我正在尝试使用 Crypto.js,但找不到使用提供的密钥和向量的方法。我找不到将字节数组转换为十六进制的方法。

var encrypted = '129212143036071008133136215105140171136216244116';
var key = CryptoJS.enc.Hex.parse([ 123, 217, 20, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 115, 222, 209, 241, 24, 175, 144, 175, 53, 196, 29, 24, 23, 17, 218, 131, 226, 53, 209 ]);
var iv  = CryptoJS.enc.Hex.parse([ 146, 66, 191, 151, 23, 3, 113, 119, 231, 131, 133, 112, 79, 32, 114, 136 ]);

var decrypted = CryptoJS.AES.decrypt(encrypted, key,  iv: iv );

console.log('Output: '+decrypted.toString(CryptoJS.enc.Utf8)); //Should be "testtest"

如果有人能告诉我如何使用密钥和向量与 Crypto.js 或任何其他 js 方法解密示例字符串,我将不胜感激。

非常感谢您的帮助, 亲切的问候

【问题讨论】:

请参阅***.com/a/311179/152640 或***.com/a/9855338/152640 以获得相关问题中的字节数组到十六进制 你的密文确实有问题。所有字符都是 0 到 9,所以它可能不是十六进制编码的,因为 AES 密文真的很嘈杂,确实应该有一些字符在 A 到 F 范围内。另外,如果假设 CBC 模式和十六进制编码,则密文长度无效。 【参考方案1】:

我无法解密您的原始字符串,但我可以成功地使用它来加密和解密新字符串。在您的初始实现中,aes.js 中发生错误,因为它期望 keyiv 是字符串而不是数组。我已经更正了下面的代码示例:

//var encrypted = '129212143036071008133136215105140171136216244116';

var key = CryptoJS.enc.Hex.parse(CryptoJS.lib.ByteArray([123, 217, 20, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 115, 222, 209, 241, 24, 175, 144, 175, 53, 196, 29, 24, 23, 17, 218, 131, 226, 53, 209]));
var iv = CryptoJS.enc.Hex.parse(CryptoJS.lib.ByteArray([146, 66, 191, 151, 23, 3, 113, 119, 231, 131, 133, 112, 79, 32, 114, 136]));

var  message = 'testest'
var encrypted =  CryptoJS.AES.encrypt(message, key, 
  'iv': iv
);


var decrypted = CryptoJS.AES.decrypt(encrypted, key, 
  'iv': iv
);
document.write('Output: ' + decrypted.toString(CryptoJS.enc.Utf8)); //Should be "testtest"
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/pad-nopadding-min.js"></script>
<script src="https://greasyfork.org/scripts/6696-cryptojs-lib-bytearray/code/CryptoJSlibByteArray.js"></script>

【讨论】:

感谢您的回答。它确实有帮助,但不幸的是我无法解密我必须解密的字符串。我找到了一个非 js 解决方案 - 请参阅下面的答案。我认为您的回答是正确的,因为您向我展示了如何将字节数组转换为十六进制,所以非常感谢! 看看你在那里做了什么......覆盖了var encrypted,然后以你的方式加密解密。尽管不这样做,但应该投反对票。 @jeet.chanchawat,正如帖子中提到的,我无法解密原始字符串,因此给出了一个加密/解密示例。我同意你的观点,这是令人困惑的,因此注释掉了第一个作业。我也会尝试让这个 sn-p 再次工作,我注意到它目前正在失败。 这是一个公认的答案吗?我正在运行完全相同的问题。问题是,我无法访问 encrypt() 返回的对象,我只有字节(以 base64 字符串的形式)。我无法转换为 utf-8,因为它不是 utf-8 字符串,所以这也无济于事。为什么它不接受 WordArray 或 ByteArray? 啊,刚刚找到答案了!在下面发布一个单独的答案。【参考方案2】:

我最终使用了一个 .net ashx 通用处理程序,我通过 ssl 将数据发布到该处理程序,并使用 simpleAES 类进行服务器端解密。 这个类使用块大小作为参数,这似乎有所作为,使用这种方法我能够解密我需要的所有字符串。

更多关于 simpleAES 的信息在这里:https://github.com/huanlin/YetAnotherLibrary/blob/master/Source/Yalib/Cryptography/SimpleAes.cs

再次感谢您的帮助!

【讨论】:

【参考方案3】:

有点旧的帖子,我认为 API 从那时起发生了一些变化,因为它现在使用 WordArray 而不是 ByteArray。

但我遇到了同样的问题。事实证明,您可以简单地将 base64 编码的字符串提供给 decrypt()。因此,您需要做的就是从原始消息创建一个 base64 编码的字符串。我不确定你的消息现在是什么格式,但我会假设它是一个十六进制字符串。

var origCipher = "129212143036071008133136215105140171136216244116"; // is this supposed to be a hex string?
var origKey = [ 123, 217, 20, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 115, 222, 209, 241, 24, 175, 144, 175, 53, 196, 29, 24, 23, 17, 218, 131, 226, 53, 209 ];
var origIV = [ 146, 66, 191, 151, 23, 3, 113, 119, 231, 131, 133, 112, 79, 32, 114, 136 ];

var key = CryptoJS.lib.WordArray.create(new UInt8Array(origKey));
var iv = CryptoJS.lib.WordArray.create(new UInt8Array(origIV));
var cipher = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(origCipher));

var plain = CryptoJS.AES.decrypt(cipher, key,  iv: iv );
var plaintext = CryptoJS.enc.UTF8.stringify(plain);

不过,上述代码不会产生正确的结果,因此您输入的密文可能不是十六进制字符串。

【讨论】:

我爱你,几乎放弃了这项工作!

以上是关于Crypto.js 用字节数组中的密钥和 iv(向量)解密的主要内容,如果未能解决你的问题,请参考以下文章

VUE中的 AES加密和解密

基于python3和Vue实现AES数据加密

WPA2 Key Reinstallation 漏洞

什么是 openssl iv,为什么我需要密钥和 iv?

逆向算法之AES算法

如何将 IV 和密钥派生到 crypto.createCipheriv 以进行解密?