分享

软件加密

 独孤求财 2012-03-20

软件加密-防止非法注册机制作

时间:2011-5-26来源:yang 作者: peng点击: 33次

软件加密-防止非法注册机制作
作者:狂风来临 来自:http://www./

现在很多软件在软件加密部分采用的基本都是明码比较的方式,或者是简单的加密算法,很容易就被别人破解然后写出注册机。为了提供软件的加密强度,本文从基本的加密知识开始说起,使你对自己的软件要怎么加密、或是要怎么改进现有加密方法心里有个数。

从算法说起,现在有太多的加密算法,如:Hash算法(包括MD5、SHA、CRC等)、对称算法又可以分为流密码(SEAL、RC4等)和分组算法(DES、AES等)、公开密钥算法(RSA等)、椭圆曲线算法(ECC)等。Hash类算法是不可逆的算法,一般用于作为数据的校验算法;对称算法属于可逆算法,可以用于加密解密;公开密钥算法也用于加密、解密和数字签名;椭圆曲线算法也用于加密、解密。

那么我把上面的算法引申到软件加密里面来看,首先是Hash算法
if Hash(UserName)=Serial then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’软件注册失败!’,’注册提示’,MB_OK);
看上面例子不难发现,采用Hash算法对用户信息进行运算,用得到的Hash值与用户输入的注册码比较,如果相等就表示注册成功,否则注册失败。在这个例子里面存在的问题就是Hash(UserName)得到的Hash值与用户输入的注册码比较,那么正确的注册码就会以明文的方式出现在内存中,只要在这个跳转的的地方下断就能轻松的得到正确的注册码,这个也就是我们上面所说的明文比较了。

接下来我们看一下对称算法
if DesEncrypt(UserName)=Serial then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’软件注册失败!’,’ 注册提示’,MB_OK);
大家看了这种方式也许会发现和上面Hash方式的很相似,对,是一样的方式,也是先加密用户信息然后和用户输入的注册码进行比较,这样的话真正的注册也会以明文的方式存在以内存,在这个跳转的地方下断也能轻松得到正确的注册码。既然都是这样,那我们应该怎么来改正呢?
If UserName=DesDecrypt(Serial) then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’软件注册失败!’,’ 注册提示’,MB_OK);
上面这段代码是先把用户输入的注册码解密以后和用户信息比较,如果相同那么就注册成功,否则注册码。这样的话注册码比较就不是以明码的方式存在了,如果别人要写注册机的话就要去分析DesDecrypt是什么算法,然后才能写出注册了,难度是不是就提供了很多?这也就是所谓的非明码比较。上面这个采用的是对称算法,它的安全主要是依赖以密钥,那么我们在使用的时候应该怎么来保护密钥呢?
If UserName=DesDecrypt(Serial,MD5(Key)) then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’ 软件注册成功!’,’注册提示’,MB_OK);
利用Hash类算法对密钥进行运算,运算得到的值才是最后的密钥,别人如果只是得到Key那么应用同样的算法做出的注册机也是不正确的,因为真正的Key是MD5(Key)。这样就起到了保护Key的作用的。

如果别人分析程序,找出真正的Key,那么用这样的方式加密也是不安全的,那到底什么样的算法才安全呢?在这里极力推荐使用公开密钥算法(如RSA等),为什么呢?因为这类算法用做加密的密钥不同于用做解密的密钥,而且解密密钥不能根据加密密钥计算出来。加密密钥可以公开,也就是公钥,而解密密钥是不能公开的,也就是私钥。RSA的的安全性是基于数学难题的,也就是大整数因子分解。下面我们来看看怎么用RSA来是显示软件加密。
if UserName=RSADecrypt(Serila,PubicKey) then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’软件注册失败!’,’ 注册提示’,MB_OK);
对RSA最有效的攻击方法就是分解N,为了在短时间内N被分解,建议密钥是用1024位(比如2048位、4096位)以上。上面说了这么多概念性的东西,下面我们用一个实际的例子来表述一下。

由于使用RSA的密钥的位数越多速度越慢,读者在使用的时候应该有选择性的使用,在这里推荐BitEncrypt安全实验室开发的BEWorkShop,为什么?因为他们做的这套组件提供了RSA1024、RSA2048、RSA4096,运算速度都非常快、调用也很方便。下面是本文作者亲自测试给出的运算速度的数据:
RSA1024 1秒以内
RSA2048 2秒以内
RSA4096 5秒以内
看了这些数据是不是有点心动呢?就因为他们组件的速度比较快,并且他们的客户服务态度极好,个人认为选择他们的组件是不会错的。我买的就是他们的组件,感觉好用才写出来与各位分享的,如果有兴趣的读者可以下载来看看。
主页:http://www./
邮件:bitencrypt@163.com
客户服务QQ:136284742

本文的例子使用BEWorkShop组件来进行演示。
注册验证例子:
//获取硬盘系列号,作为加解密依据
procedure TMainFrm.FormCreate(Sender: TObject);
begin
  GetHDSerial();
  Edit2.Text:=TempResult;
