关于RSA加密算法的长度限制问题

RSA是常用的非对称加密算法。近来有学生在项目中使用System.Security类库中的RSA加密算法时,出现了“不正确的长度”,这实际上是因为待加密的数据超长所致。.net Framework中提供的RSA算法规定,每次加密的字节数,不能超过密钥的长度值减去11,而每次加密得到的密文长度,却恰恰是密钥的长度。所以,如果要加密较长的数据,可以采用数据截取的方法,分段加密,实现如下:

       RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

       byte[] data = ........;         //要加密的数据

       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();

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值