2

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

这是我的 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);

data是一个带有密文和 IV 的字符串,均采用 Base64 编码,由 2 个破折号 ('--') 分隔。

我将密文和 IV 的十六进制表示粘贴到这个工具中,以验证我的数据是否正确,这给了我想要的结果。

有人可以帮我解释为什么我从解密函数中得到空字符串(和空字数组)吗?顺便说一句,这段代码我根本没有收到任何错误。

4

1 回答 1

4

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

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);
于 2013-09-15T13:14:50.503 回答