尝试在VB.NET 中生成随机密码生成器
到目前为止已经得到了这个,但它只返回我试图做的第一部分
我有3个输入作为复选框的密码类型,按照这个顺序:
Numeric
Alphabetic
Symbols
如果我选中了数字,它会返回一个数字密码,但如果我选中数字和字母,它只返回一个数值密码,尽管如果我取消选中数字,只选中字母,它就会返回和字母密码
字母密码还有三个选项:
Uppercase
Lowercase
Mixed Case
当与字母一起使用时,实际返回正确的密码
这是我迄今为止的代码:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
C_Numeric.Checked = True
R_Upper.Checked = True
End Sub
Private Sub B_Generate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_Generate.Click
Dim c_a As Boolean = False
Dim c_b As Boolean = False
Dim c_c As Boolean = False
Dim a As Integer
If C_Numeric.Checked = True Then
c_a = True
ElseIf C_Alphabetic.Checked = True Then
c_b = True
ElseIf C_Symbols.Checked = True Then
c_c = True
End If
If R_Lower.Checked = True Then
a = 1
ElseIf R_Upper.Checked = True Then
a = 2
ElseIf R_Mixed.Checked = True Then
a = 3
End If
If C_Numeric.Checked = True Or C_Alphabetic.Checked = True Or C_Symbols.Checked = True Then
TextBox1.Text = GenPass(NumericUpDown1.Value, c_a, c_b, c_c, a)
End If
End Sub
Function GenPass(ByVal Length As Integer, ByVal Num As Boolean, ByVal Alp As Boolean, ByVal Ascii As Boolean, ByVal Complexity As Integer)
Dim rand As New Random
Dim Pass As String = ""
Do Until Pass.Length = Length
Dim a As Integer
a = rand.Next(1, 3 + 1)
If a = 1 And Num = True Then
Pass += ChrW(rand.Next(Asc("0"), Asc("9") + 1))
End If
If a = 2 And Alp = True Then
If Complexity = 1 Then
Pass += ChrW(rand.Next(Asc("a"), Asc("z") + 1))
ElseIf Complexity = 2 Then
Pass += ChrW(rand.Next(Asc("A"), Asc("Z") + 1))
ElseIf Complexity = 3 Then
Dim b As Integer
b = rand.Next(1, 2 + 1)
If b = 1 Then
Pass += ChrW(rand.Next(Asc("A"), Asc("Z") + 1))
ElseIf b = 2 Then
Pass += ChrW(rand.Next(Asc("a"), Asc("z") + 1))
End If
End If
End If
If a = 3 And Ascii = True Then
Dim b As Integer
b = rand.Next(1, 4 + 1)
If b = 1 Then
Pass += ChrW(rand.Next(Asc("!"), Asc("/") + 1))
ElseIf b = 2 Then
Pass += ChrW(rand.Next(Asc(":"), Asc("@") + 1))
ElseIf b = 3 Then
Pass += ChrW(rand.Next(Asc("["), Asc("`") + 1))
ElseIf b = 4 Then
Pass += ChrW(rand.Next(Asc("{"), Asc("~") + 1))
End If
End If
Loop
Return (Pass)
End Function
例如(假设所有答案的长度为16):
使用混合大小写选择数字和字母应返回:
eVOv3fyTmW7mvH24 CZOXVzeo1EzLu7Al V313p9VLW0Bz7Zfi
但却返回:
8343299372194893 7303963979299152 3918539496952829
我不知道为什么它实际上没有返回想要的结果
如有任何帮助,将不胜感激
Adam
这是因为
If C_Numeric.Checked = True Then
c_a = True
ElseIf C_Alphabetic.Checked = True Then
c_b = True
ElseIf C_Symbols.Checked = True Then
c_c = True
End If
因此,如果检查了C_Numeric
和C_Alphabetic
,则c_a
得到True
,但由于ElseIf
,将不会命中线设置c_b
到True
。
因此,请移除Else
部分。
此外,您可以通过编写以下代码来简化此代码:
c_a = C_Numeric.Checked
c_b = C_Alphabetic.Checked
c_c = C_Symbols.Checked
而不是If
子句,或者更好的方法是,通过调用来消除那些不必要的变量
GenPass(NumericUpDown1.Value, C_Numeric.Checked, C_Alphabetic.Checked, C_Symbols.Checked, a)
可能还有更多的改进。例如,与其将Complexity
参数作为Integer
传递,不如创建一个Enum
:
Enum Complexity
LowerOnly
UpperOnly
Mixed
End Enum
Function GenPass(Length As Integer, Num As Boolean, Alp As Boolean, Ascii As Boolean, Complexity As Complexity)
如果您使用的是VB10.0(与.Net 4.0一起引入),则可以去掉笨重的ByVal
关键字。此外,.中的.Net命名指南
更多注意事项:
如果在If
子句中检查布尔值,则不需要显式编写= True
:
If a = 3 And Ascii = True Then
可以写成
If a = 3 AndAlso Ascii Then
注意,AndAlso
通常更适合作为And
,因为它具有短路行为。
此外,最好将参数命名为useAcii
,而不是Acii
。它会使它更加清晰。
您可以使用以下代码来获得所需的结果。
If C_Numeric.Checked = True Then
c_a = True
End If
If C_Alphabetic.Checked = True Then
c_b = True
End If
If C_Symbols.Checked = True Then
c_c = True
End If