Explorar o código

Merge branch 'master' of u23-27tsukanovich/up into master

ypv hai 1 semana
pai
achega
d03813be1b

+ 27 - 0
ОАиП/2025-26/36гр/1 сем/цуканов/readme.md

@@ -0,0 +1,27 @@
+Эта программа — графический инструмент для создания надежных паролей с настройками сложности и длины. Она предназначена для удобного и быстрого генерирования паролей и автоматического сохранения логов, связанных с их использованием.
+
+Основные функции и особенности:
+Настройка длины пароля:
+
+Можно выбрать длину создаваемого пароля в диапазоне от 8 до 32 символов через ползунок.
+Выбор уровня сложности:
+
+Низкий уровень: используются только цифры.
+Средний уровень: цифры и буквы английского алфавита (прописные и строчные).
+Высокий уровень: расширенный набор, включающий цифры, буквы русского и английского алфавитов, а также специальные символы.
+Генерация пароля:
+
+При изменении настроек автоматически генерируется новый пароль.
+Также есть кнопка для ручного перегенерирования пароля по желанию.
+Оценка стойкости пароля:
+
+Программа оценивает примерное время, необходимое для взлома пароля, исходя из его длины и сложности.
+Отображается уровень стойкости (низкий, средний, высокий).
+Копирование пароля:
+
+Можно скопировать сгенерированный пароль в буфер обмена с помощью кнопки.
+После копирования результаты (пароль, параметры, время взлома) автоматически сохраняются в лог-файл.
+Логирование и сохранение:
+
+Все использованные пароли и параметры записываются в лог-файл (results_log.txt) в указанной директории.
+В лог-файл сохраняется дата и время, пароль, длина, уровень сложности, оценка стойкости и предполагаемое время взлома.

+ 9 - 0
ОАиП/2025-26/36гр/1 сем/цуканов/res_log.txt

@@ -0,0 +1,9 @@
+Дата: 2025-12-09 09:09:31
+Пароль: 2XzЧiГviюsЩlBЮ7Wу,#-rиFA98Ёj
+Длина: 28
+Сложность: Высокий
+Стойкость: Высокий
+Примерное время взлома: 1.4 лет
+--------------------------
+[2025-12-09 09:09:31] Использован пароль: 2XzЧiГviюsЩlBЮ7Wу,#-rиFA98Ёj
+--------------------------

+ 153 - 0
ОАиП/2025-26/36гр/1 сем/цуканов/tsukanovich.py

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