gpt4 book ai didi

node.js - 解密 AES256 密码时出现错误 "wrong final block length"

转载 作者:太空宇宙 更新时间:2023-11-03 22:44:11 28 4
gpt4 key购买 nike

我面临着与 this thread 中提到的完全相同的问题同时使用 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"

谁能告诉我如何解决这个问题?我已经尝试过线程中提到的解决方案,但没有一个对我有用。

更新:

我已经尝试过线程中提到的解决方案,但没有一个对我有用。我认为对此可能有一种不同的解决方案,因此,与其污染现有线程,不如决定创建一个新线程。另外,如果我在现有线程上继续此操作,可能会使 future 的候选人感到困惑,无法找到正确的解决方案。

更新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 数据库中字段的 getter 和 setter。我认为这样做不会造成任何问题,但我仍然认为提及这一点是个好主意。

更新3:

我正在尝试加密 Facebook 访问 token 并解密加密的 Facebook 访问 token 。

要重现该错误,您可以尝试加密此 token :

ASDFGHJKLO0cBACJDJoc25hkZAzcOfxhTBVpHRva4hnflYEwAHshZCi2qMihYXpS2fIDGsqAcAlfHLLo273OWImZAfo9TMYZCbuZABJkzPoo4HZA8HRJVCRACe6IunmBSMAEgGVv8KCLKIbL6Gf7HJy9PplEni2iJ06VoZBv0fKXUvkp1k7gWYMva1ZAyBsWiDiKChjq3Yh1ZCdWWEDRFGTHYJ

加密工作正常,您将得到一个加密的字符串。

现在尝试解密您在上一步中获得的加密字符串。您将收到错误消息。

最佳答案

在撰写本文时,这个问题已经有两年了,但它有很多观点,所以我希望这个答案对可能遇到它的人仍然有用。

这里的问题是 encryptText 工作正常,但它没有返回字符串。它返回一个BufferdecryptText 需要一个字符串,而不是 Buffer,因此它会尝试像 Buffer 一样读取它,并且您会收到错误消息已收到。

这是一个简单的修复。我们只需在加密文本时将 Buffer 序列化为字符串,并在解密文本时将收到的加密字符串反序列化即可。

在此示例中,我使用 base64 编码,因为它在表示二进制数据时相当紧凑。

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)
return Buffer.concat([
cipher.update(text),
cipher.final()
]).toString('base64') // Output base64 string
}

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, 'base64'), // Expect `text` to be a base64 string
decipher.final()
]).toString()
}

var encrypted = encryptText('text') // 8xXuS7jLG6crqJFHHB5J5A==
var decrypted = decryptText(encrypted) // text

关于node.js - 解密 AES256 密码时出现错误 "wrong final block length",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32038267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com