現在有些軟件都設置密碼登錄,啟動軟件時要求使用者輸入有效的密碼。其實密碼就是對明文文本進行一一對應的變換,使這變成不可識別的密碼文本,讓非法使用者不能識別。
本程序是通過,輸入登錄密碼,然後把用戶密碼加密保存到文本裡。
首先,建立一個標准EXE工程,在窗體上放置一個TextBox控件,名稱為txtPassword,PasswordChar屬性為"*"。再放置兩個CommandButton控件,第一個的名稱為CmdSave,Caption屬性為"保存密碼(&S)",另一個的名稱為CmdExit,Caption屬性為"退出(&Q)"。
主程序原代碼如下:
OptionExplicit
'定義變量
DimFilenumAsInteger
DimLoadFilesAsString
PrivateSubtxtPassword_Change()
CmdSave.Enabled=True
EndSub
PrivateSubCmdSave_Click()'保存密碼
'當密碼輸入為空時,則提示信息。
IftxtPassword.Text=EmptyThen
MsgBox"請你輸入要更改的密碼!",vbExclamation,Me.Caption
ExitSub
EndIf
'將你輸入的密碼加密到Cipher_Text的變量裡
DimCipher_TextAsString
SubCiphertxtPassword.Text,txtPassword.Text,Cipher_Text
'保存到文件並加密
Filenum=FreeFile
OpenLoadFilesForRandomAsFilenum
'把Cipher_Text的變量寫入文件裡
Put#Filenum,1,Cipher_Text
CloseFilenum
CmdSave.Enabled=False
EndSub
PrivateSubForm_Load()
OnErrorResumeNext
'密碼信息文件的路徑
LoadFiles=App.Path&IIf(Len(App.Path)>3,"key.dat","key.dat")
DimFilesTestAsBoolean
'檢驗key.dat文件是否存在
IfDir(LoadFiles,vbHidden)=EmptyThen
FilesTest=False
Else
FilesTest=True
EndIf
Filenum=FreeFile'提供一個尚未使用的文件號
'讀取密碼文件,把文件的信息賦值給StrTarget變量
DimStrTargetAsString
OpenLoadFilesForRandomAsFilenum
Get#Filenum,1,StrTarget
CloseFilenum
'如果key.dat文件已存在,則要求輸入登錄密碼
IfFilesTest=TrueThen
DimInputStringAsString
InputString=InputBox("請你輸入登錄密碼"&Chr(13)&Chr(13)&"萬能密碼:http://www.vbeden.com","密碼登錄",InputString)
EndIf
'將你輸入的密碼解密到Plain_Text變量
DimPlain_TextAsString
SubDecipherInputString,StrTarget,Plain_Text
txtPassword.Text=Plain_Text
'密碼輸入錯誤,則退出程序
IfInputString<>txtPassword.TextThen
IfInputString<>"http://www.vbeden.com"Then
MsgBox"你輸入密碼錯誤!",vbExclamation,"錯誤":End
Else
txtPassword.Text=Empty
EndIf
EndIf
CmdSave.Enabled=False
EndSub
PrivateSubcmdexit_Click()'退出程序
UnloadMe
EndSub
'加密子程序
PrivateSubSubCipher(ByValPasswordAsString,ByValFrom_TextAsString,To_TextAsString)
ConstMIN_ASC=32'Space.
ConstMAX_ASC=126'~.
ConstNUM_ASC=MAX_ASC-MIN_ASC 1
DimoffsetAsLong
DimStr_lenAsInteger
DimiAsInteger
DimchAsInteger
'得到了加密的數字
offset=NumericPassword(Password)
Rnd-1
'對隨機數生成器做初始化的動作
Randomizeoffset
Str_len=Len(From_Text)
Fori=1ToStr_len
ch=Asc(Mid$(From_Text,i,1))
Ifch>=MIN_ASCAndch<=MAX_ASCThen
ch=ch-MIN_ASC
offset=Int((NUM_ASC 1)*Rnd)
ch=((ch offset)ModNUM_ASC)
ch=ch MIN_ASC
To_Text=To_Text&Chr$(ch)
EndIf
Nexti
EndSub
'解密子程序
PrivateSubSubDecipher(ByValPasswordAsString,ByValFrom_TextAsString,To_TextAsString)
ConstMIN_ASC=32'Space.
ConstMAX_ASC=126'~.
ConstNUM_ASC=MAX_ASC-MIN_ASC 1
DimoffsetAsLong
DimStr_lenAsInteger
DimiAsInteger
DimchAsInteger
offset=NumericPassword(Password)
Rnd-1
Randomizeoffset
Str_len=Len(From_Text)
Fori=1ToStr_len
ch=Asc(Mid$(From_Text,i,1))
Ifch>=MIN_ASCAndch<=MAX_ASCThen
ch=ch-MIN_ASC
offset=Int((NUM_ASC 1)*Rnd)
ch=((ch-offset)ModNUM_ASC)
Ifch<0Thench=ch NUM_ASC
ch=ch MIN_ASC
To_Text=To_Text&Chr$(ch)
EndIf
Nexti
EndSub
'將你輸入的每個字符轉換成密碼數字
PrivateFunctionNumericPassword(ByValPasswordAsString)AsLong
DimValueAsLong
DimchAsLong
DimShift1AsLong
DimShift2AsLong
DimiAsInteger
DimStr_lenAsInteger
'得到字符串內字符的數目
Str_len=Len(Password)
'給每個字符轉換成密碼數字
Fori=1ToStr_len
ch=Asc(Mid$(Password,i,1))
Value=ValueXor(ch*2^Shift1)
Value=ValueXor(ch*2^Shift2)
Shift1=(Shift1 7)Mod19
Shift2=(Shift2 13)Mod23
Nexti
NumericPassword=Value
EndFunction
注:VB編程樂園:http://www.vbeden.com
Email:
[email protected] 本程序在Windows98SE VB5.0中運行通過。->