当前位置: 首页 > 面试题库 >

使用node.js解密AES256返回错误的最终块长度

商辰钊
2023-03-14
问题内容

使用此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);

问题答案:

好的,因此将Crypto从0.8更改为0.10时,Crypto方法默认返回Buffer对象,而不是二进制编码的字符串

这意味着以上代码需要指定编码。

这四行:

decoded = decipher.update(encryptdata);
decoded += decipher.final();
encryptdata = encipher.update(cleardata);
encryptdata += encipher.final();

更改为:

decoded = decipher.update(encryptdata, 'binary', 'utf8');
decoded += decipher.final('utf8');
encryptdata = encipher.update(cleardata, 'utf8', 'binary');
encryptdata += encipher.final('binary');

这对我有用,但我愿意接受其他建议。



 类似资料:
  • 有很多关于堆栈溢出的线程与这个主题,总是相同的解决方案,但这些对我不起作用。我正在寻找一种方法来解密值encrypted并返回decodedbytes。 使用Aescrypt方法。我使用 对于值密码,我是这样使用的。 我尝试放入Cipher.getInstance(aes/cbc/nopadding,aes/cbc/pkcs5padding,aes/cbc/pkcs7padding),但没有任何改

  • 我想Node.js读取form.html当域名localhost:3000/form,但由于某种原因,它总是给我一个错误500页。 fs.readFile的回调函数中的content参数未定义,即使文件的路径正确。 添加了错误消息: {[Error:enoint,打开'C:\form.html']errno:34,代码:'enoint',路径:'C:\form.html'} 我必须指定文件的完整路

  • 我已经尝试了谷歌和SOF上的几种不同的方法,但我似乎无法让它起作用。我正在尝试用PHP加密一个字符串,用Java解密(Android活动)。在PHP中,为了加密字符串,我使用AES-256-CBC和sha256散列(它在PHP中成功地加密/解密)。问题是无论我尝试什么,我都无法获得Java中未加密的字符串。我最近的尝试以“cipher functions:openssl_internal:wron

  • 请帮助我识别以下RSA加密代码中的问题

  • 问题内容: 我正在使用3DESC解密数据,但出现以下异常 我的代码: 打印上面使用的所有字节数组 问题答案: DES- EDE密码可与3个不同的子密钥一起使用,因此密钥大小应为24字节(3乘8字节)。如果您只想使用2个键(即在此模式下,第一个键==最后一个键),则只需复制键数组的前8个字节。