首页 > 解决方案 > Node.js crypto.publicEncrypt:'错误:错误:0906D06C:PEM 例程:PEM_read_bio:没有开始行'

问题描述

我正在尝试使用 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.jsencryptionpublic-key-encryptiondiffie-hellman

解决方案


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

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

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


推荐阅读