我正在尝试使用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:无起始行”
答案 0 :(得分:0)
由crypto.DiffieHellman.getPublicKey()
返回的公钥值只是原始DH号,可以选择使用base64或hex进行编码。它不是(任何)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包装(我不容易验证它可能与版本有关,因为几年前的1.1.0版上游OpenSSL放弃了GOST算法。
简而言之,你不能那样做。