关于RSA加密算法的长度限制问题
RSA是常用的非对称加密算法。近来有学生在项目中使用System.Security类库中的RSA加密算法时,出现了“不正确的长度”,这实际上是因为待加密的数据超长所致。.net
Framework中提供的RSA算法规定,每次加密的字节数,不能超过密钥的长度值减去11,而每次加密得到的密文长度,却恰恰是密钥的长度。所以,如果要加密较长的数据,可以采用数据截取的方法,分段加密,实现如下:
RSACryptoServiceProvider rsa = new
RSACryptoServiceProvider();
byte[] da
//要加密的数据
string publicKey = .... ; //获取公钥
rsa.FromXmlString(publicKey);
int keySize = rsa.KeySize / 8;
int bufferSize = keySize - 11;
byte[] buffer = new
byte[bufferSize];
MemoryStream msInput = new
MemoryStream(data);
MemoryStream msOuput = new
MemoryStream();
int readLen = msInput.Read(buffer, 0,
bufferSize);
while(readLen > 0)
{
byte[] dataToEnc = new
byte[readLen];
Array.Copy(buffer, 0 , dataToEnc,
0, readLen);
byte[] encData =
rsa.Encrypt(dataToEnc , false);
msOutput.Write(encData, 0,
encData.Length);
readLen = msInput.Read(buffer, 0,
bufferSize);
}
msInput.Close();
byte[] result = msOutput.ToArray();
//得到加密结果
msOutput.Close();
rsa.Clear();
解密时肯定也要使用分段解密,算法如下:
RSACryptoServiceProvider rsa = new
RSACryptoServiceProvider();
byte[] key = .....; //加载私钥
string privateKey =
Encoding.ASCII.GetString(key);
byte[] dataEnc = ...; //加载密文
rsa.FromXmlString(privateKey);
int keySize = rsa.KeySize / 8;
byte[]
buffer = new byte[keySize];
MemoryStream msInput = new
MemoryStream(dataEnc );
MemoryStream msOuput = new
MemoryStream();
int readLen = msInput.Read(buffer, 0,
keySize);
while(readLen > 0)
{
byte[] dataToDec = new
byte[readLen];
Array.Copy(buffer, 0 , dataToDec,
0, readLen);
byte[] decData =
rsa.Decrypt(dataToDec , false);
msOutput.Write(decData, 0,
decData.Length);
readLen = msInput.Read(buffer, 0,
keySize);
}
msInput.Close();
byte[] result = msOutput.ToArray();
//得到解密结果
msOutput.Close();
rsa.Clear();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现