Node.js crypto.publicEncrypt: 'Error: error:0906D06C:PEM routines:PEM_read_bio:no start line'

Node.js crypto.publicEncrypt: 'Error: error:0906D06C:PEM routines:PEM_read_bio:no start line'

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

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

但是,crypto.publicEncrypt 行导致了以下错误: "Error: error:0906D06C:PEM routines:PEM_read_bio:no start line"

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

另外,DH和ECDH不是加密算法,它们是key-agreement(或secret-agreement)算法,分别由DiffieHellman.computeSecret()ECDH.computeSecret()进行运算。尽管没有明确记录,publicEncrypt 实际上调用了 OpenSSL 的 EVP_PKEY_encrypt{_init,},它不支持 DH 或 ECDH,仅支持 RSA(有多种填充选择)和可能的 GOST-wrap(我无法轻易验证和它很可能与版本有关,因为几年前从 1.1.0 开始的上游 OpenSSL 放弃了 GOST 算法。

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