• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Словарь паролей для Венгрии

SNOW_PILOT

New member
12.08.2020
1
0
BIT
0
Нужно сгенерировать словарь по правилам.
1. Максимум и минимум 12 символов
2. Английские буквы верхнего и нижнего регистра
3. Цифры
4. Не более трёх одинаковых символов подряд
5. Одна и только одна буква верхнего регистра
Прощу помощи, как это сделать
 
29.07.2020
41
6
BIT
0
Прощу помощи, как это сделать
Python:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
try:
    from string import digits, ascii_uppercase, ascii_lowercase
    from random import choice, randint, shuffle
    from re import search
    from os import system, name, sys
    from time import sleep
    from colorama import Fore, Back, Style
except ImportError as err:
    exit(err)
# sudo apt install python3-pip
# pip3 install colorama
"""
    The result has at least:
    - Total of 12 symbol
    - One symbol of uppercase letter
    - Random symbol of ascii_lowercase
    - Random number of digits
    - Maximum of three identical characters in a row
"""

def logo():
    """
    Text to ASCII:
    http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20
    """
    logo = [Fore.RED  +  "",
       "  ██▓███   ▄▄▄        ██████   ██████   ▄████ ▓█████  ███▄    █ ",
       " ▓██░  ██▒▒████▄    ▒██    ▒ ▒██    ▒  ██▒ ▀█▒▓█   ▀  ██ ▀█   █ ",
       " ▓██░ ██▓▒▒██  ▀█▄  ░ ▓██▄   ░ ▓██▄   ▒██░▄▄▄░▒███   ▓██  ▀█ ██▒",
       " ▒██▄█▓▒ ▒░██▄▄▄▄██   ▒   ██▒  ▒   ██▒░▓█  ██▓▒▓█  ▄ ▓██▒  ▐▌██▒",
       " ▒██▒ ░  ░ ▓█   ▓██▒▒██████▒▒▒██████▒▒░▒▓███▀▒░▒████▒▒██░   ▓██░",
       " ▒▓▒░ ░  ░ ▒▒   ▓▒█░▒ ▒▓▒ ▒ ░▒ ▒▓▒ ▒ ░ ░▒   ▒ ░░ ▒░ ░░ ▒░   ▒ ▒ ",
       " ░▒ ░       ▒   ▒▒ ░░ ░▒  ░ ░░ ░▒  ░ ░  ░   ░  ░ ░  ░░ ░░   ░ ▒░",
       " ░░         ░   ▒   ░  ░  ░  ░  ░  ░  ░ ░   ░    ░      ░   ░ ░ ",
       "                ░  ░      ░        ░        ░    ░  ░         ░ ",
       ""   + Style.RESET_ALL,
           ]
    for i in range(len(logo)):
        sleep(0.2)
        print(logo[i])


def count_range():
    """ Функция определяет  желаемое количество сгенерированных паролей. """
    while True:
        count = input(Fore.CYAN + "{0:60}: ".format("Задайте желаемое количество сгенерированных паролей", end = '')  + Style.RESET_ALL)
        if count == "":
            print(u"Прекращаю работу программы.")
            raise SystemExit
        if not count.isdigit():                                   # Если строка не состоит из цифр
            print(u"Необходимо ввести число, а не строку.")
            continue
        if int(count) == 0:
            print(u"Количество паролей не может равняться нулю.")
            continue
        if int(count) < 0:
            print(u"Количество паролей не может быть отрицательным.")
            continue
        else:
            count = int(count)
            break
    return count


def length_all_pass():
    """ Функция определяет общую длину пароля. """
    while True:
        min_length = input(Fore.YELLOW + "{0:60}: ".format("Введите минимальную длину пароля", end = '') + Style.RESET_ALL) # Минимальная длина пароля
        if not min_length.isdigit():
            print("Необходимо ввести число, а не строку. ")
            continue
        if min_length < '0':
            print(u"Минимальная длина пароля не может быть отрицательной.")
            continue
        if min_length == '0':
            print(u"Минимальная длина пароля не может равняться нулю.")
            continue
        max_length = input(Fore.YELLOW + "{0:60}: ".format("Введите максимальную длину пароля", end = '') + Style.RESET_ALL)    # Максимальная длина пароля
        if int(max_length) < int(min_length):
            print("Максимальное значение не должно превышать минимального.")
            continue
        if not max_length.isdigit():
            print("Значение должно быть цифрой.")
            continue
        if max_length < '0':
            print(u"Максимальная длина пароля не может быть отрицательной.")
            continue
        if max_length == '0':
            print(u"Максимальная длина пароля не может равняться нулю.")
            continue
        else:
            min_length = int(min_length)
            max_length = int(max_length)
            global length_all_passwd
            length_all_passwd = randint(min_length, max_length)
            break
    return  length_all_passwd


