C# .NET Framework RSA解密出现OAEP填充解码错误求助
问题原因及解决方法
你的代码核心问题是密钥对象的使用完全混乱,导致解密时用了错误的密钥,从而触发OAEP填充解码失败的错误——哪怕换PKCS#1 v1.5填充也没用,因为密钥不匹配的根本问题没解决。
具体错误点分析
- 你创建了新的
rsa1对象,但导入公钥和私钥时,却一直操作原来的rsa对象:
最终解密时用的// 错误地给原rsa对象导入公钥,rsa1完全没被赋值 rsa.FromXmlString(publicKeyXml1); // 还是给原rsa对象导入私钥,rsa1依然是默认生成的全新密钥对 rsa.FromXmlString(privateKeyXml1);rsa1,是一个和加密密钥毫无关系的全新密钥对象,用它解密自然会失败。 - 额外冗余:你读取了
output.txt到read变量,但解密时用的是内存里的encryptedBytes,代码逻辑冗余。 - 潜在风险:RSA加密有明文长度限制(OAEP填充下,最大明文长度为
密钥字节数-42,比如2048位密钥最多加密214字节),如果input.txt内容过长,直接调用Encrypt会抛出其他错误,正确做法是用RSA加密对称密钥(如AES),再用对称加密处理大文件。
修正后的代码
static void Main(string[] args) { // 生成RSA密钥对并导出到文件 using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { string publicKeyXml = rsa.ToXmlString(false); File.WriteAllText("public_key.xml", publicKeyXml); string privateKeyXml = rsa.ToXmlString(true); File.WriteAllText("private_key.xml", privateKeyXml); // 加密输入文件内容 string inputFileName = "input.txt"; string outputFileName = "output.txt"; byte[] inputBytes = File.ReadAllBytes(inputFileName); // 注意:若inputBytes长度超过RSA限制,需改用对称加密+RSA加密密钥的方案 byte[] encryptedBytes = rsa.Encrypt(inputBytes, true); File.WriteAllBytes(outputFileName, encryptedBytes); } // 使用导入的私钥解密 using (RSACryptoServiceProvider rsaDecrypt = new RSACryptoServiceProvider()) { string privateKeyXml = File.ReadAllText("private_key.xml"); rsaDecrypt.FromXmlString(privateKeyXml); byte[] encryptedBytes = File.ReadAllBytes("output.txt"); byte[] decryptedBytes = rsaDecrypt.Decrypt(encryptedBytes, true); string decryptedText = Encoding.UTF8.GetString(decryptedBytes); Console.WriteLine(decryptedText); } }
关键修正点
- 用
using语句管理RSACryptoServiceProvider对象,确保资源正确释放。 - 解密时单独创建新的RSA对象,并正确导入之前导出的私钥。
- 直接读取加密后的文件内容进行解密,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Vidarshana Dissanayaka
相关产品推荐
相关产品推荐

