軟件加密-防止非法注冊機制作
作者:狂風來臨 來自: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);
看上面例子不難發(fā)現,采用Hash算法對用戶信息進行運算,用得到的Hash值與用戶輸入的注冊碼比較,如果相等就表示注冊成功,否則注冊失敗。在這個例子里面存在的問題就是Hash(UserName)得到的Hash值與用戶輸入的注冊碼比較,那么正確的注冊碼就會以明文的方式出現在內存中,只要在這個跳轉的的地方下斷就能輕松的得到正確的注冊碼,這個也就是我們上面所說的明文比較了。
接下來我們看一下對稱算法
if DesEncrypt(UserName)=Serial then
MessageBox(Handle,’軟件注冊成功!’,’注冊提示’,MB_OK)
Else
MessageBox(Handle,’軟件注冊失??!’,’ 注冊提示’,MB_OK);
大家看了這種方式也許會發(fā)現和上面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安全實驗室開發(fā)的BEWorkShop,為什么?因為他們做的這套組件提供了RSA1024、RSA2048、RSA4096,運算速度都非???、調用也很方便。下面是本文作者親自測試給出的運算速度的數據:
RSA1024 1秒以內
RSA2048 2秒以內
RSA4096 5秒以內
看了這些數據是不是有點心動呢?就因為他們組件的速度比較快,并且他們的客戶服務態(tài)度極好,個人認為選擇他們的組件是不會錯的。我買的就是他們的組件,感覺好用才寫出來與各位分享的,如果有興趣的讀者可以下載來看看。
主頁: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./