加密可以幫助保護數據不被查看和修改,並且可以幫助在本不安全的信道上提供安全的通信方式。例如,可以使用加密算法對數據進行加密,在加密狀態下傳輸數據,然後由預定的接收方對數據進行解密。如果第三方截獲了加密的數據,解密數據是很困難的。
為了達到這些目的,您可以使用算法和慣例的組合(稱作加密基元)來創建加密方案。包括私鑰加密(對稱加密)、公鑰加密(不對稱加密)、加密簽名和加密哈希。
我們使用公鑰加密(不對稱加密)來實現注冊碼的算法。
公鑰加密使用一個必須對未經授權的用戶保密的私鑰和一個可以對任何人公開的公鑰。公鑰和私鑰都在數學上相關聯;用公鑰加密的數據只能用私鑰解密,而用私鑰簽名的數據只能用公鑰驗證。
對於注冊碼來說,我們使用私鑰來對一個字符串(用戶名)簽名,然後使用公鑰對這個簽名(注冊碼)進行驗證。由於公鑰只能用於驗證,所以我們可以放心把公鑰分發出去;私鑰匙用來進行簽名的,所以私鑰匙要保存在開發者手中的。這樣就達到了注冊認證的目的。目前使用“用戶名、注冊碼”模式注冊的軟件都應該是使用這一技術。
首先我們生成自己要使用的一個公鑰和私鑰。
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.GetBytes(UID)
Dim sha As New Security.Cryptography.SHA1Managed
Dim result() As Byte = sha.ComputeHash(source)
Dim regkey() As Byte = f.CreateSignature(result)
SerialNumber = Convert.ToBase64String(regkey)
通過剛才得到的私鑰重新初始化rsa對象,然後通過RSAPKCS1SignatureFormatter類來進行簽名。我們將輸入的字符串轉化成字節數組(我們這裡默認用戶名只能由ASCII字符組成),通過SHA1哈西算法計算其哈希值。再使用CreateSignature方法將得到的哈西值進行簽名。最後我們將得到的字節數組轉化成字符串作為注冊碼。這就是生成注冊碼的過程。我們可以重復使用這一段程序對不同的用戶名進行簽名,從而得到與之對應的不同注冊碼。
最後我們把剛才得到的用戶名和注冊碼進行驗證。
rsa.FromXMLString(PUBLIC_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureDeformatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim key() As Byte = Convert.FromBase64String(SerialNumber)
Dim sha As New Security.Cryptography.SHA1Managed
Dim name() As Byte = sha.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(UID))
Result = f.VerifySignature(name, key)
這一次我們使用公鑰來初始化rsa對象,然後通過RSAPKCS1SignatureDeformatter類來驗證簽名。我們將得到的注冊碼反向轉化為字節數組;並將用戶名進行哈西計算得到哈西值。最後通過VerifySignature進行驗證。
從上面的程序可以看出,生成注冊碼需要私鑰(私鑰內附帶公鑰信息),而且可以生成任意多的用戶名、注冊碼對。而通過公鑰,我們只能進行驗證而不能生成。所以公鑰可以放心的發放給所有的用戶進行驗證,而私鑰卻不能。所以在發行的版本中可以附帶公鑰和驗證算法。因為即便用戶得到了公鑰和驗證算法也無法簡單的破解。
現在網絡上流行的注冊機,很大程度上是破解了軟件的私鑰,從而達到無限制的生成所需要的注冊信息。但是如果用戶反編譯你的產品,並且修改了中間代碼,那麼它將會繞過注冊的判斷邏輯。這就不是這一篇所能解決的問題了。因為即是你使用了Web Service技術進行在線激活或注冊,還是可以通過網絡偵聽來分析服務器的信息,模擬一個假的服務器來進行的。