end;

//由于注册码太长,所以采用文件的方式导入
procedure TMainFrm.Button1Click(Sender: TObject);
var
  FileName:String;
begin
  OpenDialog1.Filter:=‘授权文件(*.dat)|*.dat‘;
  if OpenDialog1.Execute then
    FileName:=OpenDialog1.FileName;
  if FileName=‘‘ then//如果没有选择文件退出
    Exit;  
  Memo1.Lines.LoadFromFile(FileName);
end;

//注册验证模块
procedure TMainFrm.Button2Click(Sender: TObject);
var
  InStr:String;
begin
  if Edit1.Text=‘‘ then
    begin
      MessageBox(Handle,‘用户名不能空请重新输入!‘,‘注册提示‘,MB_OK+MB_ICONINFORMATION);
      Exit;
    end;
  if Memo1.Text=‘‘ then
    begin
      MessageBox(Handle,‘注册码不能空请重新输入!‘,‘注册提示‘,MB_OK+MB_ICONINFORMATION);
      Exit;
    end;
  InStr:=Memo1.Text;
  RSADecrypt(PChar(InStr),PChar(‘11‘),PChar(‘A7F4FDEC1F2DD8773A18AD32FC212593DD6A2C64227CF3726720189BF8558703E74504E02084A56ECC1130C0F4AE31271B4E77BE58A39BD0A7C5CA501AD8027D87C4C8291835‘+‘CA6B0150C8209213B74439F710D8C92F6BDDC4A1F1A999B9FAC6C62BE339612FC52F150F514431071026BFE6376F5260B5C44B07E4E25D502265‘));
  if TempResult=(Edit1.Text+Edit2.Text) then
    Button2.Enabled:=False;
end;
上面程序实现了注册码验证例子,介绍一下RSADecrypt函数,第一个参数是输入的注册码,第二个参数是公密钥,第三个参数是模数。接口我是调用他们已经定义好的。

下面我们来实现注册机例子:
procedure TForm1.Button2Click(Sender: TObject);
var
  FileName,InfoStr:String;
begin
  FileName:=ExtractFilePath(Application.ExeName)+‘Key.dat‘;
  if Edit1.Text=‘‘ then
    begin
      MessageBox(Handle,‘用户名不能为空!‘,‘提示‘,MB_OK+MB_ICONINFORMATION);
      Exit;
    end;
  if Edit2.Text=‘‘ then
    begin
      MessageBox(Handle,‘机器码不能为空!‘,‘提示‘,MB_OK+MB_ICONINFORMATION);
      Exit;
    end;
  InfoStr:=Edit1.Text+Edit2.Text;  
  RSAEncrypt(PChar(InfoStr),PChar(‘1A58A04D32113B0DAEC29DADA50A381731CA6150F659DFE9C9E6EAC321EF4C650123ECAFB4C9835CAC8F3EDD033E76244084C77D3B14A4FD97CEB652D708C92C88EE48183BDDF8EAE1F07D9B3F497C475365468F4756C7A44C8353B80BA1‘+‘97F7128DB6A7F9CFD2DC60BDACB621996FD5A1AD94C502B57A61E00F20BAB8364111‘)
                           ,PChar(‘A7F4FDEC1F2DD8773A18AD32FC212593DD6A2C64227CF3726720189BF8558703E74504E02084A56ECC1130C0F4AE31271B4E77BE58A39BD0A7C5CA501AD8027D87C4C8291835CA6B0150C8209213B74439F710D8C92F6BDDC4A1F1A999B9‘+‘FAC6C62BE339612FC52F150F514431071026BFE6376F5260B5C44B07E4E25D502265‘));
  Memo1.Text:=TempResult;
  Memo1.Lines.SaveToFile(FileName);
  MessageBox(Handle,‘注册码生成成功!‘,‘提示‘,MB_OK+MB_ICONINFORMATION);    
end;
RSADecrypt的第一个参数是需要进行加密的用户信息,比如注册码和用户名;第二个参数是私钥,第三个参数是模数。

从上面的例子可以看出,采用RSA进行加密,有效的防止了非法注册机的制作。是不是只现在这样做就可以防止软件被破解了?不是的,要做到强度高,那么需要的知识也比较多,比如反跟踪、加壳等知识。反跟踪在BEWorkShop组件里面也有接口提供,试用了一下感觉还不错,加壳工具在BEWorkShop里面也提供了,叫做BEProtect(我是购买了以后才收到的),这款壳压缩效率比较高,压缩率高达到50%,并且还有其它一些技术,在这里就不多说了,感兴趣的读者可以自己下载来看看。希望本文能给你在软件加密上带来一点帮助,这里作者只是把自己知道的写出来,如果有什么错误、建议和意见欢迎来信和我探讨。

[注:转载请注明出处,但请保留信息的完整性]
作者:狂风来临 来自:http://www./  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多