|
|
@@ -0,0 +1,153 @@
|
|
|
+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()
|