public override string Generate() { if (!IsUpperCaseLetters && !IsLowerCaseLetters && !IsNumbers && !IsSpecialCharacters) { throw new InvalidOperationException("Impossible to generate a password!"); } PasswordStrength = CalculatePasswordStrength(); var characters = new List <char>(); var builder = new StringBuilder(); var random = new Random(); var upperCaseLetters = Enumerable.Range((byte)'A', (byte)'Z' - (byte)'A').Select(x => (char)x).ToList(); var lowerCaseLetters = Enumerable.Range((byte)'a', (byte)'z' - (byte)'a').Select(x => (char)x).ToList(); var numbers = Enumerable.Range((byte)'0', (byte)'9' - (byte)'0').Select(x => (char)x).ToList(); var specialCharacters = SpecialCharacters.ToCharArray(); if (IsUpperCaseLetters) { characters.AddRange(upperCaseLetters); } if (IsLowerCaseLetters) { characters.AddRange(lowerCaseLetters); } if (IsNumbers) { characters.AddRange(numbers); } if (IsSpecialCharacters) { characters.AddRange(specialCharacters); } if (!characters.Any()) { return(string.Empty); } for (var i = 0; i < PasswordLength; i++) { if (characters.Count == 0) { throw new InvalidOperationException("Impossible to generate a password!"); } var nextIndex = (random.Next(1, characters.Count) * 13) % characters.Count; var nextChar = characters[nextIndex]; builder.Append(nextChar); if (IsExcludeSimilarCharacters) { characters.RemoveAt(nextIndex); } } var tempPassword = builder.ToString(); if (IsUpperCaseLetters) { tempPassword = UpdatePassword(tempPassword, upperCaseLetters); } if (IsLowerCaseLetters) { tempPassword = UpdatePassword(tempPassword, lowerCaseLetters); } if (IsNumbers) { tempPassword = UpdatePassword(tempPassword, numbers); } if (IsSpecialCharacters) { tempPassword = UpdatePassword(tempPassword, specialCharacters); } return(tempPassword); }
public string RandomPassword(int length) { const string CapitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const string SmallLetters = "abcdefghijklmnopqrstuvwxyz"; const string Digits = "0123456789"; const string SpecialCharacters = @"~!@#$%^&*():;[]{}<>,.?/\|"; // Make a list of allowed characters. string allowed = ""; if (cbNumbers.Checked) { allowed = Digits; } if (cbSpecialChar.Checked) { allowed = SpecialCharacters; } if (cbUpperCasing.Checked) { allowed = CapitalLetters; } if (cbLowerCasing.Checked) { allowed = SmallLetters; } // Satisfy requirements. string password = ""; if (cbNumbers.Checked && (password.IndexOfAny(Digits.ToCharArray()) == -1)) { password += RandomChar(Digits); } if (cbSpecialChar.Checked && (password.IndexOfAny(SpecialCharacters.ToCharArray()) == -1)) { password += RandomChar(SpecialCharacters); } if (cbUpperCasing.Checked && (password.IndexOfAny(CapitalLetters.ToCharArray()) == -1)) { password += RandomChar(CapitalLetters); } if (cbLowerCasing.Checked && (password.IndexOfAny(SmallLetters.ToCharArray()) == -1)) { password += RandomChar(SmallLetters); } // Add the remaining characters randomly. while (password.Length < Convert.ToInt32(numericPassLenght.Value)) { password += RandomChar(allowed); } // Randomize (to mix up the required characters at the front). password = RandomizeString(password); return(password); }