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

关于RSA加密算法的长度限制问题的更多相关文章

  1. 用实例讲解RSA加密算法(精)

    RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经 ...

  2. RSA加密算法的加密与解密

    转发原文链接:RSA加密算法加密与解密过程解析 1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密. 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密. 所 ...

  3. 轻松学习RSA加密算法原理

    转自:http://blog.csdn.net/sunmenggmail/article/details/11994013 http://blog.csdn.net/q376420785/articl ...

  4. RSA加密算法原理及RES签名算法简介

    第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥.一个是公钥,给A,B自己持有私钥.A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密 ...

  5. 浅谈RSA加密算法

    一.什么是非对称加密 1.加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2.密钥分为:公钥,私钥  公钥:可以对外给任何人的加密和解密的密码,是公开的 私钥:通过私钥可以生成公钥,但从 ...

  6. 轻松学习RSA加密算法原理 (转)

    轻松学习RSA加密算法原理 (转) http://blog.csdn.net/q376420785/article/details/8557266 http://www.ruanyifeng.com/ ...

  7. [转] 用实例给新手讲解RSA加密算法

    http://www.cfca.com.cn/zhishi/wz-012.htm PS: 通常公钥对数据加密,私钥对数据解密:私钥对数据签名,公钥对数据签名进行认证 RSA加密算法是最常用的非对称加密 ...

  8. RSA加密算法及其与SpringMVC集成

    如有不足,敬请各位提出批评,定会改正.THX! 本文介绍的是RSA加密算法+Spring Security在SpringMVC中的集成使用. Spring Security是什么? 引用: Sprin ...

  9. 用实例给新手讲解RSA加密算法

    图为 RSA公开密钥算法的发明人,从左到右Ron Rivest, Adi Shamir, Leonard Adleman. 照片摄于1978年 RSA加密算法是最常用的非对称加密算法,CFCA在证书服 ...

随机推荐

  1. 【前端】Ember.js学习笔记

    Model 在默认情况下,model钩子返回的值,会设置为关联的控制器的model属性.例如,如果App.PostsRoute通过model钩子返回了一个对象,这个对象会设置为App.PostsCon ...

  2. jQuery选择器方式-用的不多的name选择器

    id:$("#id") name:$("[name='name']") class:$(".class") element:$(" ...

  3. JS中函数声明与函数表达式的不同

    Js中的函数声明是指下面的形式: function functionName(){   } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如 var functionName ...

  4. HDU 5934 Bomb(炸弹)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  5. 求两条直线相交点 AS3代码

    ,); ,); ,); ,); var p:Point = new Point(); trace(checkPoint()) function checkPoint() { if (p1Start.x ...

  6. RabbitMQ详解

    本文地址:http://www.host900.com/index.php/articles/351/ 介绍RabbitMQ前,有必须先了解一下AMQP协议.AMQP协议是一个高级抽象层消息通信协议, ...

  7. Node聊天程序实例06:server.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. server ...

  8. ANdroid URL

    1 Android开源项目和工具分类 http://blog.csdn.net/shimiso/article/details/40889361 2 分享45个android实例源码 http://w ...

  9. 展讯camera去除尺寸相关缓存

    amera应用的缓存在/data/data/com.android.camera2/shared_prefs目录下

  10. Deep Learning 19_深度学习UFLDL教程:Convolutional Neural Network_Exercise(斯坦福大学深度学习教程)

    理论知识:Optimization: Stochastic Gradient Descent和Convolutional Neural Network CNN卷积神经网络推导和实现.Deep lear ...