国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

基于C#實現簡單離線注冊碼生成與驗證

2019-10-29 21:38:04
字體:
來源:轉載
供稿:網友

本文使用RSA非對稱加密和Base64簡單地實現離線注冊碼的生成與驗證功能。感興趣的朋友跟著小編一起學習吧

主要思路就是提供者持有密鑰,通過RSA加密客戶機標識或時間標識,再通過Base64加密成不太難看的注冊碼,然后分發給客戶機。

客戶機解Base64后,通過持有的公鑰來驗證注冊碼是否與本機標識或時間標識相符。

一、 生成公密鑰

RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();

File.WriteAllText("PrivateKey.xml", cryptor.ToXmlString(true));

File.WriteAllText("PublicKey.xml", cryptor.ToXmlString(false));

為了方便長期保存這里就直接存入文件了。

為了避免客戶機公鑰丟失,我比較傾向于將公鑰直接編譯到驗證程序中,但是這樣也就意味著如果更換了密鑰,老的驗證程序就驗不了新生成的注冊碼了。

二、 生成注冊碼

 

 
  1. static string CreateRegCode(string mac, DateTime date) 
  2. RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider(); 
  3. cryptor.FromXmlString(File.ReadAllText("PrivateKey.xml")); 
  4. string signature = String.Format("[{}][{}]", mac, date.ToString("yyyy-MM-dd")); 
  5. byte[] regCodeBytes = cryptor.SignData( 
  6. Encoding.UTF.GetBytes(signature), 
  7. "SHA"); 
  8. return Convert.ToBaseString(regCodeBytes); 

這個方法是通過加密MAC和日期的組合來生成注冊碼,需要注意幾點:

1.參數中的MAC是客戶機的地址2.第四行的文件是上一步生成的密鑰文件

3.由于只考慮驗證,所以客戶機還必須知道參數中的date

三、 驗證注冊碼

 

 
  1. static bool Verify(string regCode) 
  2. const string PUBLIC_KEY = ""
  3. try 
  4. RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider(); 
  5. cryptor.FromXmlString(PUBLIC_KEY); 
  6. byte[] signedData = Convert.FromBaseString(regCode); 
  7.  
  8. bool today = cryptor.VerifyData( 
  9. Encoding.UTF.GetBytes(String.Format("[{}][{}]", DateTime.Now.ToString("yyyy-MM-dd"))), 
  10. "SHA", signedData); 
  11. bool machineToday = cryptor.VerifyData( 
  12. Encoding.UTF.GetBytes(String.Format("[{}][{}]", MAC, DateTime.Now.ToString("yyyy-MM-dd"))), 
  13. "SHA", signedData); 
  14. bool forever = cryptor.VerifyData( 
  15. Encoding.UTF.GetBytes(String.Format("[{}][{}]", MAC, Environment.MachineName)), 
  16. "SHA", signedData); 
  17. return today || machineToday || forever; 
  18. catch 
  19. return false

這個方法驗證了三種類型的注冊碼:當天可用、本機當天可用和永久可用。

需要注意:

1.第三行的公鑰就是第一步的PublicKey.xml中的內容

2.十四和十七行的MAC是客戶機的物理地址,至于怎么獲取不是本文的重點,請各位看官自行百度

3.考慮到客戶機填寫的注冊碼有可能不是合法的Base64文本,需要捕獲解析時異常

其實RSACryptoServiceProvider也提供了解密的方法,這樣就可以驗證更多種類的驗證碼了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永福县| 兰州市| 奈曼旗| 高密市| 阿拉善左旗| 临桂县| 乌兰浩特市| 长宁区| 泌阳县| 贞丰县| 龙胜| 旬邑县| 中阳县| 历史| 砀山县| 织金县| 政和县| 泽州县| 彩票| 浦县| 陈巴尔虎旗| 翼城县| 广安市| 靖宇县| 金阳县| 开化县| 阿坝县| 鄂托克前旗| 罗源县| 岳阳市| 温泉县| 南木林县| 昌黎县| 左云县| 通辽市| 靖边县| 隆回县| 浪卡子县| 娄烦县| 牡丹江市| 改则县|