def pass_ascii_uppercase():
    """ Функция формирует часть пароля, состоящая из букв верхнего регистра """
    while True:
        global length_ascii_uppercases                             # Количество (длина) букв верхнего регистра в пароле
        length_ascii_uppercases = input(Fore.RED + "{0:60}: ".format("Введите количество знаков - букв верхнего регистра", end = '') + Style.RESET_ALL)
        if length_ascii_uppercases  == "exit":
            print(u"Прекращаю работу программы.")
            raise SystemExit
        if length_ascii_uppercases < '0':
           print(u"Вводимое значение не может быть отрицательным.")
           continue
        if not length_ascii_uppercases.isdigit():
            print(u"Необходимо ввести число, а не строку.")
            continue
        if int(length_ascii_uppercases) > length_all_passwd:
            print(u"Вводимое значение превышает длину пароля.")
            continue
        else:
            length_ascii_uppercases = int(length_ascii_uppercases)
            break
    if length_ascii_uppercases >= 1:
        ascii_uppercase_result = list()
        for x in range(length_ascii_uppercases):
            symbol = choice(ascii_uppercase)
            ascii_uppercase_result.append(symbol)
            global pass_ascii_uppercases
            pass_ascii_uppercases = "".join(ascii_uppercase_result)
    else:
        pass_ascii_uppercases = ''
    return pass_ascii_uppercases


def pass_ascii_lowercase():
    """ Функция формирует часть пароля. состоящая из букв нижнего регистра """
    global length_ascii_lowercases                                # Kоличество букв нижнего регистра в будущем пароле
    length_ascii_lowercases = randint(0, length_all_passwd - length_ascii_uppercases)
    if length_ascii_lowercases >= 1:
        ascii_lowercase_result = list()
        for x in range(length_ascii_lowercases):
            symbol = choice(ascii_lowercase)
            ascii_lowercase_result.append(symbol)
            global pass_ascii_lowercases
            pass_ascii_lowercases = "".join(ascii_lowercase_result)
    else:
        pass_ascii_lowercases = ''
    return pass_ascii_lowercases


def pass_digit():
    """ Функция формирует цифровую составляющую пароля.    """
    length_digits =  length_all_passwd -  length_ascii_lowercases -  length_ascii_uppercases
    if length_digits >= 1:
        digit_result = list()
        for x in range(length_digits):
            symbol = choice(digits)                               # Случайная цифра
            digit_result.append(symbol)                           # Добавляем в пароль
            global pass_digits
            pass_digits = "".join(map(str, digit_result))
    else:
        pass_digits = ''
    return pass_digits


def shuffle_passwd(s):
    """ Функция для перемешивания символов в пароле и проверки соответствия условиям задания"""
    s = list(s)
    while True:
        shuffle(s)
        p = ''.join(s)
        if '  ' in p: continue                                    # Hикаких пробелов вместе
        if p.startswith(' ') or p.endswith(' '): continue         # Hе может начинаться или заканчиваться пробелом
        if search(r"(.)" + r"\1" * (3 - 1), p): continue          # Hе более трёх одинаковых символов подряд
        return p


#Main
def main():
    system(['clear', 'cls'][name == sys.platform])                 # Очистка консоли
    logo()                                                         # Логотип
    length_all_passwd = length_all_pass()                          # Переменная = длина всего пароля
    pass_part1 = pass_ascii_uppercase()                            # Часть пароля, состоящая из букв верхнего регистра
    pass_part2 = pass_ascii_lowercase()                            # Часть пароля. состоящая из букв нижнего регистра
    pass_part3 = pass_digit()                                      # Часть пароля, состоящая из цифр
    for i in range(count_range()):                                 # Цикл формирующий список паролей
        passwd =  pass_part1 +  pass_part2 +  pass_part3
        print(shuffle_passwd(passwd))                              # Распечатка перемешанных паролей
    print(Back.RED + "Bye-bye!" + Style.RESET_ALL)                 # Што-Та НИпАнЯтНА


if __name__ == "__main__":
    main()

screen.png
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!