public sealed class PasswordEngine
{
private static PasswordEngine engine = new PasswordEngine();
public static PasswordEngine Default
{
get
{
return engine;
}
}
private readonly Random rnd = new Random();
private string[] allowedCharacters = new string[]
{
"abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
"1234567890",
"!@#$%^&*()_"
};
public string Generate(int size)
{
return Generate(size, 0, 0, 0);
}
public string Generate(int size, int minCapitalLetters, int minNumbers, int minSpecial)
{
//Parameter validation
if (minCapitalLetters + minNumbers + minSpecial > size)
{
throw new Exception("Parameter size should be less than or equal to minCapitalLetters + minSmallLetters + minNumbers + minSpecial");
}
//Buffer for
char[] buffer = new char[size];
int currentIndex = 0;
//Fill Capital Letters
currentIndex = FillBuffer(currentIndex, minCapitalLetters, 1, buffer);
//Fill Numbers Characters
currentIndex = FillBuffer(currentIndex, minNumbers, 2, buffer);
//Fill Special Characters
currentIndex = FillBuffer(currentIndex, minSpecial, 3, buffer);
//Fill remaining buffer with small characters
int minSmallLetters= size - (minCapitalLetters + minNumbers + minSpecial);
currentIndex = FillBuffer(currentIndex, minSmallLetters, 0, buffer);
RandomizeBuffer(size, buffer);
return new string(buffer);
}
private void RandomizeBuffer(int size, char[] buffer)
{
for (int i = 0; i < size; i++)
{
char source = buffer[i];
int swapIndex = rnd.Next(size);
buffer[i] = buffer[swapIndex];
buffer[swapIndex] = source;
}
}
private int FillBuffer(int startIndex, int count, int row, char[] buffer)
{
for (int i = 0; i < count; i++)
{
rnd.Next(3);
int col = rnd.Next(allowedCharacters[row].Length);
buffer[i+startIndex] = allowedCharacters[row][col];
}
return startIndex + count;
}
}
//This will generate a simple password
string password1 = PasswordEngine.Default.Generate(10);
//This will generate a password with 2 numbers, 2 special and 2 capital letters
string password2 = PasswordEngine.Default.Generate(10, 2, 2, 2);