tsukanovich.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import tkinter as tk
  2. import random
  3. import string
  4. from math import log2
  5. import datetime
  6. import os
  7. english_letters_lower = string.ascii_lowercase
  8. english_letters_upper = string.ascii_uppercase
  9. russian_letters_lower = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
  10. russian_letters_upper = russian_letters_lower.upper()
  11. digits = string.digits
  12. special_chars = "!@#$%^&*()-_=+[]{}|;:,.<>?/"
  13. LOG_FILE_PATH = r"D:\36\цуканов\пароли\результаты_log.txt"
  14. def ensure_directory_exists():
  15. directory = os.path.dirname(LOG_FILE_PATH)
  16. if not os.path.exists(directory):
  17. os.makedirs(directory)
  18. root = tk.Tk()
  19. root.title("Генератор паролей с настройками")
  20. root.geometry("600x500")
  21. password_var = tk.StringVar()
  22. strength_var = tk.StringVar()
  23. time_var = tk.StringVar()
  24. saved_params = {}
  25. password_length = tk.IntVar(value=16)
  26. complexity_level = tk.IntVar(value=1)
  27. def generate_password():
  28. length = password_length.get()
  29. complexity = complexity_level.get()
  30. if complexity == 1:
  31. chars = digits
  32. elif complexity == 2:
  33. chars = digits + string.ascii_letters
  34. else:
  35. chars = (
  36. digits + string.ascii_letters +
  37. russian_letters_lower + russian_letters_upper +
  38. special_chars
  39. )
  40. password_chars = random.choices(chars, k=length)
  41. password = ''.join(password_chars)
  42. password_var.set(password)
  43. saved_params.clear()
  44. saved_params['password'] = password
  45. saved_params['length'] = length
  46. saved_params['complexity'] = complexity
  47. assess_strength(password, length, complexity)
  48. def assess_strength(password, length, complexity):
  49. seconds = 2 ** length / (complexity * 2)
  50. if seconds < 60:
  51. est_time = f"{int(seconds)} секунд"
  52. elif seconds < 3600:
  53. est_time = f"{int(seconds // 60)} минут"
  54. elif seconds < 86400:
  55. est_time = f"{int(seconds // 3600)} часов"
  56. elif seconds < 31536000:
  57. est_time = f"{int(seconds // 86400)} дней"
  58. else:
  59. years = seconds / 31536000
  60. est_time = f"{years:.1f} лет"
  61. strength = {
  62. 1: "Низкий",
  63. 2: "Средний",
  64. 3: "Высокий"
  65. }[complexity]
  66. strength_var.set(f"Стойкость: {strength}")
  67. time_var.set(f"Приблизительное время взлома: {est_time}")
  68. def save_results():
  69. if not saved_params:
  70. return
  71. ensure_directory_exists()
  72. now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  73. password = saved_params['password']
  74. length = saved_params['length']
  75. complexity = saved_params['complexity']
  76. strength = {
  77. 1: "Низкий",
  78. 2: "Средний",
  79. 3: "Высокий"
  80. }[complexity]
  81. est_time = time_var.get().replace("Приблизительное время взлома: ", "")
  82. with open(LOG_FILE_PATH, "a", encoding='utf-8') as f:
  83. f.write(
  84. f"Дата: {now}\n"
  85. f"Пароль: {password}\n"
  86. f"Длина: {length}\n"
  87. f"Сложность: {strength}\n"
  88. f"Стойкость: {strength}\n"
  89. f"Примерное время взлома: {est_time}\n"
  90. "--------------------------\n"
  91. )
  92. def copy_password():
  93. pw = password_var.get()
  94. if pw:
  95. root.clipboard_clear()
  96. root.clipboard_append(pw)
  97. status_label.config(text="Пароль скопирован в буфер обмена")
  98. save_results()
  99. log_usage()
  100. else:
  101. status_label.config(text="Нет пароля для копирования")
  102. def log_usage():
  103. ensure_directory_exists()
  104. now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  105. with open(LOG_FILE_PATH, "a", encoding='utf-8') as f:
  106. f.write(f"[{now}] Использован пароль: {password_var.get()}\n")
  107. f.write(f"--------------------------\n")
  108. tk.Label(root, text="Настройка длины пароля").pack()
  109. length_scale = tk.Scale(root, from_=8, to=32, orient='horizontal', variable=password_length, command=lambda e: generate_password())
  110. length_scale.pack()
  111. tk.Label(root, text="Выбор сложности").pack()
  112. tk.Radiobutton(root, text="Низкая", variable=complexity_level, value=1, command=generate_password).pack()
  113. tk.Radiobutton(root, text="Средняя", variable=complexity_level, value=2, command=generate_password).pack()
  114. tk.Radiobutton(root, text="Высокая", variable=complexity_level, value=3, command=generate_password).pack()
  115. entry_password = tk.Entry(root, textvariable=password_var, font=("Arial", 14), width=50, justify='center')
  116. entry_password.pack(pady=10)
  117. btn_generate = tk.Button(root, text="Сгенерировать пароль", command=generate_password)
  118. btn_generate.pack()
  119. label_strength = tk.Label(root, textvariable=strength_var, font=("Arial", 12))
  120. label_strength.pack(pady=2)
  121. label_time = tk.Label(root, textvariable=time_var, font=("Arial", 12))
  122. label_time.pack(pady=2)
  123. btn_copy = tk.Button(root, text="Копировать в буфер обмена", command=copy_password)
  124. btn_copy.pack(pady=10)
  125. status_label = tk.Label(root, text="", font=("Arial", 10))
  126. status_label.pack(pady=5)
  127. generate_password()
  128. root.mainloop()