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;