也就是利用公共密钥和私用密钥(public key and private key)进行加密解密,属于可逆操作。由Rivest、Shamir和Adlernan三人所研究发明的。它利用两个很大的质数相乘所产生的乘积来加密。这两个质数无论哪一个先与原文件编码相乘,对文件加密,均可由另一个质数再相乘来解密。但要用一个质数来求出另一个质数,则是十分困难的。因此将这一对质数称为密钥对(Key Pair)。在加密应用时,某个用户总是将一个密钥公开,让需发信的人员将信息用其公共密钥加密后发给该用户,而一旦信息加密后,只有用该用户一个人知道的私用密钥才能解密。具有数字凭证身份的人员的公共密钥可在网上查到,亦可在请对方发信息时主动将公共密钥传给对方,这样保证在Internet上传输信息的保密和安全。
下面是具体使用方法:

/**//// <summary>
2
/// 生成公钥和私钥信息
3
/// </summary>
4
public void ExportKeyXml()
5
{
6
//ExportParameters和ToXmlString选true时表示公钥和私钥信息同时导出,选false则只导出公钥信息
7
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
8
9
System.IO.StreamWriter swPublic = new System.IO.StreamWriter(@"F:\Study\myProject\test2005\PublicKeyXml.xml");
10
swPublic.Write(rsa.ToXmlString(false));
11
swPublic.Close();
12
13
System.IO.StreamWriter swPrivate = new System.IO.StreamWriter(@"F:\Study\myProject\test2005\PrivateKeyXml.xml");
14
swPrivate.Write(rsa.ToXmlString(true));
15
swPrivate.Close();
16
}
17
18
/**//// <summary>
19
/// 加密数据
20
/// </summary>
21
/// <param name="encryptData">需要加密的明文</param>
22
/// <returns>加密后的十六进制字符串,带横杠</returns>
23
public string EncryptData(string encryptData)
24
{
25
//我的xp系统加密数据只支持最长117字节,如果超过了,将会报错,可以采用分段加密
26
if(encryptData.Length > 117)
27
return "";
28
29
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
30
//获取公钥信息
31
System.IO.StreamReader sr = new System.IO.StreamReader(@"F:\Study\myProject\test2005\PublicKeyXml.xml");
32
33
rsa.FromXmlString(sr.ReadToEnd());
34
sr.Close();
35
//加密
36
byte[] bytResult = rsa.Encrypt(System.Text.Encoding.Default.GetBytes(encryptData), false);
37
return BitConverter.ToString(bytResult);
38
}
39
40
/**//// <summary>
41
/// 解密数据
42
/// </summary>
43
/// <param name="decryptData">加密十六进制字符串,带横杠</param>
44
/// <returns>解密明文</returns>
45
public string DecryptData(string decryptData)
46
{
47
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
48
//获取私钥钥信息
49
System.IO.StreamReader sr = new System.IO.StreamReader(@"F:\Study\myProject\test2005\PrivateKeyXml.xml");
50
51
rsa.FromXmlString(sr.ReadToEnd());
52
sr.Close();
53
//解密,因为我的加密数据转换成十六进制字符串时没有去掉"-",所以这里直接通过split('-')来分数组
54
//不知道还有没有更好的办法处理,比如隔两位取一次等
55
string[] strKey = decryptData.Split('-');
56
byte[] bytKey = new byte[128];
57
for (int i = 0; i < strKey.Length; i++)
58
{
59
bytKey[i] = Convert.ToByte(strKey[i], 16);
60
}
61
byte[] bytDecryptResult = rsa.Decrypt(bytKey, false);
62
return System.Text.Encoding.Default.GetString(bytDecryptResult);
63
}
这里有几个需要注意的地方:
1.当导出密钥信息到文件中时, ToXmlString的参数--true表示公钥和私钥信息,false只导出公钥信息
2.加密的数据长度是有限制的,根据具体环境而有所不同
下表说明了 Microsoft Windows 的不同版本所支持的填充,以及操作系统和填充的不同组合所允许的 rgb 的最大长度。
| 填充 | 支持的操作系统 |