加密可以幫助保護資料不被檢視和修改,並且可以幫助在本不安全的頻道上提供安全的通訊方式。例如,可以使用加密演算法對資料進行加密,在加密狀態下傳輸數據,然後由預定的接收方對資料進行解密。如果第三方截獲了加密的數據,解密資料是很困難的。
為了達到這些目的,您可以使用演算法和慣例的組合(稱為加密基元)來建立加密方案。包括私鑰加密(對稱加密)、公鑰加密(不對稱加密)、加密簽章和加密雜湊。
我們使用公鑰加密(不對稱加密)來實現註冊碼的演算法。
公鑰加密使用一個必須對未經授權的使用者保密的私鑰和一個可以對任何人公開的公鑰。公鑰和私鑰都在數學上相關聯;用公鑰加密的資料只能用私鑰解密,而用私鑰簽署的資料只能用公鑰驗證。
對於註冊碼來說,我們使用私鑰來對一個字串(使用者名稱)簽名,然後使用公鑰對這個簽名(註冊碼)進行驗證。由於公鑰只能用於驗證,所以我們可以放心把公鑰分發出去;私鑰匙用來簽名的,所以私鑰匙要保存在開發者手中的。這樣就達到了註冊認證的目的。目前使用「使用者名稱、註冊碼」模式註冊的軟體都應該是使用這項技術。
首先我們產生自己要使用的一個公鑰和私鑰。
Private rsa As New Security.Cryptography.RSACryptoServiceProvider
RSACryptoServiceProvider類別提供RSA演算法的實作執行不對稱加密和解密。透過ToXMLString就可以產生我們需要的公鑰和私鑰。
rsa.ToXmlString(False)
rsa.ToXmlString(True)
當參數為False的時候,僅產生公鑰;True的時候將會把公鑰和私鑰全部產生。我們通常透過ToXmlString(False)得到一個公鑰字串;透過ToXmlString(True)得到一個私鑰字串(雖然其中含有公鑰)。我們可以將這兩個金鑰保存在本機上面,透過字串常數定義並使用。也就是說我們的註冊資訊將使用唯一的公鑰和私鑰。
然後我們透過公鑰和私鑰對指定的字串進行簽署。
rsa.FromXmlString(PRIVATE_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureFormatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim source() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytesUID Security DSecurity
DSecurity .Cryptography.SHA1Managed
Dim result() As Byte = sha.ComputeHash(source)
Dim regkey() As Byte = f.CreateSignature(result)
SerialNumber = Convert.ToBase64String(regkey)
透過剛才得到的私鑰重新初始化rsaa物件,然後透過RSAPKCS1SignatureFormatter類別來進行簽章。我們將輸入的字串轉換成位元組數組(我們這裡預設用戶名只能由ASCII字元組成),透過SHA1哈西演算法計算其雜湊值。再使用CreateSignature方法將會得到的哈西值來簽章。最後我們將得到的位元組數組轉換成字串作為註冊碼。這就是產生註冊碼的過程。我們可以重複使用這一段程式對不同的使用者名稱進行簽名,從而得到與之對應的不同註冊碼。
最後我們把剛才得到的使用者名稱和註冊碼進行驗證。
rsa.FromXmlString(PUBLIC_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureDeformatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim key() As Byte
=
機密
() As Byte = sha.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(UID))
Result = f.VerifySignature(name, key)
這次我們使用公鑰來初始化rsa對象,然後透過RSAPKCS1SignatureDeformatter類別來驗證簽章。我們將得到的註冊碼反向轉換為位元組數組;並將使用者名稱進行哈西計算得到哈西值。最後透過VerifySignature進行驗證。
從上面的程式可以看出,產生註冊碼需要私鑰(私鑰內附帶公鑰資訊),而且可以產生任意多的使用者名稱、註冊碼對。而透過公鑰,我們只能進行驗證而不能產生。所以公鑰可以放心的發放給所有的使用者進行驗證,而私鑰卻不能。所以在發行的版本中可以附帶公鑰和驗證演算法。因為即便用戶得到了公鑰和驗證演算法也無法簡單的破解。
現在網路上流行的註冊機,很大程度上是破解了軟體的私鑰,從而達到無限制的生成所需的註冊資訊。但是如果使用者反編譯你的產品,並且修改了中間程式碼,那麼它將會繞過註冊的判斷邏輯。這就不是這篇所能解決的問題了。因為即是你使用了Web Service技術進行線上啟動或註冊,還是可以透過網路偵聽來分析伺服器的信息,模擬一個假的伺服器來進行的。
http://www.cnblogs.com/farrio/archive/2006/12/01/579296.html