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
说了半天,代码如下:
using System; using System.IO; using System.Security.Cryptography; //这个引用很重要,必须要有 namespace CreateKey { class Program { static void Main(string[] args) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); using (StreamWriter writer = new StreamWriter("PrivateKey.xml")) //这个文件要保密... { writer.WriteLine(rsa.ToXmlString(true)); } using (StreamWriter writer = new StreamWriter("PublicKey.xml")) { writer.WriteLine(rsa.ToXmlString(false)); } } } }
编译后是一个控制台文件,也没考虑什么界面了,直接在同一目录下生成PrivateKey.xml和PublicKey.xml
转自:http://www.cnblogs.com/dream4u/archive/2012/04/21/2461437.html