我在使用AES进行加密和解密时面临this thread中提到的完全相同的问题。
crypto.js:202
var ret = this._handle.final(); ^ 错误:错误:0606506D:数字包络例程:EVP_DecryptFinal_ex:错误的最终块长度
在错误(本机)
在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;
}
我已在"node": ">=0.10.0"
中设置package.json
。
谁能告诉我如何修复它?我已经尝试了线程中提到的解决方案,但它们都没有为我工作。
更新
我已经尝试了线程中提到的解决方案,但它们都没有为我工作。我认为可能有一个不同的解决方案,因此,而不是污染现有的线程,决定创建一个新的。此外,如果我在现有线程上继续这样做,可能会混淆未来候选人的正确解决方案。
更新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访问令牌并解密加密的Facebook访问令牌。
要重现错误,您可以尝试加密此令牌:
ASDFGHJKLO0cBACJDJoc25hkZAzcOfxhTBVpHRva4hnflYEwAHshZCi2qMihYXpS2fIDGsqAcAlfHLLo273OWImZAfo9TMYZCbuZABJkzPoo4HZA8HRJVCRACe6IunmBSMAEgGVv8KCLKIbL6Gf7HJy9PplEni2iJ06VoZBv0fKXUvkp1k7gWYMva1ZAyBsWiDiKChjq3Yh1ZCdWWEDRFGTHYJ
加密工作正常,您将获得加密字符串。
现在尝试解密您在上一步中获得的加密字符串。你会收到错误。
答案 0 :(得分:1)
这个问题在撰写本文时已有两年了,但它有很多观点,所以我希望这个答案对于可能遇到它的人来说仍然有用。
这里的问题是encryptText
工作正常,但它没有返回字符串。它返回Buffer
。 decryptText
期待一个字符串,而不是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