Генератор паролей с заданной пользователем длиной - PullRequest
0 голосов
/ 09 ноября 2019

Мне нужно написать генератор паролей, который генерирует пароль, который имеет мин. 2 строчные буквы, мин. 2 заглавные буквы, мин. 1 цифра и мин. 1 специальный символ. Это также должна быть заданная пользователем длина. Как я могу дать пароль минимальной длины, используя этот код. Например: 10?

Это то, с чем я страдал, но я пытался ограничить длину без какого-либо успеха, поэтому я просто удалил эти коды:

class Program
{

    private const string Capital = "ABCDEFGHIJKLMNOUP";
    private const string Lower = "abcdefghijklmnoup";
    private const string Digit = "1234567890";
    private const string Spec = "@&#><-[]Łł$ß";
    private const string AllChars = Capital + Lower + Digit + Spec;
    private static Random r = new Random();


    static void Main(string[] args)
    {

        StringBuilder password = new StringBuilder();

        for (int i = 1; i <= 2; i++)
        {
            char capitalLetter = GenerateChar(Capital);
            InsertAtRandomPos(password, capitalLetter);
        }
        for (int i = 1; i <= 2; i++)
        {
            char lowerLetter = GenerateChar(Lower);
            InsertAtRandomPos(password, lowerLetter);
        }
        for (int i = 1; i <= 3; i++)
        {
            char digit = GenerateChar(Digit);
            InsertAtRandomPos(password, digit);
        }
        for (int i = 1; i <= 1; i++)
        {
            char specialLetter = GenerateChar(Spec);
            InsertAtRandomPos(password, specialLetter);
        }
        Console.WriteLine("A jelszava: {0}",password);


        Console.ReadKey();
    }
    private static void InsertAtRandomPos(StringBuilder password, char character)
    {
        int randomPosition = r.Next(password.Length + 1);
        password.Insert(randomPosition, character);
    }
    private static char GenerateChar(string availableChars)
    {
        int randomIndex = r.Next(availableChars.Length);
        char randomChar = availableChars[randomIndex];
        return randomChar;
    }
}

}

1 Ответ

0 голосов
/ 10 ноября 2019

Вот фрагмент кода, который может вам помочь:

private Random r = new Random();
//The chars that you don't want to be included like white spaces commas..etc.
private int[] skipCodes = new[] { 32, 39, 44, 96, 124 };
private string spec = "@&#><-[]Łł$ß";

private string GeneratePassword(
    int length, 
    bool useLowercase, 
    bool useUppercase, 
    bool useDigits, 
    bool useSpecialChars, 
    bool useUserDefined, 
    string userDefined
    )
{
    if (!useLowercase && !useUppercase && !useDigits && !useSpecialChars && !useUserDefined)
        return "";

    StringBuilder sb = new StringBuilder(length * 2);
    int ri = 0;
    int code = 0;            

    while (sb.Length < length)
    {
        code = 0;
        ri = r.Next(0, 5); //get a random option.

        switch (ri)
        {
            case 0:
                {
                    if (useLowercase)
                        code = r.Next(97, 123);
                    break;
                }

            case 1:
                {
                    if (useDigits)
                        code = r.Next(48, 58);
                    break;
                }

            case 2:
                {
                    if (useUppercase)
                        code = r.Next(65, 91);
                    break;
                }

            case 3:
                {
                    if (useSpecialChars)
                    {
                        if (sb.Length % 4 == 0)
                            code = r.Next(33, 48);
                        else if (sb.Length % 4 == 1)
                            code = r.Next(58, 65);
                        else if (sb.Length % 4 == 2)
                            code = r.Next(91, 96);
                        else if (sb.Length % 4 == 3)
                            code = r.Next(123, 126);
                        if (skipCodes.Contains(code))
                            code = 0;
                    }

                    break;
                }

            case 4:
                {
                    if (useUserDefined && !string.IsNullOrEmpty(userDefined))
                    {
                        code = (int)Convert.ToChar(userDefined.Substring(r.Next(0, userDefined.Length), 1));
                    }
                    break;
                }
        }
        if (code > 0)
            sb.Append((char)code);
    }
    return sb.ToString();
}

Затем вы можете сгенерировать пароль следующим образом:

string pass = GeneratePassword(12, true, true, true, false, true, spec);
Console.WriteLine(pass);

Или вызвать его несколько раз, чтобы сгенерировать конкретный шаблон. Настройте его, чтобы удовлетворить ваши потребности.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...