You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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:

排查方向及解决方案

  1. 哈希算法不匹配
    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
      
  2. 验证公钥导入有效性
    在代码中添加日志,确认Forge正确解析公钥:

    console.log('公钥类型:', publicKey.type); // 应输出'RSA'
    console.log('公钥模数长度:', publicKey.n.bitLength()); // 如2048/4096,需和私钥一致
    

    如果解析失败,检查公钥PEM是否有多余空格、换行或格式错误(比如是否是PKCS#8格式的公钥,Forge的publicKeyFromPem支持PKCS#1和PKCS#8)。

  3. 确认公私钥配对
    用OpenSSL从私钥导出公钥,对比原公钥是否一致:

    openssl rsa -in private.key -pubout -out derived_pub.key
    # 对比derived_pub.key和原公钥内容
    

    如果不一致,说明公私钥不配对,需重新生成配对密钥。

  4. 加密编码验证
    尝试将加密后的字节转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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:05:19