【问题标题】:Is there a way to create an AES cipher from a hashed key-secret?有没有办法从散列密钥创建 AES 密码?
【发布时间】:2019-04-23 14:58:28
【问题描述】:

丢失了明文秘密,但有了散列密钥,可以像这样在 openssl 中加密和解密(密钥和 iv 不是实际的):

输入:

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

【问题讨论】:

    标签: node.js cryptography aes


    【解决方案1】:

    试试

    new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
    

    对于键和

    new Buffer('00000000000000000000000000000000', 'hex')
    

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

    要使用它,您应该使用createDecipheriv,因为createDecipher 仍将使用密码生成密钥。

    【讨论】:

    • 它像这样从节点到节点工作,但不是从openssl到节点。我会继续努力的,谢谢。
    • 检查是否只是初始块错误,IV也被导出,当从密码导出密钥(和IV)时它没有设置为全零。一个问题:您需要保存它,因为您无法从密钥和密文中重新计算它。
    • IV 类似于“9A00000000000000”,它实际上不是全 0,但仍然,iv 似乎无关紧要,因为无论使用、不使用或使用不同的 iv,我都会获得相同的加密输出。
    • 我终于分别使用 createCipheriv 和 createDecipheriv 做到了。非常感谢。
    • iv 没有任何作用,如果它不在 createDecipheriv 之内,至少我是这样得出结论的。
    最近更新 更多