| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- 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()
|