0

VB.NETでランダムパスワードジェネレータを作成しようとしています

これまでのところこれを持っていますが、それは私がやろうとしていることの最初のセクションを返すだけです

チェックボックスとしてのパスワードのタイプには、次の順序で3つの入力があります。

Numeric
Alphabetic
Symbols

数値をチェックした場合は数値のパスワードを返しますが、数値とアルファベットをチェックした場合は数値のパスワードのみを返しますが、数値をオフにしてアルファベットのみをチェックした場合はアルファベットのパスワードを返します

アルファベットのパスワードにも3つのオプションがあります。

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

なぜそれが実際に望ましい結果を返さないのか、私には手がかりがありません

どんな助けでもいただければ幸いです

アダム

4

2 に答える 2

3

それは

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_NumericC_Alphabeticがチェックされている場合、はをc_a取得しますが、。のためにTrue行設定はヒットc_bTrueませんElseIf

そのため、パーツを取り外し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)

ByValVB 10.0(.Net 4.0で導入)を使用している場合は、不格好なキーワードを取り除くことができます。また、の.Netネーミングガイドライン


その他の注意事項:

If句のブール値をチェックしている場合は、明示的に次のように記述する必要はありません= True

If a = 3 And Ascii = True Then

次のように書くことができます

If a = 3 AndAlso Ascii Then

これは、循環が短いため、AndAlso一般的に適していることに注意してください。And

useAciiまた、の代わりにパラメータに名前を付ける方がよいでしょうAcii。それはそれをより明確にするでしょう。

于 2012-08-27T08:26:42.653 に答える
0

次のコードを使用して、目的の結果を得ることができます。

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
于 2012-08-27T08:36:24.273 に答える