VB6密码生成工具在中文/俄文PC上失败

VB6密码生成工具在中文/俄文PC上失败,vb6,cultureinfo,Vb6,Cultureinfo,我继承了一些遗留的vb6代码。这是一个为windows pc生成本地管理员密码的工具。该密码应仅包含有限的字符集。这工具很好用。。只要它不在中国或俄罗斯的个人电脑上运行,它就会生成奇怪的密码,没有人能输入。当然,这与当前的操作系统文化有关。Chr(CharCode)函数在这些系统上返回一些奇怪的字符。有人知道如何使这种文化保持不变吗?我只希望该工具生成带有标准ASCII字符的密码 Function generatePassword(PASSWORD_LENGTH) Dim NUMLOWER, N

我继承了一些遗留的vb6代码。这是一个为windows pc生成本地管理员密码的工具。该密码应仅包含有限的字符集。这工具很好用。。只要它不在中国或俄罗斯的个人电脑上运行,它就会生成奇怪的密码,没有人能输入。当然,这与当前的操作系统文化有关。Chr(CharCode)函数在这些系统上返回一些奇怪的字符。有人知道如何使这种文化保持不变吗?我只希望该工具生成带有标准ASCII字符的密码

Function generatePassword(PASSWORD_LENGTH)
Dim NUMLOWER, NUMUPPER, LOWERBOUND, UPPERBOUND, LOWERBOUND1, UPPERBOUND1, SYMLOWER, SYMUPPER
Dim newPassword, count, pwd
Dim pCheckComplex, pCheckComplexUp, pCheckComplexLow, pCheckComplexNum, pCheckComplexSym, pCheckAnswer

  NUMLOWER = 48     ' 48 = 0
  NUMUPPER = 57     ' 57 = 9
  LOWERBOUND = 65   ' 65 = A
  UPPERBOUND = 90   ' 90 = Z
  LOWERBOUND1 = 97  ' 97 = a
  UPPERBOUND1 = 122 ' 122 = z
  SYMLOWER = 33     ' 33 = !
  SYMUPPER = 46     ' 46 = .
  pCheckComplexUp = 0  ' used later to check number of character types in password
  pCheckComplexLow = 0 ' used later to check number of character types in password
  pCheckComplexNum = 0 ' used later to check number of character types in password
  pCheckComplexSym = 0 ' used later to check number of character types in password

  ' initialize the random number generator
  Randomize

  newPassword = ""
  count = 0
  Do Until count = PASSWORD_LENGTH
    ' generate a num between 2 and 10

    ' if num <= 2 create a symbol
    If Int((10 - 2 + 1) * Rnd + 2) <= 2 Then
      'pwd = Int( ( SYMUPPER - SYMLOWER + 1 ) * Rnd + SYMLOWER )

      pwd = Int((UPPERBOUND1 - LOWERBOUND1 + 1) * Rnd + LOWERBOUND1)

      ' if num is between 3 and 5 create a lowercase
    ElseIf Int((10 - 2 + 1) * Rnd + 2) > 2 And Int((10 - 2 + 1) * Rnd + 2) <= 5 Then
      pwd = Int((UPPERBOUND1 - LOWERBOUND1 + 1) * Rnd + LOWERBOUND1)

      ' if num is 6 or 7 generate an uppercase
    ElseIf Int((10 - 2 + 1) * Rnd + 2) > 5 And Int((10 - 2 + 1) * Rnd + 2) <= 7 Then
      pwd = Int((UPPERBOUND - LOWERBOUND + 1) * Rnd + LOWERBOUND)

    Else
      pwd = Int((NUMUPPER - NUMLOWER + 1) * Rnd + NUMLOWER)
    End If

    If Chr(pwd) <> "l" And Chr(pwd) <> "I" Then
      newPassword = newPassword + Chr(pwd)

      count = count + 1
    End If

    'Check to make sure that a proper mix of characters has been created.  If not discard the password.
    If count = (PASSWORD_LENGTH) Then
      For pCheckComplex = 1 To PASSWORD_LENGTH
        'Check for uppercase
        If Asc(Mid(newPassword, pCheckComplex, 1)) > 64 And Asc(Mid(newPassword, pCheckComplex, 1)) < 90 Then
          pCheckComplexUp = 1
        'Check for lowercase
        ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 96 And Asc(Mid(newPassword, pCheckComplex, 1)) < 123 Then
          pCheckComplexLow = 1
        'Check for numbers
        ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 47 And Asc(Mid(newPassword, pCheckComplex, 1)) < 58 Then
          pCheckComplexNum = 1
        'Check for symbols
        ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 32 And Asc(Mid(newPassword, pCheckComplex, 1)) < 47 Then
          pCheckComplexSym = 1
        End If
      Next

      'Add up the number of character sets.  We require 3 or 4 for a complex password.
      pCheckAnswer = pCheckComplexUp + pCheckComplexLow + pCheckComplexNum + pCheckComplexSym

      If pCheckAnswer < 3 Then
        newPassword = ""
        count = 0
      End If
    End If
  Loop
  'The password is good so return it
  generatePassword = newPassword
