C#中用RSA算法生成公钥和私钥

我这里主要是为了一个序列号在线生成,注册软件的服务提供公钥和私钥,用到了RSA算法。此为数据加密的应用,RSA算法另外一个作用是数字签名,先不研究。

知识储备:

什么是非对称加密?所谓的非对称加密,就是指加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密),相反,使用了密钥B加密数据得到的密文,只有密钥A可以解密。这两个密钥分别称为私钥和公钥,顾名思义,私钥就是你个人保留,不能公开的密钥,而公钥则是公开给加解密操作的另一方的。根据不同用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。非对称加密的代表算法是RSA算法。

使用场景:

参考http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html

如果我不想让除了接收方以外的其他人,知道我发送的数据的内容的话,需要用哪种密钥对数据进行加密?如果我使用私钥加密,那么根据非对称加密的原理,接收方需要使用公钥来解密,而公钥我已经公开给接收方了,这个方案似乎是可行的,可是这样做问题就出现在公钥上了。在非对称加密中,公钥的公开不仅仅指对接收方的公开,而是指这个密钥彻底的公开,任何人需要都可以得到,这样的话你发送的数据就没有任何秘密可言了。反过来,如果我使用公钥对数据加密,那么对于接收方来说就需要使用私钥进行数据解密,由于私钥只保存在接收方手中,这样其他人就不会得到数据的内容了。这样看来,在非对称加密中,如果需要保护你的数据不被第三者得到,密钥需要由接收方产生,然后接收方将公钥公开出去,发送方使用这个公开的公钥对数据进行加密后传输给接收方,接收方使用自己的私钥进行解密,从而保证了数据的安全性。所以非对称加密又称为公钥加密。

关于RSA算法的细节,可以参考http://www.cnblogs.com/zhtxwd/archive/2012/02/09/2344154.html,事实上我也懒得去看那些数学运算,C#本身就已经提供了RSACryptoServiceProvider 类,能得到结果就好,费那事干嘛。就好像会开车的人不用明白车子是怎么运作的,一个道理。

RSACryptoServiceProvider类的使用可以参考MSDN,我这里只是最简单的应用,同时生成了xml格式的密钥和私钥。

http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rsacryptoserviceprovider.aspx

说了半天,代码如下:

 1 using System;
 2 using System.IO;
 3 using System.Security.Cryptography;    //这个引用很重要,必须要有
 4 
 5 namespace CreateKey
 6 {
 7     class Program
 8     {
 9         static void Main(string[] args)
10         {
11             RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
12             using (StreamWriter writer = new StreamWriter("PrivateKey.xml"))  //这个文件要保密...
13             {
14 
15                 writer.WriteLine(rsa.ToXmlString(true));
16 
17             }
18             using (StreamWriter writer = new StreamWriter("PublicKey.xml"))   
19             {
20 
21                 writer.WriteLine(rsa.ToXmlString(false));            
22 
23             }
24         }
25     }
26 
27 }

编译后是一个控制台文件,也没考虑什么界面了,直接在同一目录下生成PrivateKey.xml和PublicKey.xml