关于RSA加密算法的长度问题
2015-06-10 12:41
435 查看
RSA是常用的非对称加密算法。近来有学生在项目中使用System.Security类库中的RSA加密算法时,出现了“不正确的长度”,这实际上是因为待加密的数据超长所致。.net
Framework中提供的RSA算法规定,每次加密的字节数,不能超过密钥的长度值减去11,而每次加密得到的密文长度,却恰恰是密钥的长度。所以,如果要加密较长的数据,可以采用数据截取的方法,分段加密。或者增加自定义分块算法,进行加密。当然,你也可以加长密钥的长度,呵呵。下面是分段加解密代码片段,希望对程序媛们有帮助
Framework中提供的RSA算法规定,每次加密的字节数,不能超过密钥的长度值减去11,而每次加密得到的密文长度,却恰恰是密钥的长度。所以,如果要加密较长的数据,可以采用数据截取的方法,分段加密。或者增加自定义分块算法,进行加密。当然,你也可以加长密钥的长度,呵呵。下面是分段加解密代码片段,希望对程序媛们有帮助
public override byte[] Encrypt(byte[] sourceBytes) { CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = KeyContainerName; RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams); int keySize = RSAalg.KeySize / 8; int bufferSize = keySize - 11; byte[] buffer = new byte[bufferSize]; MemoryStream msInput = new MemoryStream(sourceBytes); MemoryStream msOutput = 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 = RSAalg.Encrypt(dataToEnc, false); msOutput.Write(encData, 0, encData.Length); readLen = msInput.Read(buffer, 0, bufferSize); } msInput.Close(); byte[] result = msOutput.ToArray(); //得到加密结果 msOutput.Close(); RSAalg.Clear(); return result; //return RSAalg.Encrypt(sourceBytes, false); } public override byte[] Decrypt(byte[] cryptBytes) { CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = KeyContainerName; RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams); //return RSAalg.Decrypt(cryptBytes, false); int keySize = RSAalg.KeySize / 8; int bufferSize = keySize;// keySize - 11; byte[] buffer = new byte[bufferSize]; MemoryStream msInput = new MemoryStream(cryptBytes); MemoryStream msOutput = new MemoryStream(); int readLen = msInput.Read(buffer, 0, bufferSize); while (readLen > 0) { byte[] dataToDec = new byte[readLen]; Array.Copy(buffer, 0, dataToDec, 0, readLen); byte[] decData = RSAalg.Decrypt(dataToDec, false); msOutput.Write(decData, 0, decData.Length); readLen = msInput.Read(buffer, 0, bufferSize); } msInput.Close(); byte[] result = msOutput.ToArray(); //得到加密结果 msOutput.Close(); RSAalg.Clear(); return result; }
相关文章推荐
- JSP之三大指令
- 向量叉积定义的证明
- 几个更新(Update声明)查询方法
- 搭建高可用及负载均衡的REDIS
- C语言变参数函数
- GMAT数学解题辅导之5大数学思维
- C语言变参数函数
- 10.Logistic Regression逻辑斯蒂回归
- C语言变参数函数
- PKU 1679 The Unique MST(解题报告)
- QT拉人
- bootstrap 自定义
- MySQL中的string类型
- 基于SWOOLE的高可用分布式SOKET服务器系统搭建V2.0
- AD中父子域配置
- 关于arduino的各种网站
- Matplotlib 工具包 使用教程索引
- Python第一天
- 第十三周 课后实践:项目二——形状类族中的纯虚函数
- android获取MIME类型