gpt4 book ai didi

node.js - EVP_DecryptFinal_ex :bad decrypt when using Node. js

转载 作者:搜寻专家 更新时间:2023-10-31 22:23:45 24 4
gpt4 key购买 nike

使用以下 Node js:

var crypto = require('crypto');
var encrypt = function (input, password, callback) {
var m = crypto.createHash('md5');
m.update(password);
var key = m.digest('hex');

m = crypto.createHash('md5');
m.update(password + key);
var iv = m.digest('hex');
console.log(iv);

var data = new Buffer(input, 'utf8').toString('binary');

var cipher = crypto.createCipheriv('aes-256-cbc', key, iv.slice(0,16));
var encrypted = cipher.update(data, 'binary') + cipher.final('binary');
var encoded = new Buffer(encrypted, 'binary').toString('base64');
callback(encoded);
};

var decrypt = function (input, password, callback) {
// Convert urlsafe base64 to normal base64
input = input.replace(/\-/g, '+').replace(/_/g, '/');
// Convert from base64 to binary string
var edata = new Buffer(input, 'base64').toString('binary');

// Create key from password
var m = crypto.createHash('md5');
m.update(password);
var key = m.digest('hex');

// Create iv from password and key
m = crypto.createHash('md5');
m.update(password + key);
var iv = m.digest('hex');

// Decipher encrypted data
var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv.slice(0,16));
var decrypted = decipher.update(edata, 'binary') + decipher.final('binary');
var plaintext = new Buffer(decrypted, 'binary').toString('utf8');

callback(plaintext);
};

为了执行,我运行了这个:

encrypt("uWeShxRrCKyK4pcs", "secret", function (encoded) {
console.log(encoded);
decrypt(encoded, "secret", function (output) {
console.log(output);
});
});

加密似乎工作正常,但当我尝试解密时,我收到以下错误:

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt at Error (native) at Decipheriv.Cipher.final (crypto.js:202:26)

我是密码学的新手,所以不知道为什么会收到此错误。我只需要暂时修复它。

最佳答案

您混淆了两种不同的编码。见

cipher.update(data[, input_encoding][, output_encoding])

cipher.final([output_encoding])

现在看看

var encrypted = cipher.update(data, 'binary') + cipher.final('binary');

这里的方括号表示一个可选的函数输入。如果您传递的值多于所需的值,那么额外的值将与左侧的可选输入相匹配。

应该是

var encrypted = cipher.update(data, 'binary', 'binary') + cipher.final('binary');

问题是 cipher.update(data, 'binary') 输出的缓冲区会自动字符串化为十六进制编码的字符串,而不是“二进制”字符串。


无论如何,这段代码有太多错误,您应该重新开始并简单地使用一个高度自以为是的现有库。

  • 为了达到语义安全,您必须有一个随机 IV,它被添加到密文之前。

  • 密码的熵很低,不能用作 key 。一次 MD5 调用不会改变这一事实。从密码派生 key 应该很慢,因此请使用具有高迭代次数/成本因素的已知方案,例如 PBKDF2、bcrypt、scrypt 或 Argon2(提高安全性)。别忘了盐。

  • 在先加密后 MAC 方案中使用消息验证码(例如 HMAC-SHA256)验证您的密文。否则,攻击者可能会操纵密文,而您甚至无法检测到更改。使用填充 oracle 攻击丢失数据的第一步。

关于node.js - EVP_DecryptFinal_ex :bad decrypt when using Node. js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37997354/

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