VBCoding Библиотека кодов Visual Basic 6 Другое Усовершенствованный генератор паролей

Visual Basic 6
Усовершенствованный генератор паролей

'S - везде искомая строка - пароль
't - врем. переменная хран. код символа
'p1, p2 , p3 - число определяющее вероятность выбора цифры, заглавной или строчной буквы соответственно
' это не относительная вероятность! она будет высчитываться как p1/(p1+p2+p3), p2/(p1+p2+p3) и p3/(p1+p2+p3)

Private Sub n1()
' В итоге цифры встречаются в 5 раз реже, так как равномерно распределено пространство
'между всеми символами, букв 52(2*26), а цифр 10... :( Уже неправильно
Randomize
Dim s As String
Dim i as integer, t as integer
For i = 1 To 10
    Do
        
        t = 48 + CInt(Rnd * 74)
        Select Case t
            Case Is < 58: ' t=t
            Case Is < 65: t = 0
            Case Is < 91: ' t=t
            Case Is < 97: t = 0
        End Select
    Loop Until t
    s = s & Chr$(t)
Next i
Debug.Print s
End Sub

Private Sub n2()
' Равномерное распределение по группам дает некоторое преимущество, но все еще не упорядочивает
' сам пароль.
Randomize
Dim s As String
Dim i as inеeger, t as integer
For i = 1 To 10

        Select Case CInt(Rnd * 2)
            Case 0: t = 48 + CInt(Rnd * 9)
            Case 1: t = 65 + CInt(Rnd * 25)
            Case 2: t = 97 + CInt(Rnd * 25)
        End Select
    s = s & Chr$(t)
Next i
Debug.Print s
End Sub

Private Sub n3()
' Более точное распределение по позициям символов, так называемое "с памятью",
'т.е. с зависимостью от предыдущих символов
Randomize
Dim s As String, n As Integer
Dim p1 As Single, p2 As Single, p3 As Single

p1 = 1: p2 = 1: p3 = 1

        Select Case CInt(Rnd * (p1 + p2 + p3))
            Case Is < p1:
            p2 = 2: p3 = 2
            t = 48 + CInt(Rnd * 9)
            Case Is < p2:
            p1 = 2: p3 = 2
            t = 65 + CInt(Rnd * 25)
            Case Else:
            p1 = 2: p2 = 2
            t = 97 + CInt(Rnd * 25)
        End Select
    s = Chr$(t)
    
For i = 2 To 10

        Select Case CInt(Rnd * (p1 + p2 + p3))
            Case Is < p1:
            If n = 1 Then p2 = p2 * 2: p3 = p3 * 2 Else p1 = 1: p2 = 1: p3 = 1
            n = 1
            t = 48 + CInt(Rnd * 9)
            Case Is < p1 + p2:
            If n = 2 Then p1 = p1 * 2: p3 = p3 * 2 Else _
                p2 = 1: p3 = 1: If n = 1 Then p1 = 1 Else p1 = p1 * 2
            n = 2
            t = 65 + CInt(Rnd * 25)
            Case Else:
            If n = 3 Then p1 = p1 * 2: p2 = p2 * 2 Else _
                p2 = 1: p3 = 1: If n = 1 Then p1 = 1 Else p1 = p1 * 2
            n = 3
            t = 97 + CInt(Rnd * 25)
        End Select
        
    s = s & Chr$(t)
Next i
Debug.Print s

End Sub

' Если мы добавили к паролю, например, цифру, то вероятность добавления после не буквы будет в 2 раза больше, т.е.
' сначала распределялись как (1,1,1) значит вероятность появления символа любой группы 1/3, после добавления цифры
' (1,2,2) - вероятность появления цифры 1/5, буквы заглавной 2/5, и строчной тоже 2/5, после добавления еще цифры
' 5=1+2+2
' (1,4,4) - вероятность появления цифры 1/9, буквы заглавной 4/9, и строчной тоже 4/9, после добавления еще цифры
' 9 =  1+4+4
' Остается еще одна проблема - в пароле могут меняться местами только буквы - т.е. ЗАГЛАВНАЯстрочнаяЗАГЛАВНАЯстрочная
' и т.д. - поэтому вероятность появления цифры не падает:

' R4B3rTYe5
'Вероятности после каждого символа: R(2,1,2)4(1,1,1),B(1,1,1)3(1,1,1)r(1,1,1)T(2,1,1)Y(4,1,2)e(8,1,1)5(1,1,1)

'!По хорошему также следует убрать при добавлении первого символа возможность поставить там цифру - ведь это не
'соответствует стандартам

Автор: Ташланов Дмитрий, Dreamerland (собака) mail.ru.

 

Добавить комментарий


Защитный код
Обновить

 
VBCoding Библиотека кодов Visual Basic 6 Другое Усовершенствованный генератор паролей  
Powered by Exponenta -