主要思想是提供者持有密钥,通过RSA加密客户端ID或时间戳离线注册机开发,加密成不那么难看的注册码,分发给客户端。
客户端解决后幻灯片电子相册制作软件(Photo D花纹心形笔刷下载3,通过其持有的公钥验证注册码是否与本地标识或时间戳一致。
一、 生成公钥
ider = 新的 ider();
File.(".xml", .(true));
File.(".xml", .(false));
为了方便长期保存ThunderSoft GIF Maker(GIF动画制作软件),这里直接保存在文件中。
为了避免丢失客户端的公钥,我更喜欢将公钥直接编译到验证程序中离线注册机开发,但这也意味着如果更改了密钥,旧的验证程序将无法验证新生成的注册码。
二、 生成注册码
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.第四行的文件是上一步生成的key文件
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.第三行的公钥是第一步的.xml中的内容
第 14 行和第 17 行中的 2.mac 是客户端计算机的物理地址。如何获取不是本文的重点,请自行百度。
3.考虑到客户端填写的注册码可能不是合法文本,需要在解析时捕获异常
其实ider也提供了解密的方法,可以验证更多类型的验证码。
发表评论