我這里主要是為了一個序列號在線生成,注冊軟件的服務提供公鑰和私鑰,用到了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