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);
        }
Exemple #2
0
        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);
        }