正文 基於VFP的數據加密之路(2 / 3)

首先建立兩個數據庫(table),一個用來存放口令及對應的用戶名(稱為“口令庫”),另一個存放用戶登錄使用情況(稱為“登錄庫”)。再建立兩個窗口(form),一個用來檢查口令,另一個用來修改口令。接下來定義兩個過程(procedure),一個用來給口令加密(“加密過程”),另一個用給口令解密(“解密過程”)。“加密過程”是把密碼經加密運算後存入口令庫,“解密過程”實際上是把輸入的密碼經加密運算後與口令庫內的密碼進行比較,並不解密。為了使密碼輸入時不被看見,密碼輸入時顯示隱性文字。“解密過程”基本代碼如下:

parameter password

pas=“”

n1=asc(substr(name,1,1)) &&取姓名的第一個拚音字母,換算成ASCII碼

n2=asc(substr(name,2,1)) &&作為加密的鍵值

n3=asc(substr(name,3,1))

n=int((n1+n2+n3)/3)

for i=1 to len(trim(password)) &&使用BITXOR()函數對密碼進行解密

tempchr=bitxor(asc(substr(password,i,1)),n)

pas=pas+chr(tempchr)

endfor

locate for klk.user_id=name&&與口令庫內的與姓名相對應的口令進行比較

if (klk.key

pas) and (password

“hg”)

result=.f.

else

result=.t.

endif

return result

bitxor ()函數是vfp特有的函數,它將函數的兩個參數轉換成二進製數,並且執行“與”操作,返回一個十進製的結果。加上密碼鍵值n(此處是取姓名的第一個拚音字母,經求和,再取平均值,再取整運算,換算成ASCII碼),得到每人一個的密碼。加密過程是解密過程的逆運算,基本代碼如下:

parameter password

pas=“”

for i=1 to len(trim(password))

n1=asc(substr(name,1,1))

n2=asc(substr(name,2,1))

n3=asc(substr(name,3,1))

n=int((n1+n2+n3)/3)

tempchr=bitxor(asc(substr(password,i,1)),n)

pas=pas+chr(tempchr)

endfor

replace key with pas

檢查密碼的思路是:先到輸入姓名的文字框內取姓名,再到口令庫內查找姓名,如果找不到姓名,返回消息窗口“您不是指定用戶,請與係統管理員聯係!”,係統退出;如果找到了用戶姓名,則繼續進行。把輸入的口令和姓名送到“解密過程”中進行運算,“解密過程”將其解密,並與口令庫內的數據進行比較,如果不正確,開始計數,要求重新輸入密碼,三次不正確,退出係統。如果正確,釋放當前窗口,進入係統。主要代碼如下:

name=trim(ThisForm.Text1.value)

if empty(name)

a=messagebox(“請輸入用戶名!”,0+48,“信息窗口”)

ThisForm.Text1.setfocus