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

使用BouncyCastle加密的RSA字符串无法用OpenSSL解密的问题

解决BouncyCastle RSA加密与OpenSSL解密不兼容问题

你的问题核心出在加密后二进制数据的处理逻辑,以及OpenSSL解密命令的参数匹配上,下面一步步拆解解决:

1. 加密后数据的编码错误

你当前直接把加密后的二进制字节用Encoding.UTF8.GetString(encryptedBytes)转字符串保存,这是典型错误:加密后的字节是随机二进制流,并非合法的UTF-8/ASCII字符,转字符串会导致数据损坏,最终OpenSSL拿到的解密数据长度异常,触发data greater than mod len错误。

正确的做法是用Base64编码把二进制数据转成可安全存储/传输的字符串:

public static void CryptStringByPublicKey(string stringToCrypt) {
    var key = GetPublicKey();
    var e = new Pkcs1Encoding(new RsaEngine());
    e.Init(true, key);
    // 建议用UTF-8而非ASCII,避免中文等非ASCII字符丢失
    var bytes = Encoding.UTF8.GetBytes(stringToCrypt);
    var encryptedBytes = e.ProcessBlock(bytes, 0, bytes.Length);
    // 用Base64编码二进制数据,避免转字符串时损坏
    var stringToSave = Convert.ToBase64String(encryptedBytes);
    File.WriteAllText(@"C:\temp\encrypted_file", stringToSave);
}

另外注意你的GetPublicKey方法里变量名写错了:const string privateKeyString = @"C:\temp\public_key.pem";,虽然不影响功能,但建议修正变量名避免混淆。

2. OpenSSL解密命令的参数调整

因为你用的是BouncyCastle的Pkcs1Encoding(对应PKCS#1 v1.5填充),OpenSSL需要明确指定填充方式,同时要处理Base64编码的输入:

# 添加 -pkcs 选项指定PKCS#1 v1.5填充,匹配BouncyCastle的加密逻辑
openssl rsautl -decrypt -in encrypted_file -out message.decrypted -inkey lora_private.pem -pkcs

额外验证步骤

  • 先验证密钥对一致性:用OpenSSL从私钥导出公钥,对比你C#代码中使用的公钥是否完全一致:
    openssl rsa -in lora_private.pem -pubout -out public_key.pem
    
  • 先在本地用BouncyCastle私钥解密加密结果,确认加密逻辑本身无问题,再跨平台用OpenSSL验证。

内容的提问来源于stack exchange,提问作者lunatic84

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:27:02