Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.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 尝试解码AES-128-CBC密文时获取空字符串_Javascript_Aes_Cryptojs - Fatal编程技术网

Javascript 尝试解码AES-128-CBC密文时获取空字符串

Javascript 尝试解码AES-128-CBC密文时获取空字符串,javascript,aes,cryptojs,Javascript,Aes,Cryptojs,即使我确信我有正确的数据(通过在线解码器验证),我也只得到空字符串作为解码器的输出 这是我的javascript: var cipher = CryptoJS.enc.Base64.parse(data.split("--")[0]); var inv = CryptoJS.enc.Base64.parse(data.split("--")[1]); console.log("Ciphertext"); console.log(cipher);

即使我确信我有正确的数据(通过在线解码器验证),我也只得到空字符串作为解码器的输出

这是我的javascript:

var cipher  = CryptoJS.enc.Base64.parse(data.split("--")[0]);
var inv     = CryptoJS.enc.Base64.parse(data.split("--")[1]);

console.log("Ciphertext");
console.log(cipher);                             // as word array
console.log(CryptoJS.enc.Hex.stringify(cipher)); // as hex string
console.log("IV");
console.log(inv);                                // as word array
console.log(CryptoJS.enc.Hex.stringify(inv));    // as hex string

// don't worry, this key won't be used in production ;-)
var key = CryptoJS.enc.Utf8.parse("GzUaLsk7SI9VDja3");
var decrypted = CryptoJS.AES.decrypt(cipher, key, { iv: inv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });

console.log(decrypted);

decrypted = decrypted.toString(CryptoJS.enc.Utf8);
console.log(decrypted);
数据
是一个带有密文和IV的字符串,都是Base64编码的,由2个破折号(“--”)分隔

我将密文和IV的十六进制表示粘贴到中,以验证我的数据是否正确,从而得到所需的结果


有人能帮我解释一下为什么我从decrypt函数中得到空字符串(以及空单词数组)吗?顺便说一句,这段代码没有任何错误。

正如我所料,问题不在于填充。以下是工作代码:

var cipher = CryptoJS.enc.Base64.parse(data.split("--")[0]);
var inv    = CryptoJS.enc.Base64.parse(data.split("--")[1]);

var key = CryptoJS.enc.Utf8.parse("GzUaLsk7SI9VDja3");
var aesDecryptor = CryptoJS.algo.AES.createDecryptor(key, { iv: inv });

var decrypted = aesDecryptor.process(cipher);
var plaintext = decrypted.toString(CryptoJS.enc.Utf8);

正如我所料,问题不在于填充物。以下是工作代码:

var cipher = CryptoJS.enc.Base64.parse(data.split("--")[0]);
var inv    = CryptoJS.enc.Base64.parse(data.split("--")[1]);

var key = CryptoJS.enc.Utf8.parse("GzUaLsk7SI9VDja3");
var aesDecryptor = CryptoJS.algo.AES.createDecryptor(key, { iv: inv });

var decrypted = aesDecryptor.process(cipher);
var plaintext = decrypted.toString(CryptoJS.enc.Utf8);

最合乎逻辑的原因是明文是空的。在这种情况下,您将得到一个仅包含填充的密文块。始终应用PKCS#7填充。尝试使用
CryptoJS.pad.NoPadding
并向我们显示“hexified”解密结果…感谢您的评论。明文显然不应该是空的。当前的输出是一个空单词列表,因此我认为显示十六进制形式没有任何意义;-)问题:如果你的问题得到回答,有没有一个明确的原因可以解释为什么会有公开的悬赏?是的:除了我自己,没有人回答这个问题,我也不能给自己悬赏。最合乎逻辑的原因是明文是空的。在这种情况下,您将得到一个仅包含填充的密文块。始终应用PKCS#7填充。尝试使用
CryptoJS.pad.NoPadding
并向我们显示“hexified”解密结果…感谢您的评论。明文显然不应该是空的。当前的输出是一个空单词列表,因此我认为显示十六进制形式没有任何意义;-)问题:如果你的问题得到回答,为什么会有悬赏?是的:除了我自己,没有人回答这个问题,我不能给自己悬赏。救生员!你唯一错过的就是对AES解密程序的“finalize”调用。如果不调用finalize,将丢失最后一个加密块。我正在修改它。谢谢你的贡献!如果我的回答对你有帮助,请考虑我的回答;已经做了。TBH,我不敢相信这不会有更多的投票,因为没有这一点,我可能仍然会被困在这个问题上。救命恩人!你唯一错过的就是对AES解密程序的“finalize”调用。如果不调用finalize,将丢失最后一个加密块。我正在修改它。谢谢你的贡献!如果我的回答对你有帮助,请考虑我的回答;已经做了。TBH,我不敢相信这不会有更多的投票,因为没有这一点,我可能仍然会被困在这个问题上。