gpt4 book ai didi

node.js - 为什么我不能用 NodeJS 解密我用 openssl 加密的文件?

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

我使用命令行加密了一个文件

openssl aes-256-cbc -in /tmp/text.txt -out /tmp/text.crypt

然后我尝试使用以下 JavaScript 代码对其进行解密:

crypto        = require( 'crypto' );
cipher_name = 'aes-256-cbc';
password = '*';
decoder = crypto.createDecipher( cipher_name, password );
text_crypt = njs_fs.readFileSync( '/tmp/text.crypt' );
chunks = [];
chunks.push decoder.update( text_crypt, 'binary' );
chunks.push decoder.final( 'binary' );
text = chunks.join( '' ).toString( 'utf-8' );

这失败了

TypeError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

我做错了什么?

最佳答案

密码学很有趣。这是解密使用 openssl 和 salt 加密的文件的代码。

var crypto = require('crypto');

function md5(data) {
var hash = crypto.createHash('md5');
hash.update(data);
return new Buffer(hash.digest('hex'), 'hex');
}

var text = require('fs').readFileSync('text.crypt');
var salt = text.slice(8, 16);
var cryptotext = text.slice(16);
var password = new Buffer('*');

var hash0 = new Buffer('');
var hash1 = md5(Buffer.concat([ hash0, password, salt ]));
var hash2 = md5(Buffer.concat([ hash1, password, salt ]));
var hash3 = md5(Buffer.concat([ hash2, password, salt ]));
var key = Buffer.concat([ hash1, hash2 ]);
var iv = hash3;

var decoder = crypto.createDecipheriv('aes-256-cbc', key, iv);

var chunks = [];
chunks.push(decoder.update(cryptotext, "binary", "utf8"));
chunks.push(decoder.final("utf8"));
console.log(chunks.join(''));

更新:关于什么是 cbc 模式以及 openssl 工作原理的更多详细信息

如果您查看 cipher-block chaining mode 中的流密码work 你会注意到密码需要两个初始值才能开始加密数据:初始化向量 (iv) 和 key 。重要的是,初始化向量的大小应等于 block 大小, key 大小取决于算法,对于 AES-256,它是 256 位长。

但用户不想设置 256 位随 secret 码来访问他们的数据。这就提出了一个问题,即如何根据用户输入构造 key 和 iv,而 openssl 通过将 EVP_BytesToKey 函数应用于用户输入来解决这个问题,这实际上是多次将 MD5 应用于密码和盐。

可以通过执行查看派生值

C:\Tools\wget>openssl enc -aes-256-cbc -P
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
salt=A94B7976B2534923
key=C8B806C86E60ED664B9C369628D1A78260753580D78D09EAEC04EAC1535077C3
iv =7B6FB26EB62C34F04F254A0C4F4F502A

这里的参数“key”和“iv”是密码的输入参数,盐是随机化密文所必需的,因此对于相同的数据它不会相同。

openssl在文件中保存数据如下:

Saltet__;[salt][cipher-text]

因此要对其进行解密,应执行以下步骤:

  1. 应跳过“Salted”前缀
  2. 应读取 8 个字节的输入并将其保存为盐
  3. 应该从密码和盐中构造 key 和iv
  4. 文件的其余部分应使用计算出的 key 和 iv 应用 AES-256-CBC 解密器解密

上面的代码执行这些步骤并解密文件。

关于node.js - 为什么我不能用 NodeJS 解密我用 openssl 加密的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19938470/

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