Option Explicit On
Option Strict On
Imports System
Imports System.Text
Public Class PasswordGenerator
Private PWD_LENGTH As Integer
#Region " Random Number Generation "
'The following class and code in this region was designed
'by Phill64 on http://www.vbforums.com. All credit for
'random number generation goes to him.
Protected Class TrueRandom2
Public Function GetDouble() As Double
Dim r As New Security.Cryptography.RNGCryptoServiceProvider
Dim bt(15) As Byte
r.GetNonZeroBytes(bt)
Dim d As Double = bt(0)
For i As Integer = 1 To 15
d *= bt(i)
Next
d /= (10 ^ (Math.Floor(d).ToString.Length))
d -= Math.Floor(d)
Return d
End Function
Public Function GetNext(ByVal lower As Integer, ByVal upper As Integer) As Integer
'returns a random itneger between specified bounds
'ratio a random decimal number to the required bounds
'Changed CInt to Convert.ToInt32 Derek
Return Convert.ToInt32((lower + (GetDouble() * (upper - lower))))
End Function
Public Function GetNext() As Integer
'returns a random integer
'Changed CInt to Convert.ToInt32 Derek
Return Convert.ToInt32((GetDouble() * Integer.MaxValue))
End Function
Public Function GetLong() As Long
'Changed CLng to Convert.ToInt64 Derek
Return Convert.ToInt64((GetDouble() * Long.MaxValue))
End Function
End Class
#End Region
Public Sub New()
PWD_LENGTH = 13
End Sub
Public Sub New(ByVal PasswordLength As Integer)
PWD_LENGTH = PasswordLength
End Sub
Public Function Generate() As String
Dim pwd As String = String.Empty
Dim rng As New TrueRandom2
For i As Integer = 1 To PWD_LENGTH
Dim GoodValue As Boolean = False
Do While Not GoodValue
'ASCII value range 32 to 126.
Dim value As Integer = rng.GetNext(32, 126)
pwd += Convert.ToChar(value)
GoodValue = True
Loop
Next
rng = Nothing
Return pwd
End Function
Public Function Generate(ByVal AsciiMin As Integer, ByVal AsciiMax As Integer) As String
Dim pwd As String = String.Empty
Dim rng As New TrueRandom2
For i As Integer = 1 To PWD_LENGTH
Dim GoodValue As Boolean = False
Do While Not GoodValue
'ASCII value range AsciiMin to AsciiMax, to get the correct
'range we need to take AsciiMax - AsciiMin = (Ascii Range)
Dim value As Integer = rng.GetNext(AsciiMin, AsciiMax)
pwd += Convert.ToChar(value)
GoodValue = True
Loop
Next
rng = Nothing
Return pwd
End Function
Public Function Generate(ByVal AsciiMin As Char, ByVal AsciiMax As Char) As String
Dim pwd As String = String.Empty
Dim rng As New TrueRandom2
Dim iAsciiMin As Integer = Convert.ToInt32(AsciiMin)
Dim iAsciiMax As Integer = Convert.ToInt32(AsciiMax)
For i As Integer = 1 To PWD_LENGTH
Dim GoodValue As Boolean = False
Do While Not GoodValue
'ASCII value range AsciiMin to AsciiMax, to get the correct
'range we need to take AsciiMax - AsciiMin = (Ascii Range)
Dim value As Integer = rng.GetNext(iAsciiMin, iAsciiMax)
pwd += Convert.ToChar(value)
GoodValue = True
Loop
Next
rng = Nothing
Return pwd
End Function
Public Function Generate(ByVal ExcludeValues As String()) As String
Dim pwd As String = String.Empty
Dim rng As New TrueRandom2
Dim ASCII_VAL(ExcludeValues.Length - 1) As Integer
'Convert the excluded values to the the ASCII
'equivalent of the character represention and
'add it to the ASCII_VAL array.
For i As Integer = 0 To ExcludeValues.Length - 1
ASCII_VAL(i) = Convert.ToInt32(ExcludeValues(i).Chars(0))
Next
Array.Sort(ASCII_VAL)
For i As Integer = 1 To PWD_LENGTH
Dim GoodValue As Boolean = False
Do While Not GoodValue
'ASCII value range 32 to 126.
Dim value As Integer = rng.GetNext(32, 126)
'Determine if the value that was generated is
'not an excluded value.
If Array.BinarySearch(ASCII_VAL, value) < 0 Then
pwd += Convert.ToChar(value)
GoodValue = True
End If
Loop
Next
rng = Nothing
Return pwd
End Function
Public Function Generate(ByVal AsciiMin As Integer, ByVal AsciiMax As Integer, ByVal ExcludeValues As String()) As String
Dim pwd As String = String.Empty
Dim rng As New TrueRandom2
Dim ASCII_VAL(ExcludeValues.Length - 1) As Integer
'Convert the excluded values to the the ASCII
'equivalent of the character represention and
'add it to the ASCII_VAL array.
For i As Integer = 0 To ExcludeValues.Length - 1
ASCII_VAL(i) = Convert.ToInt32(ExcludeValues(i).Chars(0))
Next
Array.Sort(ASCII_VAL)
For i As Integer = 1 To PWD_LENGTH
Dim GoodValue As Boolean = False
Do While Not GoodValue
'ASCII value range AsciiMin to AsciiMax, to get the correct
'range we need to take AsciiMax - AsciiMin = (Ascii Range)
Dim value As Integer = rng.GetNext(AsciiMin, AsciiMax)
'Determine if the value that was generated is
'not an excluded value.
If Array.BinarySearch(ASCII_VAL, value) < 0 Then
pwd += Convert.ToChar(value)
GoodValue = True
End If
Loop
Next
rng = Nothing
Return pwd
End Function
Public Function Generate(ByVal AsciiMin As Char, ByVal AsciiMax As Char, ByVal ExcludeValues As String()) As String
Dim pwd As String = String.Empty
Dim rng As New TrueRandom2
Dim iAsciiMin As Integer = Convert.ToInt32(AsciiMin)
Dim iAsciiMax As Integer = Convert.ToInt32(AsciiMax)
Dim ASCII_VAL(ExcludeValues.Length - 1) As Integer
'Convert the excluded values to the the ASCII
'equivalent of the character represention and
'add it to the ASCII_VAL array.
For i As Integer = 0 To ExcludeValues.Length - 1
ASCII_VAL(i) = Convert.ToInt32(ExcludeValues(i).Chars(0))
Next
Array.Sort(ASCII_VAL)
For i As Integer = 1 To PWD_LENGTH
Dim GoodValue As Boolean = False
Do While Not GoodValue
'ASCII value range AsciiMin to AsciiMax, to get the correct
'range we need to take AsciiMax - AsciiMin = (Ascii Range)
Dim value As Integer = rng.GetNext(iAsciiMin, iAsciiMax)
'Determine if the value that was generated is
'not an excluded value.
If Array.BinarySearch(ASCII_VAL, value) < 0 Then
pwd += Convert.ToChar(value)
GoodValue = True
End If
Loop
Next
rng = Nothing
Return pwd
End Function
End Class