软件开发之注册认证,如何使用对称算法作为注册码验证算法?

加密算法作用:

选择好的加密算法和软件校验方式,会使破解软件变得很困难。如果加密算法和校验方式选择不当,则软件破解较为容易。因此选择适当的加密算法和校验方式更为重要。

写在前面的话

常用的算法有Hash算法、对称算法(可分为分组算法和流算法)、非对称算法(公开密钥算法)。Hash算法是一种不可逆的算法,如MD5等;对称算法是一种单密钥算法,可以加密和解密,如DES算法等;公开发密钥算法是一种双密钥算法,公钥算法、私钥是算法,如RSA算法。

注册码比较分为明码和非明码比较,明码比较是指真、假注册码都可以直接在内存中看到。非明码比较指针注册码在内存中不可见

使用对称算法来验证注册码,方式如下:

if Hash(用户名,密钥)=注册码 then  
begin  
	  MessageBox(Handle,\'注册成功\',\'提示\',MB_OK);  
end  
else  
	 MessageBox(Handle,\'注册失败\',\'提示\',MB_OK);  

调用示例代码如下:

var  
	UserName,Serial:String;  
procedure TForm2.btnOKClick(Sender: TObject);  
	begin  
	  UserName :=edt1.Text;  
	  Serial:= edt2.Text;  
	  if DEsencrypt(UserName,\'1122334455\') then  
	    MessageBox(Handle,\'注册成功\',\'提示\',MB_OK);  
	    else  
	    MessageBox(Handle,\'注册失败\',\'失败\',MB_OK);  
end;  

编译后用W32DASM打开,通过“串式参考”找到验证注册的关键代码部分:

:0045043C	 E8E440FBFF 	call 	004045EC
:00450441 	751B			 jne	 00450525
:00450443	 6A00			 push	 00000000

然后用OllyDBG打开程序,使用ctrl G快捷键,在弹出的对话框内输入“0045043C”找到关键的Call代码处,按F2键下断,再按F9键运行起来的程序里面输入用户名和注册码,单击“注册认证”,程序被断下来,寄存器窗口中把真的注册码和假的注册都显示出来了。这样,使用对称算法,也和使用Hash算法一样时明码比较,很容易就被拦截到真的注册码,所以不推荐这样来使用对称算法。

推荐使用对称算法:

if 用户名 = DesDe(用户名,密钥)then  
	begin  
	  MessageBox(Handle,\'注册成功\',\'提示\',MB_OK);  
	end  
	else  
	 MessageBox(Handle,\'注册失败\',\'提示\',MB_OK);  

调用示例代码如下:

	procedure TForm2.btn2Click(Sender: TObject);  
	begin  
	  try  
	    UserName := edt1.Text;  
	    Serial := edt2.Text;  
	    if DESDecrypt(Serial,\'1122334455\') then  
	      MessageBox(Handle,\'注册成功!\',\'提示\',MB_OK)  
	    else  
	      MessageBox(Handle,\'注册失败!\',\'提示\',MB_OK);  
	  except  
	    MessageBox(Handle,\'注册失败!\',\'提示\',MB_OK)  
	  end;  
	end;  

编译以后用W32DASM找到关键比较代码,再用OllyDBG加载下找不到对应的信息,这种方式属于非明码比较方式。这样就使破解者要深入分析软件使用了哪种算法以后才可以破解(暴力破解除外,暴力破解指暴力修改软件的关键跳转来实现对软件的破解,防止程序被爆破的最好办法就是校验文件的完整性)软件。

还可以使用多种对称算法采用非明码比较的方式来实现对注册码的验证,注册验证的实现方式如下:

	if DesDe(BlowFishDe(用户名,密钥),密钥)=用户名 then  
	begin  
	  MessageBox(Handle,\'注册成功\',\'提示\',MB_OK);  
	end  
	else  
	 MessageBox(Handle,\'注册失败\',\'提示\',MB_OK);  

调用示例代码如下:

	uses Blowfish,DESUnit;  
	function BlowFishDe(InStr,KeyStr:String):String;  
	var   
	   BL:TBlowfish;  
	   Str:String;  
	begin  
	   BL := TBlowFish.Create;  
	   BL.InitialiseString(KeyStr);  
	   BL.DecString(InStr,Str);  
	   BL.Destroy;  
	   Result := Str;  
	end; 
procedure TForm2.btn3Click(Sender: TObject);  
	var  
	  UserName,Serial:String;  
	begin  
	  try  
	    UserName := edt1.Text;  
	    Serial := edt2.Text;  
	    if DESDecrypt(BlowFishDe(Serial,\'bpmfdtnl\'),\'BPMFDTNL\') =UserName then  
	      MessageBox(Handle,\'注册成功\',\'提示\',MB_OK)  
	      else  
	      MessageBox(Handle,\'注册失败\',\'提示\',MB_OK);  
	  except on E: Exception do  
	      MessageBox(Handle,\'注册失败\',\'提示\',MB_OK);  
	  end;  
	end;  

在上面例子中只使用了两种算法,也可以用更多算法来实现注册码检验,但都要采用非明码的方式比较注册码。虽然选择的算法是越多越好,单考虑到算法的运算速度,不然会影响软件的运行速度,所以选3~5种即可。

对注册码进行非明码比较的时候,不管采用几种对称算法,密钥都是以明文的方式提供的。实际应用过程中需要对密钥进行以下变换,可以用Hash算法作为变换算法。

单算法时采用如下方式(非明码比较):

if 用户名=DesDe(用户名,MD5(密钥)) then  
begin  
  MessageBox(Handle,\'注册成功\',\'提示\',MB_OK);  
end  
else  
 MessageBox(Handle,\'注册失败\',\'提示\',MB_OK);  

多算法时采用如下方式(非明码比较):

if 用户名=BlowFishDe(注册码,MD5(密钥),MD5(密钥))=用户名then  
	begin  
	  MessageBox(Handle,\'注册成功\',\'提示\',MB_OK);  
	end  
	else  
	 MessageBox(Handle,\'注册失败\',\'提示\',MB_OK);  

应用MD5算法作为变换算法,密钥不是MD5(密钥)里面的密钥,而是经MD5运算以后得到的值才是最后的密钥。此处只是以MD5为例,在应用的时候可以选用其他的Hash算法,如SHA等。

内容出处:,

声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.net/procedure/22977.html

发表评论

登录后才能评论