非对称加密RSA的应用及在C#中的实现
2010-09-30 22:47:06 来源:WEB开发网Step 1:发送方先产生成一对密钥,并将公钥公开给接收方;
Step 2:发送方将数据D进行消息摘要,得到Q;
Step 3:用私钥对Q进行加密得到密文MQ,然后将数据D和密文MQ一起发送给接收方;
Step 4:接收方得到数据D和密文MQ后,用公钥将密文MQ解密得到q1;
Step 5:接收方使用相同的算法对数据D进行消息摘要,得到q2;
Step 6:比较q1和q2,相等则证明D是由发送方发送的,且没有被修改过。
好了,非对称加密的使用介绍了一大堆,后面我们来看看如何用C#来实现RSA非对称加密。
.Net中的加密操作所涉及的对象都在命名空间System.Security.Cryptography下,所以请先在你的程序中添加using System.Security.Cryptography; 其中,RSA加密算法由RSACryptoServiceProvider对象实现。下面的代码分别实现了数据的加密解密和签名与验证。
1: string PublicKey, PrivateKey;
2: RSACryptoServiceProvider rsaProvider;
3: void Initial()
4: {
5: //声明一个RSA算法的实例,由RSACryptoServiceProvider类型的构造函数指定了密钥长度为1024位
6: //实例化RSACryptoServiceProvider后,RSACryptoServiceProvider会自动生成密钥信息。
7: rsaProvider = new RSACryptoServiceProvider(1024);
8: //将RSA算法的公钥导出到字符串PublicKey中,参数为false表示不导出私钥
9: PublicKey = rsaProvider.ToXmlString(false);
10: //将RSA算法的私钥导出到字符串PrivateKey中,参数为true表示导出私钥
11: PrivateKey = rsaProvider.ToXmlString(true);
12:
13:
14: byte[] EncryptData(byte[] data)
15: {
16: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
17: //将公钥导入到RSA对象中,准备加密;
18: rsa.FromXmlString(PublicKey);
19: //对数据data进行加密,并返回加密结果;
20: //第二个参数用来选择Padding的格式
21: return rsa.Encrypt(data, false);
22: }
23:
24: byte[] DecryptData(byte[] data)
25: {
26: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
27: //将私钥导入RSA中,准备解密;
28: rsa.FromXmlString(PrivateKey);
29: //对数据进行解密,并返回解密结果;
30: return rsa.Decrypt(data, false);
31: }
32:
33: byte[] Sign(byte[] data)
34: {
35: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
36: //导入私钥,准备签名
37: rsa.FromXmlString(PrivateKey);
38: //将数据使用MD5进行消息摘要,然后对摘要进行签名并返回签名数据
39: return rsa.SignData(data, "MD5");
40: }
41:
42: bool Verify(byte[] data, byte[] Signature)
43: {
44: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
45: //导入公钥,准备验证签名
46: rsa.FromXmlString(PublicKey);
47: //返回数据验证结果
48: return rsa.VerifyData(data, "MD5", Signature);
49: }
关于RSA更多的内容,大家可以参照MSDN和网络上的教程自己动手进行练习。我会在后面的文章中继续讲解关于密钥的保存方面的内容,希望大家喜欢。
另外希望大家到网上查查RSA的具体算法,非常有意思,并且非常佩服设计出这些算法的人,真不知道他们的脑袋里装的都是什么~~
更多精彩
赞助商链接