加密算法作用:
选择好的加密算法和软件验证方式,会使得破解软件变得非常困难。如果加密算法和验证方式选择不当,软件会更容易被破解。因此,选择合适的加密算法和验证方法更为重要。
写在前面的话
常用的算法有Hash算法、对称算法(可分为分组算法和流算法)、非对称算法(公钥算法)。哈希算法是不可逆算法,如MD5等;对称算法是单密钥算法密码学算法 大数问题,可以加解密,如DES算法等;公钥算法是一种双密钥算法,公钥算法,私钥是一种算法,类似于RSA算法。
注册码对比分为明码和非明码对比。清晰的代码比较意味着在内存中可以直接看到真假注册码。不清晰的比较指针注册码在内存中是不可见的。
对称算法采用了非明码比对的方法,在一定程度上增加了破解难度,但只要破解者分析是哪个算法密码学算法 大数问题,然后找到key,就可以轻松写出注册机,所以使用对称算法并不是最有效的。理想的。RSA使用公钥加密和私钥解密两个密钥,其解密难度基于大数的分解。而且RSA是一种非对称算法,即使和自己软件使用的RSA有相同的源码,在密钥未知的情况下也很难做注册机。对 RSA 算法最有效的攻击是分解 N 以获得解密密钥。使用RSA算法时,需要增加模数的位数。
使用软件中的SHA算法验证注册码是否正确的方法如下:
if RSADecrypt(注册码,公钥,模数)=用户名 then
begin
MessageBox(Handle,'注册成功','提示',MB_OK);
end
else
MessageBox(Handle,'注册失败','提示',MB_OK);
示例代码如下:
function HexToInt(Hex:String):Integer;
var
I,Res:Integer;
ch:Char;
begin
Res:= 0;
for I := 0 to Length(Hex) do
begin
ch:=Hex[I+1];
if (ch>=0) and (ch<='9') then
Res := Res * 16 + Ord(ch) - Ord('0')
else if (ch>='A') and (ch <= 'F') then
Res := Res * 16 + Ord(ch) - Ord('A') + 10
else if (ch >= 'a') and (ch <='f') then
Res:= Res * 16 + Ord(ch)-Ord('a') + 10
else
raise Exception.Create('Error');
end;
Result := Res;
end;
//以128位例子,256位,512位,768位,1024位的一样
function RSADescryption(InStr,ModStr,KeyStr:String): String;
var
Str,Temp:String;
I:Integer;
RSA:TLBRSA;
begin
Str:= '';
for I := 0 to Length(InStr) div 2 - 1 do
begin
Temp := Copy(InStr,I * 2 + 1,2);
Str := Str + Chr(HexToInt(Temp));
end;
RSA := TLBRSA.Create(nil);
RSA.KeySize := aks128;
RSA.PrivateKey.ModulusAsString := ModStr;
RSA.PrivateKey.ExponentAsString := KeyStr;
Result := RSA.DecryptString(Str);
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
try
if RSAEncryption(edt1.Text,'51757B748A942803C8D558CFD9C5AD83','591B') = edt2.Text then
MessageBox(Handle,'注册成功','提示',MB_OK)
else
MessageBox(Handle,'注册失败','提示',MB_OK)
except
MessageBox(Handle,'注册失败','提示',MB_OK)
end;
end;
RSA算法的注册机方法如下:
//字符串变换成十六进制
function StrToHex(Instr:String): String;
var
StrResult,Temp:String;
i:Integer;
begin
StrResult := '';
Temp := '';
for I := 0 to Length(InStr) - 1 do
begin
Temp := Format('%x',[Ord(InStr[I+1])]);
if Length(Temp) = 1 then
Temp := '0' + Temp;
StrResult := StrResult + Temp;
end;
Result := StrResult;
end;
//以128位为例子,256 位,512位、768位、1024位的一样
function REAEncryption(InStr,ModStr,KeyStr:String): String;
var
RSA:TLBRSA;
TempResult:String;
begin
TempResult := '';
RSA := TLBRSA.Create(nil);
RSA.KeySize := aks128;
RSA.PrivateKey.ModulusAsString := ModStr;
RSA.PrivateKey.ExponentAsString := KeyStr;
Result := RSA.DecryptString(Str);
RSA.Free;
Result := StrToHex(TempResult);
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
edt1.Text := RSAEncryption(edt2.Text,'51757B748A942803C8D558CFD9C5AD83','C1ECF3CB8C36BBFCC3D427BD1EB97A15');
end;
© 版权声明
THE END
喜欢就支持一下吧
请登录后发表评论
注册
社交帐号登录