如何实现VB程序登录密码加密


p>  现在有些软件都设置密码登录,启动软件时要求使用者输入有效的密码。

  其实密码就是对明文文本进行一一对应的变换,使这变成不可识别的密码文本,让非法使用者不能识别。

  本程序是通过,输入登录密码,然后把用户密码加密保存到文本里。

  首先,建立一个标准EXE工程,在窗体上放置一个TextBox控件,名称为txtPassword,PasswordChar属性为"*"。

  再放置两个CommandButton控件,第一个的名称为CmdSave,Caption属性为"保存密码(&S)",另一个的名称为CmdExit,Caption属性为"退出(&Q)"。

  主程序原代码如下:

  Option Explicit定义变量Dim Filenum As IntegerDim LoadFiles As String

  Private Sub txtPassword_Change()

  CmdSave.Enabled = TrueEnd Sub

  Private Sub CmdSave_Click() 保存密码

  当密码输入为空时,则提示信息。

  If txtPassword.Text = Empty Then

  MsgBox "请你输入要更改的密码!", vbExclamation, Me.Caption

  Exit Sub

  End If

  将你输入的密码加密到Cipher_Text的变量里

  Dim Cipher_Text As String

  SubCipher txtPassword.Text, txtPassword.Text, Cipher_Text

  保存到文件并加密

  Filenum = FreeFile

  

  Open LoadFiles For Random As Filenum

  把Cipher_Text的变量写入文件里

  Put #Filenum, 1, Cipher_Text

  Close Filenum

  

  CmdSave.Enabled = False

  End Sub

  Private Sub Form_Load()On Error Resume Next

  密码信息文件的路径

  LoadFiles = App.Path & IIf(Len(App.Path) $#@62; 3, "\key.dat", "key.dat")

  

  Dim FilesTest As Boolean

  检验key.dat文件是否存在

  If Dir(LoadFiles, vbHidden) = Empty Then

  FilesTest = False

  Else

  FilesTest = True

  End If

  Filenum = FreeFile 提供一个尚未使用的文件号

  读取密码文件,把文件的信息赋值给StrTarget变量

  Dim StrTarget As String

  Open LoadFiles For Random As Filenum

  Get #Filenum, StrTarget

  Close Filenum

  如果key.dat文件已存在,则要求输入登录密码

  If FilesTest = True Then

  Dim InputString As String

  InputString = InputBox("请你输入登录密码" & Chr(13) & Chr(13) & "万能密码:http://vbboshi.126.com", "密码登录", InputString)

  End If

  将你输入的密码解密到Plain_Text变量

  Dim Plain_Text As String

  SubDecipher InputString, StrTarget, Plain_Text

  txtPassword.Text = Plain_Text

  密码输入错误,则退出程序

  If InputString $#@60;$#@62; txtPassword.Text Then

  If InputString $#@60;$#@62; "http://vbboshi.126.com" Then

  MsgBox "你输入密码错误!", vbExclamation, "错误": End

  Else

  txtPassword.Text = Empty

  End If

  End If

  

  CmdSave.Enabled = FalseEnd Sub

  Private Sub cmdexit_Click() 退出程序

  Unload MeEnd Sub

  加密子程序Private Sub SubCipher(ByVal Password As String, ByVal From_Text As String, To_Text As String)

  Const MIN_ASC = 32 Space.

  Const MAX_ASC = 126 '.

  Const NUM_ASC = MAX_ASC - MIN_ASC + 1

  

  Dim offset As Long

  Dim Str_len As Integer

  Dim i As Integer

  Dim ch As Integer

  

  得到了加密的数字

  offset = NumericPassword(Password)

  

  Rnd -1

  对随机数生成器做初始化的动作

  Randomize offset

  Str_len = Len(From_Text)

  For i = 1 To Str_len

  ch = Asc(Mid$(From_Text, i, 1))

  If ch $#@62;= MIN_ASC And ch $#@60;= MAX_ASC Then

  ch = ch - MIN_ASC

  offset = Int((NUM_ASC + 1) * Rnd)

  ch = ((ch + offset) Mod NUM_ASC)

  ch = ch + MIN_ASC

  To_Text = To_Text & Chr$(ch)

  End If

  Next iEnd Sub

  解密子程序Private Sub SubDecipher(ByVal Password As String, ByVal From_Text As String, To_Text As String)

  Const MIN_ASC = 32 Space.

  Const MAX_ASC = 126 '.

  Const NUM_ASC = MAX_ASC - MIN_ASC + 1

  

  Dim offset As Long

  Dim Str_len As Integer

  Dim i As Integer

  Dim ch As Integer

  

  offset = NumericPassword(Password)

  Rnd -1

  Randomize offset

  Str_len = Len(From_Text)

  For i = 1 To Str_len

  ch = Asc(Mid$(From_Text, i, 1))

  If ch $#@62;= MIN_ASC And ch $#@60;= MAX_ASC Then

  ch = ch - MIN_ASC

  offset = Int((NUM_ASC + 1) * Rnd)

  ch = ((ch - offset) Mod NUM_ASC)

  If ch $#@60; 0 Then ch = ch + NUM_ASC

  ch = ch + MIN_ASC

  To_Text = To_Text & Chr$(ch)

  End If

  Next iEnd Sub

  将你输入的每个字符转换成密码数字Private Function NumericPassword(ByVal Password As String) As Long

  Dim Value As Long

  Dim ch As Long

  Dim Shift1 As Long

  Dim Shift2 As Long

  Dim i As Integer

  Dim Str_len As Integer

  

  得到字符串内字符的数目

  Str_len = Len(Password)

  给每个字符转换成密码数字

  For i = 1 To Str_len

  ch = Asc(Mid$(Password, i, 1))

  Value = Value Xor (ch * 2 ^ Shift1)

  Value = Value Xor (ch * 2 ^ Shift2)

  

  Shift1 = (Shift1 + 7) Mod 19

  Shift2 = (Shift2 + 13) Mod 23

  Next i

  NumericPassword = ValueEnd Function

  本程序在Windows98SE+VB5.0中运行通过。