基於C#完成簡略離線注冊碼生成與驗證。本站提示廣大學習愛好者:(基於C#完成簡略離線注冊碼生成與驗證)文章只能為提供參考,不一定能成為您想要的結果。以下是基於C#完成簡略離線注冊碼生成與驗證正文
重要思緒就是供給者持有密鑰,經由過程RSA加密客戶機標識或時光標識,再經由過程Base64加密成不太好看的注冊碼,然後分發給客戶機。
客戶機解Base64後,經由過程持有的公鑰來驗證注冊碼能否與本機標識或時光標知趣符。
1、 生成公密鑰
RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
File.WriteAllText("PrivateKey.xml", cryptor.ToXmlString(true));
File.WriteAllText("PublicKey.xml", cryptor.ToXmlString(false));
為了便利歷久保留這裡就直接存入文件了。
為了不客戶機公鑰喪失,我比擬偏向於將公鑰直接編譯到驗證法式中,然則如許也就意味著假如改換了密鑰,老的驗證法式就驗不了重生成的注冊碼了。
2、 生成注冊碼
static string CreateRegCode(string mac, DateTime date) { RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider(); cryptor.FromXmlString(File.ReadAllText("PrivateKey.xml")); string signature = String.Format("[{}][{}]", mac, date.ToString("yyyy-MM-dd")); byte[] regCodeBytes = cryptor.SignData( Encoding.UTF.GetBytes(signature), "SHA"); return Convert.ToBaseString(regCodeBytes); }
這個辦法是經由過程加密MAC和日期的組合來生成注冊碼,須要留意幾點:
1.參數中的MAC是客戶機的地址2.第四行的文件是上一步生成的密鑰文件
3.因為只斟酌驗證,所以客戶機還必需曉得參數中的date
3、 驗證注冊碼
static bool Verify(string regCode) { const string PUBLIC_KEY = ""; try { RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider(); cryptor.FromXmlString(PUBLIC_KEY); byte[] signedData = Convert.FromBaseString(regCode); bool today = cryptor.VerifyData( Encoding.UTF.GetBytes(String.Format("[{}][{}]", DateTime.Now.ToString("yyyy-MM-dd"))), "SHA", signedData); bool machineToday = cryptor.VerifyData( Encoding.UTF.GetBytes(String.Format("[{}][{}]", MAC, DateTime.Now.ToString("yyyy-MM-dd"))), "SHA", signedData); bool forever = cryptor.VerifyData( Encoding.UTF.GetBytes(String.Format("[{}][{}]", MAC, Environment.MachineName)), "SHA", signedData); return today || machineToday || forever; } catch { return false; } }
這個辦法驗證了三品種型的注冊碼:當天可用、本機當天可用和永遠可用。
須要留意:
1.第三行的公鑰就是第一步的PublicKey.xml中的內容
2.十四和十七行的MAC是客戶機的物理地址,至於怎樣獲得不是本文的重點,請列位看官自行百度
3.斟酌到客戶機填寫的注冊碼有能夠不是正當的Base64文本,須要捕捉解析時異常
其實RSACryptoServiceProvider也供給懂得密的辦法,如許便可以驗證更多品種的驗證碼了。