使用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
相关产品推荐
相关产品推荐

