随机注册码模式就是只要一个注册码,没有用户或是硬件系列号作为加密依据,进行一定的变换以后校验是否为合法注册码。该模式的注册码可以在任意计算机上使用,不唯一,好处是方便用户购买。随机注册码保护实例设置注册码形如“AABBCCDD-02C46-0C7AA-15A59-0BEFS”的格式。随机注册码验证步骤如下:注册码第一段为软件的固定标志,此值可以根据自己的需要设置,随机注册码验证的第一步就是判断固定标志是否正确。固定标志正确就把后面四段注册码转换成对应的十进制数,用注册码第二段与注册码第四段相加,用注册码第三段与第五段相加。把相加得到的两个结果进行比较,如果相同,再把其中的一个结果与一个固定的整数值比较,如果相同,说明注册码是正确的,不相同说明注册码不正确。示例代码如下:
uses Registry, Base64Unit;//十六进制转换成证书function HexToInt(Hex:String): Integer;varI,Res:Integer;ch:Char;beginRes;=0;for I := 0 to Length(Hex)-1 dobeginch:=Hex[I+1];if (ch >= '0') and (ch < '9') thenRes;Res16+Ord(ch)-Ord('0')else 1f (ch >= 'A') and (ch <- 'F') thenRes:=Res 16+Ord(ch)-Ord('A') +10else if (ch > 'a') and (ch <= 'f') thenRes:Res16 + Ord(ch) - Ord('a') +10else raise Exception,Create('无效的十六进制字符串');end;Result :-Res;end;fuction Subtzing(BootStr,Chi1dBtr; string):pstringtet;//11分解字符串variremp:integer;beginresult:=rstringList.create;irenp:=pos(Childstr,RootStr);while iTemp>0 do beginif iremp>1 then result.Append(copy(RootStr,1,iTemp-1));delete(RootStr,1,iTemp+length(Childstr)-1);iremp:=pos(ChildStr,RootStr);end;if RootStr<>''then result.Append(Rootstr);end;//保存注册信息procedure TForml.Button1Click(Sender:Tobject);varReg:TRegistry;beginif Editl.Text=''thenbeginMessageBox(Handle,'注册码不能为空。
','提示',MB_OK);Exit;end;Reg:=TRegistry.Create;Reg.RootKey:=HKEY CURRENT_USER;if Reg.OpenKey('\Software\KE,True) thenReg.WriteString('Ran',Base64Encryption(Edit1.Text));Reg.CloseKey;Reg.Destroy;MessageBox(Handle,'请启软件校验注册码。
','提示',MB_OK);end;//验证注册码
procedure TForm1.FormCreate(Sender:TObject);varReg:TRegistry;RegCodeStr:String;Str:TStrings;beginStr:=TStringList.Create;Reg:=TRegistry.Create;Reg.RootKey:=HKEY_CURRENT_USER;if Reg.Openkey('\Software\KE,False) thenRegCodeStr:=Base64Decrypt(Reg.ReadString('Ran'));Reg.CloseKey;if RegCode='' thenExit;tryStr:=SubStrings(RegCodeStr,'-');if Pos ('-' ,RegCodeStr)<=0 thenExit;if Str[0]<>'Ran' thenExit;if (HexToInt(str[1])+HexToInt(Str[3])=HexToInt(Str[2])+HexToInt(Str[4]))and(HexToInt(Str[1])+HexToInt(Str[3])=99999) thenButton1.Enabled:=False;Str.Free;exceptButton1.Enabled:=True;end;end;
注册机制作实例分析上面随机注册码的验证过程,注册码总得有五段,第一段固定,第二、四段相加,第三、五段相加,看相加结果是否相同并与一个固定的值比较。这说明固定值=第二段+第四段固定值=第三段+第五段即 第二段+第四段=第三段+第五段=固定值后四段注册码都是五位数,可以先获取一个五位数的随机数K1,用一个大于这个随机数的固定值D减去该随机数得到K2.然后用上面的方法获取另外一个随机数K3,用相同的固定值D减去随机数得到K4,这样就得到了四组数据,并且满足K1+K2等于K3+K4,同时等于一个固定的值,就是D=K1+K2=K3+K4,按照注册码验证的算法把注册码排列出来就是“固定值K1-K3-K2-K4”,这样就实现了生成注册码的过程了。示例代码如下:
uses StrUtils;//返回5位随机数function MakeRandom():String;vari:integer;countStr:string;begincountStr:='';Randomize;for i:=1 to 10 dobeginCountStr:=CountStr+IntToStr(Random(i)+1);end;Result:=CountStr;end;procedure TForm1.Button1Click(Sender:TObject);varOInt1,OInt2:Integer;Tínt1,TInt2:Integer;1:integer;beginMemo1.Clear;for i:=1 to StrToInt(Editl.Text) dobeginOInt1:=StrToInt(LeftStr(MakeRandom,5));OInt2:=99999-0Int1;TInt1:=StrToInt(RightStr(MakeRandom,5));TInt2:=99999-TIntl;Memo1.Lines.Add('PEFINE'+'-'+IntToHex(OInt1,5)+'-'+IntToHex(TInt1,5)+'-'+IntToHex (OInt2,5)+'-'+IntToHex (TInt2,5));end;end;
0 评论