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);