首页 > Asp.net开发 > 关于RSA加密算法的长度问题

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

RSA是常用的非对称加密算法。近来有学生在项目中使用System.Security类库中的RSA加密算法时,出现了“不正确的长度”,这实际上是因为待加密的数据超长所致。.net 

Framework中提供的RSA算法规定,每次加密的字节数,不能超过密钥的长度值减去11,而每次加密得到的密文长度,却恰恰是密钥的长度。所以,如果要加密较长的数据,可以采用数据截取的方法,分段加密。或者增加自定义分块算法,进行加密。当然,你也可以加长密钥的长度,呵呵。下面是分段加解密代码片段,希望对程序媛们有帮助

[csharp]

  1. public override byte[] Encrypt(byte[] sourceBytes)  
  2.         {  
  3.             CspParameters cspParams = new CspParameters();  
  4.             cspParams.KeyContainerName = KeyContainerName;  
  5.             RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams);  
  6.   
  7.             int keySize = RSAalg.KeySize / 8;  
  8.             int bufferSize = keySize - 11;  
  9.             byte[] buffer = new  byte[bufferSize];  
  10.             MemoryStream msInput = new MemoryStream(sourceBytes);  
  11.             MemoryStream msOutput = new MemoryStream();  
  12.             int readLen = msInput.Read(buffer, 0, bufferSize);   
  13.             while (readLen > 0)  
  14.             {  
  15.   
  16.                 byte[] dataToEnc = new byte[readLen];  
  17.   
  18.                 Array.Copy(buffer, 0, dataToEnc, 0, readLen);  
  19.   
  20.                 byte[] encData = RSAalg.Encrypt(dataToEnc, false);  
  21.   
  22.                 msOutput.Write(encData, 0, encData.Length);  
  23.   
  24.                 readLen = msInput.Read(buffer, 0, bufferSize);  
  25.   
  26.             }  
  27.   
  28.             msInput.Close();  
  29.   
  30.             byte[] result = msOutput.ToArray();     //得到加密结果  
  31.   
  32.             msOutput.Close();  
  33.   
  34.             RSAalg.Clear();  
  35.   
  36.             return result;  
  37.   
  38.             //return RSAalg.Encrypt(sourceBytes, false);  
  39.         }  
  40.   
  41.         public override byte[] Decrypt(byte[] cryptBytes)  
  42.         {  
  43.             CspParameters cspParams = new CspParameters();  
  44.             cspParams.KeyContainerName = KeyContainerName;  
  45.             RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams);  
  46.             //return RSAalg.Decrypt(cryptBytes, false);  
  47.             int keySize = RSAalg.KeySize / 8;  
  48.             int bufferSize = keySize;// keySize - 11;  
  49.             byte[] buffer = new byte[bufferSize];  
  50.             MemoryStream msInput = new MemoryStream(cryptBytes);  
  51.             MemoryStream msOutput = new MemoryStream();  
  52.             int readLen = msInput.Read(buffer, 0, bufferSize);  
  53.             while (readLen > 0)  
  54.             {  
  55.   
  56.                 byte[] dataToDec = new byte[readLen];  
  57.   
  58.                 Array.Copy(buffer, 0, dataToDec, 0, readLen);  
  59.   
  60.                 byte[] decData = RSAalg.Decrypt(dataToDec, false);  
  61.   
  62.                 msOutput.Write(decData, 0, decData.Length);  
  63.   
  64.                 readLen = msInput.Read(buffer, 0, bufferSize);  
  65.   
  66.             }  
  67.   
  68.             msInput.Close();  
  69.   
  70.             byte[] result = msOutput.ToArray();     //得到加密结果  
  71.   
  72.             msOutput.Close();  
  73.   
  74.             RSAalg.Clear();  
  75.   
  76.             return result;  
  77.         }  

本文固定链接: http://www.devba.com/index.php/archives/6245.html | 开发吧

报歉!评论已关闭.