程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用注冊表對delphi程序加密

用注冊表對delphi程序加密

編輯:Delphi
本加密方法分三部分:

    1. 根據對注冊表的搜索結果判定設置對話框的內容。

    2. 若初次使用,則設新密碼;若是已經設置密碼,則進行驗證。

    3. 一個密碼變換小程序(比原來的復雜得多)。當然,如果需要修改密碼的功能,只要將設置密碼部分改動一下即可。

    一、程序啟動時,通過搜索注冊表,判斷是否已有密碼,來確定窗口的顯示內容。不過事先應有以下的聲明然後才能使用:

    在user中加入TRegistry,在var聲明中加入以下幾個窗體變量:

     TheReg: TRegistry;

     KeyName,ValueStr,tempStr:String;

    procedure TfrmPass.FormShow(Sender: TObject);

    begin

     TheReg := TRegistry.Create;

     try TheReg.RootKey := HKEY—LOCAL—MacHINE;

    KeyName := ′SOFTWAREMypassWord′;

    //有該鍵則打開,沒有則創建

    if TheReg.OpenKey(KeyName, True) then begin

    tempStr:=ExtractFileName(Application.ExeName); //讀取密碼

     ValueStr:=TheReg.ReadString(tempStr);

     //密碼不為空則修改窗體為驗證密碼

     if ValueStr<>′′ then begin

     edit2.Visible:=false; frmPass.Caption:=′驗證密碼′;

     edit1.SetFocus; OK.Caption:=′確定′; end

    //密碼為空則修改窗體為設置密碼對話框

    else begin

    showmessage(′第一次使用請設置密碼!′);

     edit2.Visible:=true; frmPass.Caption:=′請設置新密碼′;

     edit1.SetFocus; OK.Caption:=′設置′;

     end; TheReg.CloseKey; end;

    finally TheReg.Free; end; end;

    二、按鈕的響應代碼:包括新設密碼和驗證密碼。

    procedure TfrmPass.OKClick(Sender: TObject);

    begin

     //根據Edit2的顯示與否判斷已有密碼,進行驗證

     if edit2.Visible=false then begin

    if pass(edit1.text)=ValueStr then begin

     showmessage(′密碼正確!′); end

    else begin

     showmessage(′密碼不正確!無權操作!′);

     halt; end; end //無密碼,設置新密碼

     else begin

    if edit1.text=edit2.text then begin

     TheReg := TRegistry.Create;

     TheReg.RootKey := HKEY—LOCAL—MacHINE;

     KeyName := ′SOFTWAREMypassWord′;

     if TheReg.OpenKey(KeyName, True) then

     TheReg.WriteString(tempStr,pass(edit1.text));

     TheReg.CloseKey; end

    else begin

     showmessage(′再次鍵入的密碼不一致,請重輸!′);

     edit1.text:=′′; edit2.text:=′′;

     edit1.SetFocus; end; //進行下一步操作...

     end; end;

    三、密碼變換程序:注意要預先定義。

    這個變換小程序在筆者看來還不算很復雜,只進行了兩次變換,不過,想要破譯也是得費點勁。讀者還可以采用其他的數學函數進行更為復雜的變換。

    function pass(pstr:string):string;

    var str,str1:string;

    i,j:integer;

    begin

     str:=pstr;

     for i:=1 to length(str) do begin

    //進行第一次變換

     j:=(i*i*i mod (i+20))+(i*i mod (i+10))+i*2+1;

     str1:=str1+chr(ord(str[i])+j); //第二次變換

     j:=(i*i*i mod (i+10))+(i*i mod (i+20))+i*2+1;

     str1:=str1+chr(ord(str[i])+j); end;

     pass:=str1;

    end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved