使用这个 Gist ,我能够成功解密 Node.js 0.8.7 中的 AES256。然后当我升级到 Node.js 0.10.24 时,我现在看到了这个错误:
TypeError:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:错误的最终块长度
在 Decipheriv.Cipher.final (crypto.js:292:27)
这是来自 Gist 的解密代码(为方便起见,此处显示):
var crypto = require('crypto');
var AESCrypt = {};
AESCrypt.decrypt = function(cryptkey, iv, encryptdata) {
encryptdata = new Buffer(encryptdata, 'base64').toString('binary');
var decipher = crypto.createDecipheriv('aes-256-cbc', cryptkey, iv),
decoded = decipher.update(encryptdata);
decoded += decipher.final();
return decoded;
}
AESCrypt.encrypt = function(cryptkey, iv, cleardata) {
var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv),
encryptdata = encipher.update(cleardata);
encryptdata += encipher.final();
encode_encryptdata = new Buffer(encryptdata, 'binary').toString('base64');
return encode_encryptdata;
}
var cryptkey = crypto.createHash('sha256').update('Nixnogen').digest(),
iv = 'a2xhcgAAAAAAAAAA',
buf = "Here is some data for the encrypt", // 32 chars
enc = AESCrypt.encrypt(cryptkey, iv, buf);
var dec = AESCrypt.decrypt(cryptkey, iv, enc);
console.warn("encrypt length: ", enc.length);
console.warn("encrypt in Base64:", enc);
console.warn("decrypt all: " + dec);
原文由 Justin Cloud 发布,翻译遵循 CC BY-SA 4.0 许可协议
好的,所以在从 0.8 到 0.10 的切换中对 Crypto 进行了更改 Crypto 方法默认返回 Buffer 对象,而不是二进制编码的字符串
这意味着上面的代码需要指定编码。
这四行:
改为:
这对我有用,但我愿意接受其他建议。