【问题标题】:Node.js crypto.publicEncrypt: 'Error: error:0906D06C:PEM routines:PEM_read_bio:no start line'Node.js crypto.publicEncrypt:'错误:错误:0906D06C:PEM 例程:PEM_read_bio:没有开始行'
【发布时间】:2018-12-22 23:16:38
【问题描述】:

我正在尝试使用 crypto.js 中的公钥加密,我想使用 publicEncrypt 加密一些消息,然后使用 privateDecrypt 解密它。

const crypto=require('crypto');
let alice=crypto.getDiffieHellman('modp14');
alice.generateKeys();
let enc=crypto.publicEncrypt(alice.getPublicKey(),Buffer.from('hello'));

但是,crypto.publicEncrypt 行导致以下错误: "错误:错误:0906D06C:PEM 例程:PEM_read_bio:no start line"

【问题讨论】:

    标签: node.js encryption public-key-encryption diffie-hellman


    【解决方案1】:

    crypto.DiffieHellman.getPublicKey() 返回的公钥值只是原始的 DH 编号,可选择以 base64 或十六进制编码。它不是(任何)PEM 格式,甚至不是 ASN.1/DER 格式(可以很容易地转换为 PEM)。同样,crypto.ECDH.getPublicKey() 只是要点(在传统的 X9.62 格式中),而不是任何 PEM 或 DER 格式。

    此外,DH 和 ECDH 不是加密算法,它们是密钥协商(或秘密协商)算法,该操作分别由 DiffieHellman.computeSecret()ECDH.computeSecret() 执行。虽然没有明确记录,publicEncrypt 实际上调用了 OpenSSL 的 EVP_PKEY_encrypt{_init,},它不支持 DH 或 ECDH,只有 RSA(有多种填充选择)和可能的 GOST-wrap(我无法轻易验证,它很可能是版本相关,因为几年前上游的 OpenSSL 1.1.0 放弃了 GOST 算法)。

    简而言之,你不能那样做。

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 2016-06-26
      • 2011-04-05
      • 2018-09-03
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多