Crypto.js 用字节数组中的密钥和 iv(向量)解密
Crypto.js decrypt with key and iv (vector) in byte arrays
我必须解密一些 AES 加密的字符串。
Example encrypted string: 129212143036071008133136215105140171136216244116
我有一个密钥和一个以字节数组格式提供给我的向量 (iv):
Key: [ 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 ]
Vector (iv): [ 146, 66, 191, 151, 23, 3, 113, 119, 231, 131, 133, 112, 79, 32, 114, 136 ]
我应该能够解密字符串并得到:
Correct output: 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 方法使用密钥和向量解密示例字符串,我将不胜感激。
非常感谢您的帮助,
亲切的问候
我无法解密你的原始字符串,但我可以成功地使用它来加密和解密新字符串。在您的初始实现中,aes.js
中发生错误,因为它期望 key
和 iv
是字符串而不是数组。我已更正以下代码示例:
//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>
我最终使用了 .net ashx 通用处理程序,我 post 通过 ssl 向其传输数据,并使用 simpleAES class 进行服务器端解密。
class 使用块大小作为参数,这似乎有所不同,使用这种方法我能够解密我需要的所有字符串。
有关简单 AES 的更多信息,请点击此处:https://github.com/huanlin/YetAnotherLibrary/blob/master/Source/Yalib/Cryptography/SimpleAes.cs
再次感谢您的帮助!
有点旧 post,我认为 API 从那时起发生了一些变化,因为它现在使用 WordArray 而不是 ByteArray。
但我 运行 遇到了同样的问题。事实证明,您可以简单地向 decrypt() 提供一个 base64 编码的字符串。因此,您需要做的就是根据原始消息创建一个 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);
不过,以上代码不会产生正确的结果,因此您输入的密文可能不是十六进制字符串。
我必须解密一些 AES 加密的字符串。
Example encrypted string: 129212143036071008133136215105140171136216244116
我有一个密钥和一个以字节数组格式提供给我的向量 (iv):
Key: [ 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 ]
Vector (iv): [ 146, 66, 191, 151, 23, 3, 113, 119, 231, 131, 133, 112, 79, 32, 114, 136 ]
我应该能够解密字符串并得到:
Correct output: 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 方法使用密钥和向量解密示例字符串,我将不胜感激。
非常感谢您的帮助, 亲切的问候
我无法解密你的原始字符串,但我可以成功地使用它来加密和解密新字符串。在您的初始实现中,aes.js
中发生错误,因为它期望 key
和 iv
是字符串而不是数组。我已更正以下代码示例:
//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>
我最终使用了 .net ashx 通用处理程序,我 post 通过 ssl 向其传输数据,并使用 simpleAES class 进行服务器端解密。 class 使用块大小作为参数,这似乎有所不同,使用这种方法我能够解密我需要的所有字符串。
有关简单 AES 的更多信息,请点击此处:https://github.com/huanlin/YetAnotherLibrary/blob/master/Source/Yalib/Cryptography/SimpleAes.cs
再次感谢您的帮助!
有点旧 post,我认为 API 从那时起发生了一些变化,因为它现在使用 WordArray 而不是 ByteArray。
但我 运行 遇到了同样的问题。事实证明,您可以简单地向 decrypt() 提供一个 base64 编码的字符串。因此,您需要做的就是根据原始消息创建一个 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);
不过,以上代码不会产生正确的结果,因此您输入的密文可能不是十六进制字符串。