Files

179 lines
6.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import random
import string
max_password_length = 100 # Максимальная длина пароля
def get_valid_int(prompt, min_value=0, max_value=None):
while True:
user_input = input(prompt).strip()
if not user_input:
print("Ошибка: ввод не должен быть пустым. Попробуйте снова.")
continue
try:
value = int(user_input)
if value < min_value:
print(
f"Ошибка: значение должно быть не меньше {min_value}. Попробуйте снова."
)
continue
if max_value and value > max_value:
print(
f"Ошибка: значение должно быть не больше {max_value}. Попробуйте снова."
)
continue
return value
except ValueError:
print("Ошибка: введите корректное целое число.")
def get_yes_no(prompt):
while True:
user_input = input(prompt).strip().lower()
if user_input in ["yes", "y"]:
return True
if user_input in ["no", "n"]:
return False
print("Ошибка: введите 'yes' (или 'y') или 'no' (или 'n').")
def get_user_input():
"""Запрашивает у пользователя параметры генерации пароля с проверкой ввода."""
global max_password_length
length = get_valid_int(
f"Введите длину пароля (1-{max_password_length}): ",
min_value=1,
max_value=max_password_length,
)
use_lower = get_yes_no("Использовать строчные буквы? (yes/y, no/n): ")
use_upper = get_yes_no("Использовать заглавные буквы? (yes/y, no/n): ")
use_digits = get_yes_no("Использовать цифры? (yes/y, no/n): ")
use_special = get_yes_no("Использовать спецсимволы (!@#$%^&*)? (yes/y, no/n): ")
# Проверяем, что хотя бы один тип символов выбран
if not (use_lower or use_upper or use_digits or use_special):
print("Ошибка: необходимо выбрать хотя бы один тип символов.")
return get_user_input() # Повторный ввод всех данных
# Запрашиваем минимальное количество каждого типа символов
min_lower = (
get_valid_int("Минимальное количество строчных букв: ", 0) if use_lower else 0
)
min_upper = (
get_valid_int("Минимальное количество заглавных букв: ", 0) if use_upper else 0
)
min_digits = get_valid_int("Минимальное количество цифр: ", 0) if use_digits else 0
min_special = (
get_valid_int("Минимальное количество спецсимволов: ", 0) if use_special else 0
)
return (
length,
use_lower,
use_upper,
use_digits,
use_special,
min_lower,
min_upper,
min_digits,
min_special,
)
def validate_input(length, min_lower, min_upper, min_digits, min_special):
"""Проверяет, что длина пароля больше суммы минимальных значений."""
total_required = min_lower + min_upper + min_digits + min_special
if total_required > length:
print(
f"Ошибка: сумма минимальных значений ({total_required}) превышает длину пароля ({length})."
)
return False
return True
def generate_mandatory_chars(
min_lower,
min_upper,
min_digits,
min_special,
lower_chars,
upper_chars,
digit_chars,
special_chars,
):
"""Генерирует обязательные символы пароля."""
password = (
random.choices(lower_chars, k=min_lower)
+ random.choices(upper_chars, k=min_upper)
+ random.choices(digit_chars, k=min_digits)
+ random.choices(special_chars, k=min_special)
)
return password
def fill_password(password, length, all_chars):
"""Дополняет пароль случайными символами до нужной длины."""
remaining_length = length - len(password)
password += random.choices(all_chars, k=remaining_length)
return password
def shuffle_password(password):
"""Перемешивает символы пароля случайным образом."""
random.shuffle(password)
return "".join(password)
def generate_password(
length,
use_lower,
use_upper,
use_digits,
use_special,
min_lower,
min_upper,
min_digits,
min_special,
):
"""Генерирует пароль с учётом заданных параметров."""
lower_chars = string.ascii_lowercase if use_lower else ""
upper_chars = string.ascii_uppercase if use_upper else ""
digit_chars = string.digits if use_digits else ""
special_chars = "!@#$%^&*" if use_special else ""
all_chars = lower_chars + upper_chars + digit_chars + special_chars
while not validate_input(length, min_lower, min_upper, min_digits, min_special):
print("Пожалуйста, введите параметры заново.")
return generate_password(*get_user_input())
password = generate_mandatory_chars(
min_lower,
min_upper,
min_digits,
min_special,
lower_chars,
upper_chars,
digit_chars,
special_chars,
)
password = fill_password(password, length, all_chars)
password = shuffle_password(password)
return password
def main():
"""Основная функция программы."""
max_password_length = 100
user_data = get_user_input()
password = generate_password(*user_data)
print("Сгенерированный пароль:", password)
if __name__ == "__main__":
main()