import tkinter as tk import random import string from math import log2 import datetime import os english_letters_lower = string.ascii_lowercase english_letters_upper = string.ascii_uppercase russian_letters_lower = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' russian_letters_upper = russian_letters_lower.upper() digits = string.digits special_chars = "!@#$%^&*()-_=+[]{}|;:,.<>?/" LOG_FILE_PATH = r"D:\36\цуканов\пароли\результаты_log.txt" def ensure_directory_exists(): directory = os.path.dirname(LOG_FILE_PATH) if not os.path.exists(directory): os.makedirs(directory) root = tk.Tk() root.title("Генератор паролей с настройками") root.geometry("600x500") password_var = tk.StringVar() strength_var = tk.StringVar() time_var = tk.StringVar() saved_params = {} password_length = tk.IntVar(value=16) complexity_level = tk.IntVar(value=1) def generate_password(): length = password_length.get() complexity = complexity_level.get() if complexity == 1: chars = digits elif complexity == 2: chars = digits + string.ascii_letters else: chars = ( digits + string.ascii_letters + russian_letters_lower + russian_letters_upper + special_chars ) password_chars = random.choices(chars, k=length) password = ''.join(password_chars) password_var.set(password) saved_params.clear() saved_params['password'] = password saved_params['length'] = length saved_params['complexity'] = complexity assess_strength(password, length, complexity) def assess_strength(password, length, complexity): seconds = 2 ** length / (complexity * 2) if seconds < 60: est_time = f"{int(seconds)} секунд" elif seconds < 3600: est_time = f"{int(seconds // 60)} минут" elif seconds < 86400: est_time = f"{int(seconds // 3600)} часов" elif seconds < 31536000: est_time = f"{int(seconds // 86400)} дней" else: years = seconds / 31536000 est_time = f"{years:.1f} лет" strength = { 1: "Низкий", 2: "Средний", 3: "Высокий" }[complexity] strength_var.set(f"Стойкость: {strength}") time_var.set(f"Приблизительное время взлома: {est_time}") def save_results(): if not saved_params: return ensure_directory_exists() now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") password = saved_params['password'] length = saved_params['length'] complexity = saved_params['complexity'] strength = { 1: "Низкий", 2: "Средний", 3: "Высокий" }[complexity] est_time = time_var.get().replace("Приблизительное время взлома: ", "") with open(LOG_FILE_PATH, "a", encoding='utf-8') as f: f.write( f"Дата: {now}\n" f"Пароль: {password}\n" f"Длина: {length}\n" f"Сложность: {strength}\n" f"Стойкость: {strength}\n" f"Примерное время взлома: {est_time}\n" "--------------------------\n" ) def copy_password(): pw = password_var.get() if pw: root.clipboard_clear() root.clipboard_append(pw) status_label.config(text="Пароль скопирован в буфер обмена") save_results() log_usage() else: status_label.config(text="Нет пароля для копирования") def log_usage(): ensure_directory_exists() now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") with open(LOG_FILE_PATH, "a", encoding='utf-8') as f: f.write(f"[{now}] Использован пароль: {password_var.get()}\n") f.write(f"--------------------------\n") tk.Label(root, text="Настройка длины пароля").pack() length_scale = tk.Scale(root, from_=8, to=32, orient='horizontal', variable=password_length, command=lambda e: generate_password()) length_scale.pack() tk.Label(root, text="Выбор сложности").pack() tk.Radiobutton(root, text="Низкая", variable=complexity_level, value=1, command=generate_password).pack() tk.Radiobutton(root, text="Средняя", variable=complexity_level, value=2, command=generate_password).pack() tk.Radiobutton(root, text="Высокая", variable=complexity_level, value=3, command=generate_password).pack() entry_password = tk.Entry(root, textvariable=password_var, font=("Arial", 14), width=50, justify='center') entry_password.pack(pady=10) btn_generate = tk.Button(root, text="Сгенерировать пароль", command=generate_password) btn_generate.pack() label_strength = tk.Label(root, textvariable=strength_var, font=("Arial", 12)) label_strength.pack(pady=2) label_time = tk.Label(root, textvariable=time_var, font=("Arial", 12)) label_time.pack(pady=2) btn_copy = tk.Button(root, text="Копировать в буфер обмена", command=copy_password) btn_copy.pack(pady=10) status_label = tk.Label(root, text="", font=("Arial", 10)) status_label.pack(pady=5) generate_password() root.mainloop()