使用Forge加密的RSA密文无法通过OpenSSL解密的问题求助
RSA加密后OpenSSL解密失败(PKCS填充校验错误)
我使用Forge JavaScript库(v1.0.0)通过RSA算法加密消息,再用OpenSSL套件解密时,触发PKCS填充校验失败错误,怀疑是公钥导入Forge的方式有误,以下是相关信息:
加密代码片段
const forge = require('node-forge'); // 导入公钥 const publicKeyPem = `-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...(完整公钥内容) -----END PUBLIC KEY-----`; const publicKey = forge.pki.publicKeyFromPem(publicKeyPem); // 加密逻辑 const plaintext = '需要加密的测试消息'; const encryptedBytes = publicKey.encrypt(plaintext, 'RSA-OAEP', { md: forge.md.sha256.create(), mgf1: { md: forge.md.sha256.create() } }); const encryptedBase64 = forge.util.encode64(encryptedBytes); console.log('加密后Base64:', encryptedBase64);
公私钥信息
公钥(PEM格式)
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxQ...(完整公钥) -----END PUBLIC KEY-----
私钥(PEM格式)
-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAxQ...(完整私钥) -----END RSA PRIVATE KEY-----
控制台输出
加密后Base64: XYZabc123...(实际加密后的Base64字符串)
解密命令及错误日志
执行的解密命令
echo "XYZabc123..." | base64 -d | openssl rsautl -decrypt -inkey private.key -oaep
错误日志
RSA operation error 140735207327680:error:0407008A:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:invalid padding:../crypto/rsa/rsa_oaep.c:677: 140735207327680:error:04065072:rsa routines:rsa_ossl_private_decrypt:padding check failed:../crypto/rsa/rsa_ossl.c:595:
排查方向及解决方案
哈希算法不匹配
Forge加密时指定了SHA256作为OAEP的哈希和MGF1哈希,但OpenSSL的rsautl -oaep默认使用SHA1,导致校验失败。解决方法二选一:- 修改Forge代码,改用SHA1匹配OpenSSL默认:
const encryptedBytes = publicKey.encrypt(plaintext, 'RSA-OAEP', { md: forge.md.sha1.create(), mgf1: { md: forge.md.sha1.create() } }); - 解密时指定SHA256参数:
echo "XYZabc123..." | base64 -d | openssl rsautl -decrypt -inkey private.key -oaep -sha256
- 修改Forge代码,改用SHA1匹配OpenSSL默认:
验证公钥导入有效性
在代码中添加日志,确认Forge正确解析公钥:console.log('公钥类型:', publicKey.type); // 应输出'RSA' console.log('公钥模数长度:', publicKey.n.bitLength()); // 如2048/4096,需和私钥一致如果解析失败,检查公钥PEM是否有多余空格、换行或格式错误(比如是否是PKCS#8格式的公钥,Forge的
publicKeyFromPem支持PKCS#1和PKCS#8)。确认公私钥配对
用OpenSSL从私钥导出公钥,对比原公钥是否一致:openssl rsa -in private.key -pubout -out derived_pub.key # 对比derived_pub.key和原公钥内容如果不一致,说明公私钥不配对,需重新生成配对密钥。
加密编码验证
尝试将加密后的字节转Hex编码输出,再用OpenSSL解密Hex内容,排除Base64编码问题:const encryptedHex = forge.util.bytesToHex(encryptedBytes); console.log('加密后Hex:', encryptedHex);解密命令:
echo "encrypted_hex_string" | xxd -r -p | openssl rsautl -decrypt -inkey private.key -oaep -sha256
内容的提问来源于stack exchange,提问作者TonyG
相关产品推荐
相关产品推荐

