Advertisement
Teammasik

lr_4_krypta

May 28th, 2024 (edited)
624
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.40 KB | None | 0 0
  1. import random
  2. import tkinter as tk
  3. from tkinter import messagebox
  4.  
  5. # 23 13 16
  6.  
  7. def is_prime(n):
  8.     d = 2
  9.     while n % d != 0:
  10.         d += 1
  11.     return d == n
  12.  
  13.  
  14. def find_primitive_root(q):
  15.     # Находим факторы
  16.     if not is_prime(q):
  17.         messagebox.showinfo("Ошибка!", f"Число q не простое!")
  18.         return None
  19.     factors = prime_factors(q - 1)
  20.  
  21.     while True:
  22.         a = random.randint(2, q - 1)
  23.         if all(pow(a, (q - 1) // p, q) != 1 for p in factors):
  24.             return a
  25.  
  26.  
  27. def prime_factors(n):
  28.     # Нахождение простых множителей числа.
  29.     i = 2
  30.     factors = []
  31.     while i * i <= n:
  32.         if n % i:
  33.             i += 1
  34.         else:
  35.             n //= i
  36.             factors.append(i)
  37.     if n > 1:
  38.         factors.append(n)
  39.     return factors
  40.  
  41.  
  42. def calculate_key(q, alpha, Ya, Yb, Xa, Xb):
  43.     Ka = (Yb ** Xa) % q
  44.     Kb = (Ya ** Xb) % q
  45.  
  46.     if Ka == Kb:
  47.         return Ka
  48.     else:
  49.         return None
  50.  
  51.  
  52. def calculate_export(q, alpha, Xa, Xb):
  53.     return (alpha ** Xa) % q, (alpha ** Xb) % q
  54.  
  55.  
  56. def calculate_export_keys():
  57.     try:
  58.         q = int(q_entry.get())
  59.         Xa = int(Xa_entry.get())
  60.         Xb = int(Xb_entry.get())
  61.         alpha = find_primitive_root(q)
  62.  
  63.         Ya, Yb = calculate_export(q, alpha, Xa, Xb)
  64.         if Ya is not None and Yb is not None:
  65.             result_label2.config(text=f"Ключи: {Ya, Yb}")
  66.         else:
  67.             result_label2.config(text="Ошибка: ключи не совпадают.")
  68.     except ValueError:
  69.         messagebox.showerror("Ошибка", "Введите корректные числовые значения.")
  70.  
  71.  
  72. def calculate_key_button_click():
  73.     try:
  74.         q = int(q_entry.get())
  75.         Xa = int(Xa_entry.get())
  76.         Xb = int(Xb_entry.get())
  77.         Ya = int(Ya_entry.get())
  78.         Yb = int(Yb_entry.get())
  79.         alpha = find_primitive_root(q)
  80.  
  81.         key = calculate_key(q, alpha, Ya, Yb, Xa, Xb)
  82.         if key is not None:
  83.             result_label.config(text=f"Ключ: {key}")
  84.         else:
  85.             result_label.config(text="Ошибка: ключи не совпадают.")
  86.     except ValueError:
  87.         messagebox.showerror("Ошибка", "Введите корректные числовые значения.")
  88.  
  89.  
  90. root = tk.Tk()
  91. root.title("Алгоритм Диффи-Хелмана")
  92.  
  93. q_label = tk.Label(root, text="Простое число q:")
  94. q_label.pack()
  95. q_entry = tk.Entry(root)
  96. q_entry.pack()
  97.  
  98. Xa_label = tk.Label(root, text="Число Xa:")
  99. Xa_label.pack()
  100. Xa_entry = tk.Entry(root)
  101. Xa_entry.pack()
  102.  
  103. Xb_label = tk.Label(root, text="Число Xb:")
  104. Xb_label.pack()
  105. Xb_entry = tk.Entry(root)
  106. Xb_entry.pack()
  107.  
  108.  
  109. result_label2 = tk.Label(root, text="")
  110. result_label2.pack()
  111.  
  112. Ya_label = tk.Label(root, text="Число Ya:")
  113. Ya_label.pack()
  114. Ya_entry = tk.Entry(root)
  115. Ya_entry.pack()
  116.  
  117. Yb_label = tk.Label(root, text="Число Yb:")
  118. Yb_label.pack()
  119. Yb_entry = tk.Entry(root)
  120. Yb_entry.pack()
  121.  
  122. calculate_button = tk.Button(root, text="Вычислить ключи на экспорт", command=calculate_export_keys)
  123. calculate_button.pack()
  124.  
  125. calculate_button2 = tk.Button(root, text="Вычислить ключ", command=calculate_key_button_click)
  126. calculate_button2.pack()
  127.  
  128. result_label = tk.Label(root, text="")
  129. result_label.pack()
  130.  
  131. root.mainloop()
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement