我遇到了与这个帖子中提到的问题完全相同,即在使用AES加密和解密时。
crypto.js:202
var ret = this._handle.final(); ^ Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Error (native)
at Decipher.Cipher.final (crypto.js:202:26)
这是我的加密和解密函数:
var config = {
cryptkey: crypto.createHash('sha256').update('Nixnogen').digest(),
iv: "a2xhcgAAAAAAAAAA"
};
function encryptText(text){
console.log(config.cryptkey);
var cipher = crypto.createCipheriv('aes-256-cbc', config.cryptkey, config.iv);
var crypted = cipher.update(text,'utf8','binary');
crypted += cipher.final('binary');
crypted = new Buffer(crypted, 'binary').toString('base64');
return crypted;
}
function decryptText(text){
console.log(config.cryptkey);
if (text === null || typeof text === 'undefined' || text === '') {return text;};
text = new Buffer(text, 'base64').toString('binary');
var decipher = crypto.createDecipheriv('aes-256-cbc', config.cryptkey, config.iv);
var dec = decipher.update(text,'binary','utf8');
dec += decipher.final('utf8');
return dec;
}
我在我的package.json
中设置了"node": ">=0.10.0"
。
有人能告诉我如何解决这个问题吗?我已经尝试了线程中提到的解决方案,但它们都对我不起作用。
更新:
我已经尝试了线程中提到的解决方案,但它们都对我不起作用。我认为可能有一个不同的解决方案,因此决定创建一个新的线程,而不是污染现有的线程。另外,如果我在现有的线程上继续进行,可能会混淆未来的候选人的正确解决方案。
更新2:
对于线程中提到的第二个解决方案,我有以下代码,但它也给我同样的错误:
function encryptText(text){
console.log(config.cryptkey);
var cipher = crypto.createCipheriv('aes-256-cbc', config.cryptkey, config.iv);
return Buffer.concat([
cipher.update(text),
cipher.final()
]);
}
function decryptText(text){
console.log(config.cryptkey);
if (text === null || typeof text === 'undefined' || text === '') {return text;};
var decipher = crypto.createDecipheriv('aes-256-cbc', config.cryptkey, config.iv);
return Buffer.concat([
decipher.update(text),
decipher.final()
]);
}
此外,我正在使用这些函数作为mongoose中我的mongodb数据库字段的读取器和设置器。我认为这样做不会引起任何问题,但我仍然觉得提一下比较好。
更新3:
我正在尝试加密Facebook访问令牌并解密已加密的Facebook访问令牌。
要重现错误, 您可以尝试加密此令牌:
ASDFGHJKLO0cBACJDJoc25hkZAzcOfxhTBVpHRva4hnflYEwAHshZCi2qMihYXpS2fIDGsqAcAlfHLLo273OWImZAfo9TMYZCbuZABJkzPoo4HZA8HRJVCRACe6IunmBSMAEgGVv8KCLKIbL6Gf7HJy9PplEni2iJ06VoZBv0fKXUvkp1k7gWYMva1ZAyBsWiDiKChjq3Yh1ZCdWWEDRFGTHYJ
加密将正常工作,并且您将获得一个加密字符串。
现在尝试解密之前步骤中获得的加密字符串,您会收到错误提示。
crypted
的值转换为十六进制,并将其与解密前的text
进行比较,同样以十六进制表示?它们是否匹配?请使用第一个代码片段。 - Maarten Bodewes