Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Crypto.js在字节数组中使用密钥和iv(向量)进行解密_Javascript_Encryption_Hex_Bytearray_Cryptojs - Fatal编程技术网

Javascript Crypto.js在字节数组中使用密钥和iv(向量)进行解密

Javascript Crypto.js在字节数组中使用密钥和iv(向量)进行解密,javascript,encryption,hex,bytearray,cryptojs,Javascript,Encryption,Hex,Bytearray,Cryptojs,我必须解密一些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、11

我必须解密一些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方法使用密钥和向量解密示例字符串,我将不胜感激

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

我无法解密您的原始字符串,但我可以成功地使用它对新字符串进行加密和解密。在初始实现中,
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、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消息='testest'
var encrypted=CryptoJS.AES.encrypt(消息、密钥、{
“四”:四
});
var decrypted=CryptoJS.AES.decrypt(加密,密钥{
“四”:四
});
document.write('Output:'+decrypted.toString(CryptoJS.enc.Utf8))//应该是“testtest”

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

有关SimpleA的更多信息,请参见此处:


再次感谢你的帮助

这是一篇老文章,我认为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);

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

请参阅或了解相关so问题中十六进制的字节数组。您的密文确实有问题。所有字符都是0到9,所以它可能不是十六进制编码的,因为AES密文非常嘈杂,应该有一些字符在A到F范围内。另外,如果采用CBC模式和十六进制编码,则密文长度无效。谢谢您的回答。这真的很有帮助,但不幸的是我无法让它解密我必须解密的字符串。我找到了一个非js的解决方案——下面是我的答案。我认为您的答案是正确的,因为您向我展示了如何将字节数组转换为十六进制,所以非常感谢您!看看你在那里做了什么。。。覆盖
var加密的
,然后按您的方式进行加密解密。值得投反对票,尽管没有这样做。@jeet.chanchawat,正如我在帖子中提到的,我无法解密原始字符串,因此给出了一个加密/解密示例。我同意你的观点,这是令人困惑的,因此我已经注释掉了第一个作业。我也会尝试让这段代码再次运行,我注意到它现在失败了。这是一个如何被接受的答案?我正在处理同一个问题。问题是,我没有访问encrypt()返回的对象的权限,我只有字节(以base64字符串的形式)。我无法转换为utf-8,因为它不是utf-8字符串,所以这也没有帮助。为什么它不接受WordArray或ByteArray?啊,刚刚找到答案!在下面贴一个单独的答案。我爱你,在几乎放弃这个工作之后!
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);