-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
147 lines (106 loc) · 5.29 KB
/
main.py
File metadata and controls
147 lines (106 loc) · 5.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import random
SPECIAL_CHARS = [
'!', '@', '#', '$', '%', '^', '&', '*',
'(', ')', '_', '+', '-', '=', '{', '}',
'|', ';', ':', "'", '"', '<', '>', '?',
'/', '\\', '~', ',', '.'
]
LETTERS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def input_range() -> (int, int):
""" Ввод минимальной и максимальной длины пароля
Если пропустить, будут заданы стандартные 4, 16
Корректно допустимый диапазон длины 3, 40
Некорректно введённые данные => 4, 16
Далее берётся рандомная длина в диапазоне введённых цифр
"""
try:
user_input = input('Введите минимально(>2) и максимально (>2) возможную длину пароля через пробел [4 16]: ')
min_len, max_len = map(str.strip, user_input.split())
min_len_pass = int(min_len)
max_len_pass = int(max_len)
if min_len_pass > max_len_pass:
raise ValueError
if min_len_pass < 3:
min_len_pass = 3
if max_len_pass < 3:
max_len_pass = 3
if max_len_pass > 40:
max_len_pass = 40
except ValueError:
min_len_pass, max_len_pass = 4, 16
return min_len_pass, max_len_pass
def create_sequence_count(min_len_pass: int, max_len_pass: int):
"""
Создаёт последовательность чисел (количество каждого из видов элементов пароля (цифры, буквы, символы))
с заданным весом букв и символов в сумме этой последовательности
Например:
ratio = [0.4, 0.4, 0.2]
min_len_pass = 10
max_len_pass = 10
Итоговый пароль будет содержать 4 цифр, 4 буквы, 2 символа
В таком духе: c5+9J34-k0
Аргументы: результат input_range() - min_len_pass, max_len_pass
Возвращает: list последовательность 3 чисел
"""
ratio = [0.4, 0.4, 0.2]
sequence = []
for i, ratio_value in enumerate(ratio):
len_pass = random.randint(min_len_pass, max_len_pass)
count = int(ratio_value * len_pass)
if count == 0:
sequence.append(1)
else:
sequence.append(count)
if sum(sequence) != len_pass:
sequence[0] += len_pass - sum(sequence)
return sequence
def create_random_combining(sequence: list) -> str:
""" Создание рандомных tuple-последовательностей всех (3) видов элементов
Объединение их в общую tuple-последовательность
Аргументы:
sequence: list последовательность из 3 цифр, эквивалентных количеству каждого вида элемента в пароле
Возвращает:
tuple-последовательность из всех рандомно выбранных элементов
"""
random_numbers = random.choices(population=range(0, 9), k=sequence[0])
random_letters = random.choices(population=LETTERS, k=sequence[1])
random_chars = random.choices(population=SPECIAL_CHARS, k=sequence[2])
all_elements = random_numbers + random_letters + random_chars
random.shuffle(all_elements)
combining = ''.join(map(str, all_elements))
return combining
def create_password():
""" Создание пароля из последовательности элементов
Шаги:
1. Ввод и сбор информации о длине пароля
2. Получение последовательности количества элементов каждого вида
3. Создание рандомной последовательности элементов в виде tuple
4. Соединение всех элементов в строку и вывод
"""
min_len_pass, max_len_pass = input_range()
sequence_count_of_elements = create_sequence_count(min_len_pass, max_len_pass)
return create_random_combining(sequence_count_of_elements)
def main():
""" Для продолжения нажмите Enter или 'y' -> Enter
Для окончания 'n' -> Enter
"""
all_passwords = []
answer = 'y'
while answer == 'y' or answer == '':
password = create_password()
all_passwords.append(password)
print(password)
answer = input('Продолжаем? [y/n]')
if answer == 'n':
print('Процесс завершён.')
print('\nВсе пароли:')
for i, pas in enumerate(all_passwords, start = 1):
print(f'\t{i}. {pas}')
elif answer == 'y' or answer == '':
continue
else:
while answer != 'n' and answer != 'y' and answer != '':
print("Пожалуйста, введите 'y' или 'n'.")
answer = input('Продолжаем? [y/n]')
if __name__ == '__main__':
main()