System.Security.Cryptography.CryptographicException: The data to be decrypted exceeds the maximum for this modulus of 128 bytes. (RSACryptoServiceProv
在使用C#的不对称加密RSACryptoServiceProvider类的时候,会遇到异常:System.Security.Cryptography.CryptographicException: The data to be decrypted exceeds the maximum for this modulus of 128 bytes. 异常详细信息: System.Security.Cryptography.CryptographicException: 要解密的数据超过此模块的最大值 128 字节。错误发生在rsa.Decrypt这一行。通常不对称加密的过程:1. A端数据用公钥加密,通过网络传输 2. B端用私钥解密这些数据。但.net中的rsa加密最多只能对117字节数据进行操作(128位减去随机数),导致128位数据不得不分两部分进行处理,于是加密数据不断膨胀。更多详细讨论参考StackOverflow这个帖子。
解决办法
在CodeProject上有一篇文章, 可以很好的解决这个问题,先下载BigInteger class。

public static class RSAHelper
{
/// <summary>
/// RSAs the encrypt.
/// </summary>
/// <param name="datatoencrypt">The datatoencrypt.</param>
/// <param name="exponent">The exponent.</param>
/// <param name="modulus">The modulus.</param>
/// <returns></returns>
public static byte[] RsaEncrypt(byte[] datatoencrypt, byte[] exponent, byte[] modulus)
{
var original = new BigInteger(datatoencrypt);
var e = new BigInteger(exponent);
var n = new BigInteger(modulus);
var encrypted = original.modPow(e, n);
return HexstringTobyte(encrypted.ToHexString());
}
/// <summary>
/// RSAs the decrypt.
/// </summary>
/// <param name="encrypteddata">The encrypteddata.</param>
/// <param name="d">The d.</param>
/// <param name="modulus">The modulus.</param>
/// <returns></returns>
public static byte[] RsaDecrypt(byte[] encrypteddata, byte[] d, byte[] modulus)
{
var encrypted = new BigInteger(encrypteddata);
var dd = new BigInteger(d);
var n = new BigInteger(modulus);
var decrypted = encrypted.modPow(dd, n);
return HexstringTobyte(decrypted.ToHexString());
}
/// <summary>
/// Generate random bytes with given length
/// </summary>
/// <param name="bytelength"></param>
/// <returns></returns>
public static byte[] GenerateRandomBytes(int bytelength)
{
var buff = new byte[bytelength];
var rng = new RNGCryptoServiceProvider();
rng.GetBytes(buff);
return buff;
}
}
{
/// <summary>
/// RSAs the encrypt.
/// </summary>
/// <param name="datatoencrypt">The datatoencrypt.</param>
/// <param name="exponent">The exponent.</param>
/// <param name="modulus">The modulus.</param>
/// <returns></returns>
public static byte[] RsaEncrypt(byte[] datatoencrypt, byte[] exponent, byte[] modulus)
{
var original = new BigInteger(datatoencrypt);
var e = new BigInteger(exponent);
var n = new BigInteger(modulus);
var encrypted = original.modPow(e, n);
return HexstringTobyte(encrypted.ToHexString());
}
/// <summary>
/// RSAs the decrypt.
/// </summary>
/// <param name="encrypteddata">The encrypteddata.</param>
/// <param name="d">The d.</param>
/// <param name="modulus">The modulus.</param>
/// <returns></returns>
public static byte[] RsaDecrypt(byte[] encrypteddata, byte[] d, byte[] modulus)
{
var encrypted = new BigInteger(encrypteddata);
var dd = new BigInteger(d);
var n = new BigInteger(modulus);
var decrypted = encrypted.modPow(dd, n);
return HexstringTobyte(decrypted.ToHexString());
}
/// <summary>
/// Generate random bytes with given length
/// </summary>
/// <param name="bytelength"></param>
/// <returns></returns>
public static byte[] GenerateRandomBytes(int bytelength)
{
var buff = new byte[bytelength];
var rng = new RNGCryptoServiceProvider();
rng.GetBytes(buff);
return buff;
}
}

//ENCRYPT WITH PUBLIC KEY
var rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(_publicKey /*Type: RSAParameters*/);
byte[] encryptedData = RSAHelper.RsaEncrypt(Encoding.Unicode.GetBytes(stringDataToEncrypt /*Type: string*/), data.parameters.Exponent, data.parameters.Modulus);
return Convert.ToBase64String(encryptedData);
var rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(_publicKey /*Type: RSAParameters*/);
byte[] encryptedData = RSAHelper.RsaEncrypt(Encoding.Unicode.GetBytes(stringDataToEncrypt /*Type: string*/), data.parameters.Exponent, data.parameters.Modulus);
return Convert.ToBase64String(encryptedData);

//Decrypt
var rsa = new RSACryptoServiceProvider();
//Import private key
rsa.ImportParameters(_privateKey /* Type: RSAParameters */);
byte[] encryptedData = RSAHelper.RsaDecrypt(Convert.FromBase64String(encryptedBase64String/* Type: string, but base64 format */), _privateKey.D, _privateKey.Modulus);
return Encoding.Unicode.GetString(encryptedData);
var rsa = new RSACryptoServiceProvider();
//Import private key
rsa.ImportParameters(_privateKey /* Type: RSAParameters */);
byte[] encryptedData = RSAHelper.RsaDecrypt(Convert.FromBase64String(encryptedBase64String/* Type: string, but base64 format */), _privateKey.D, _privateKey.Modulus);
return Encoding.Unicode.GetString(encryptedData);
更多讨论
更多详细讨论参考StackOverflow这个帖子。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述