获取错误“错误的最终块长度”解密AES256密码时 [英] Getting error "wrong final block length" when decrypting AES256 cipher

查看:955
本文介绍了获取错误“错误的最终块长度”解密AES256密码时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正面临与此线程,而使用AES加密和解密。

I'm facing exactly the same problem mentioned in this thread while encrypting and decrypting using AES.


crypto.js:202

var ret = this._handle.final();
^
错误:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:错误的最终块长度

在错误(本地)

在Decipher.Cipher.final (crypto.js:202:26)

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)

这些是我的加密和解密功能:

These are my encrypt and decrypt functions:

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

我怎么解决?我已经尝试了线程中提到的解决方案,但没有一个为我工作。

Can anyone tell me how to fix it? I have tried solutions mentioned in the thread but none of them are working for me.

更新:

我已经尝试了线程中提到的解决方案,但都没有为我工作。我认为可能有一个不同的解决方案,因此,而不是污染现有的线程,决定创建一个新的线程。此外,如果我继续在现有的线程上,可能会将未来的候选人混淆在正确的解决方案中。

I've tried solutions mentioned in the thread but none of them are working for me. I think there might be a different solution for this and hence, rather than polluting the existing thread, decided to create a new one. Also, if I continue this on the existing thread it might confuse future candidates for the right solution.

更新2:

对于线程中提到的第二个解决方案,我有以下代码,但也给出了相同的错误:

For the second solution mentioned in the thread, I have the following code, but it is also giving me the same error:

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()
    ]);
}

此外,我将这些函数用作一个字段的getter和setter我的mongodb数据库使用mongoose。我不认为这样做会造成任何问题,但我仍然认为这是一个好主意。

Also, I'm using these functions as getters and setters for a field in my mongodb database using mongoose. I don't think doing so will cause any issues, but I still thought it would be a good idea to mention this.

更新3:

我正在加密Facebook访问令牌并解密加密的Facebook访问令牌。

I'm trying to encrypt a Facebook access token and decrypt an encrypted Facebook access token.

重现错误,你可以尝试加密此令牌:

To reproduce the error, you can try encrypting this token:

ASDFGHJKLO0cBACJDJoc25hkZAzcOfxhTBVpHRva4hnflYEwAHshZCi2qMihYXpS2fIDGsqAcAlfHLLo273OWImZAfo9TMYZCbuZABJkzPoo4HZA8HRJVCRACe6IunmBSMAEgGVv8KCLKIbL6Gf7HJy9PplEni2iJ06VoZBv0fKXUvkp1k7gWYMva1ZAyBsWiDiKChjq3Yh1ZCdWWEDRFGTHYJ

ASDFGHJKLO0cBACJDJoc25hkZAzcOfxhTBVpHRva4hnflYEwAHshZCi2qMihYXpS2fIDGsqAcAlfHLLo273OWImZAfo9TMYZCbuZABJkzPoo4HZA8HRJVCRACe6IunmBSMAEgGVv8KCLKIbL6Gf7HJy9PplEni2iJ06VoZBv0fKXUvkp1k7gWYMva1ZAyBsWiDiKChjq3Yh1ZCdWWEDRFGTHYJ

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

Encryption will work fine and you will get an encrypted string.

现在尝试解密您在上一步中获得的加密字符串。你会得到错误。

Now try decrypting the encrypted string which you got in the previous step. You will get the error.

推荐答案

这个问题在撰写本文时是两岁,但是它有很多意见,所以我希望这个答案仍然可以证明对有可能遇到的人有用。

This question is two years old at the time of this writing, but it has quite a few views, so I hope this answer will still prove useful to someone who might come across it.

这里的问题是 encryptText 工作正常,但它不返回一个字符串。它返回一个缓冲区 decryptText 正在期待一个字符串,而不是一个缓冲区,所以它尝试读它,就像它是一个缓冲区,并收到您收到的错误。

The problem here is that encryptText works fine, but it's not returning a string. It's returning a Buffer. decryptText is expecting a string, not a Buffer, so it tries to read it as though it were a Buffer and you get the error that you received.

这是一个简单的修复。当我们加密文本时,我们只需要将缓冲区序列化到字符串,并解密我们在解密文本时收到的加密字符串。

This is a simple fix. We just need to serialise the Buffer to a string when we encrypt text, and deserialise the encrypted string we receive when we decrypt text.

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

In this example, I use base64 encoding because it is fairly compact when representing binary data.

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

这篇关于获取错误“错误的最终块长度”解密AES256密码时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