End Function
函数生成密码(密码长度)
暗数值下限、数值上限、下限、上限、下限1、上限1、符号下限、符号上限
密码,计数,密码
Dim pCheckComplex、pCheckComplexUp、pCheckComplexLow、pCheckComplexNum、pCheckComplexSym、pCheckAnswer
NUMLOWER=48'48=0
NUMUPPER=57'57=9
下限=65'65=A
上限=90'90=Z
下限1=97'97=a
上限1=122'122=z
SYMLOWER=33'33=!
符号上限=46'46=。
pCheckComplexUp=0'稍后用于检查密码中的字符类型数
pCheckComplexLow=0'稍后用于检查密码中的字符类型数
pCheckComplexNum=0'稍后用于检查密码中的字符类型数
pCheckComplexSym=0'稍后用于检查密码中的字符类型数
'初始化随机数生成器
随机化
newPassword=“”
计数=0
直到计数=密码长度
'生成一个介于2和10之间的数值
'如果num 96和Asc(Mid(newPassword,pCheckComplex,1))<123,则
pCheckComplexLow=1
“查一下数字
如果Asc(Mid(新密码,pCheckComplex,1))大于47,Asc(Mid(新密码,pCheckComplex,1))小于58
pCheckComplexNum=1
'检查符号
如果Asc(Mid(新密码,pCheckComplex,1))大于32,Asc(Mid(新密码,pCheckComplex,1))小于47
pCheckComplexSym=1
如果结束
下一个
'将字符集的数量相加。我们需要3或4个复杂的密码。
pCheckAnswer=pCheckComplexUp+pCheckComplexLow+pCheckComplexNum+pCheckComplexSym
如果pCheckAnswer<3,则
newPassword=“”
计数=0
如果结束
如果结束
环
'密码很好,请返回它
generatePassword=newPassword
端函数

由于俄文和中文电脑(以及其他许多电脑)不使用ASCII字符集,而是使用特定于文化的UNICODE,因此我对您的密码程序生成用户无法键入的密码并不感到惊讶

只有远离ASCII,才能获得成功


在线提供了许多开源密码生成器。如果你能找到一个带有源代码的,那么可以说,你会很有收获。

因为俄罗斯和中国的电脑(以及许多其他电脑)不使用ASCII字符集,而是使用特定于文化的UNICODE,所以我对你的密码程序生成用户无法输入的密码并不感到惊讶

只有远离ASCII,才能获得成功


在线提供了许多开源密码生成器。如果你能找到一个有源代码的,那么可以这么说,你会很有收获。

Deanna的评论是正确的。只需将
Chr
更改为
ChrW
并将
Asc
更改为
AscW

  • ChrW
    接受Unicode码点
  • Chr
    接受“ANSI”代码点,特定代码点的含义因系统代码页而异。例如,在中文和俄文代码页上

  • Deanna的评论是正确的。只需将
    Chr
    更改为
    ChrW
    并将
    Asc
    更改为
    AscW

    • ChrW
      接受Unicode码点
    • Chr
      接受“ANSI”代码点,特定代码点的含义因系统代码页而异。例如,在中文和俄文代码页上

    写这篇文章的人显然从未听说过!你试过用ChrW来代替吗?这应该更了解unicode,而不是尝试进行代码页转换。您的代码确实将其限制为Oh,它与option explicit一起工作,它只是全部使用变量:| Oh,并且您对值检查的每个部分使用不同的随机数,这可能会使结果向else块倾斜。您应该在每次迭代中计算一个随机值,然后选择Case。写这篇文章的人显然从未听说过!你试过用ChrW来代替吗?这应该更了解unicode,而不是尝试进行代码页转换。您的代码确实将其限制为Oh,它与option explicit一起工作,它只是全部使用变量:| Oh,并且您对值检查的每个部分使用不同的随机数,这可能会使结果向else块倾斜。您应该在每次迭代中计算一个随机值,并在该值上选择Case。