有没有一种方法可以从散列的密钥秘密中创建AES密码?

时间:2019-04-23 14:58:28

标签: node.js cryptography aes

已经失去了明文秘密,但是拥有哈希密钥,可以像这样(在密钥和iv都不是真正的密钥)中在openssl中进行加密和解密:

输入:

printf "ciphertext" | base64 -d | openssl enc -aes-256-cbc -d -nosalt -K "0000000000000000000000000000000000000000000000000000000000000000" -iv "00"

输出:

“纯文本”

现在,为了能够在NodeJs应用程序中执行此操作,openssl被称为child_process。您可以猜到,生成openssl调用的效果不是很好。

要能够在节点加密中执行此操作,在创建密钥时需要使用明文“秘密”。

您是否可以通过哈希密钥生成密码?

我尝试这样做,但没有成功。

var crypto=require('crypto')
var iv = Buffer.alloc(16, 0);
var key = '0000000000000000000000000000000000000000000000000000000000000000'
var cipher=crypto.createDecipher('aes-256-cbc', newBuffer(key).toString('binary'), new Buffer('0000000000000000', 'hex').toString('binary'));
var enc = cipher.update("ciphertext", 'base64', 'utf8')
enc += cipher.final('utf8')
console.log(enc);

输出:

internal/crypto/cipher.js:164
  const ret = this._handle.final();
                           ^
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

1 个答案:

答案 0 :(得分:2)

尝试

boutDlg: aboutDialog {}  // does not work...

键和和

new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')

IV。当前,您正在编码为字节的二进制字符串表示形式,而不是(仅仅)将十六进制值分别解码为32个字节和16个字节。

要使用此功能,您应该使用new Buffer('00000000000000000000000000000000', 'hex') ,因为createDecipheriv仍会使用密码生成密钥。