RSA是经常使用的非对称加密算法。近来有学生在项目中使用System.Security类库中的RSA加密算法时,出现了“不正确的长度”,这其实是由于待加密的数据超长所致。.net Framework中提供的RSA算法规定,每次加密的字节数,不能超过密钥的长度值减去11,而每次加密获得的密文长度,却偏偏是密钥的长度。因此,若是要加密较长的数据,能够采用数据截取的方法,分段加密,实现以下:算法
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();ide
byte[] data = ........; //要加密的数据加密
string publicKey = .... ; //获取公钥spa
rsa.FromXmlString(publicKey);.net
int keySize = rsa.KeySize / 8;string
int bufferSize = keySize - 11;it
byte[] buffer = new byte[bufferSize];coding
MemoryStream msInput = new MemoryStream(data);rsa
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();