使用特定加密密钥调用privateEncrypt/privateDecrypt时报EVP_CIPHER参数错误
错误原因
- 你选择的
aes-128-ecb、aes-128-ocb算法不符合OpenSSL对PKCS8格式RSA私钥加密的参数校验规则:- AES-128-ECB模式不需要初始化向量(IV),底层OpenSSL的
EVP_CIPHER_asn1_to_param函数将加密参数序列化为ASN.1格式写入私钥时,无法匹配无IV的算法参数要求,直接抛出参数错误。 - AES-128-OCB属于AEAD类加密模式,Node.js内置crypto模块对这类模式用于私钥加密的适配不完善,也会触发参数校验失败。
- AES-128-ECB模式不需要初始化向量(IV),底层OpenSSL的
- 额外说明:ECB模式本身安全性极低,行业通用规范也不推荐使用该模式做任何加密存储场景。
解决方法
将私钥加密的算法替换为OpenSSL兼容的、带IV的常规块加密模式即可,常用可选算法包括aes-128-cbc、aes-256-cbc、aes-256-gcm等。
修改后的可运行代码如下:
const crypto = require("crypto"); let {privateKey, publicKey} = crypto.generateKeyPairSync("rsa", { modulusLength: 2048, publicKeyEncoding: { type: "spki", format: "pem" }, privateKeyEncoding: { type: 'pkcs8', format: 'pem', cipher: "aes-128-cbc", // 仅修改这一行即可 passphrase: "abcdef" } }); const encryptedString = crypto.privateEncrypt({ key: privateKey, passphrase: "abcdef" }, Buffer.from("The quick brown fox jumps over the lazy dog")).toString("base64"); const decryptedString = crypto.publicDecrypt(publicKey, Buffer.from(encryptedString, "base64")).toString(); console.log(`Encrypted: ${encryptedString}`); console.log(`Decrypted: ${decryptedString}`);
修改后运行代码会正常输出加密后的Base64字符串,以及解密后的原始文本,不会再抛出参数错误。
内容的提问来源于stack exchange,提问作者Narasimhan R
相关产品推荐
相关产品推荐

