Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- import tkinter as tk
- from tkinter import messagebox
- # 23 13 16
- def is_prime(n):
- d = 2
- while n % d != 0:
- d += 1
- return d == n
- def find_primitive_root(q):
- # Находим факторы
- if not is_prime(q):
- messagebox.showinfo("Ошибка!", f"Число q не простое!")
- return None
- factors = prime_factors(q - 1)
- while True:
- a = random.randint(2, q - 1)
- if all(pow(a, (q - 1) // p, q) != 1 for p in factors):
- return a
- def prime_factors(n):
- # Нахождение простых множителей числа.
- i = 2
- factors = []
- while i * i <= n:
- if n % i:
- i += 1
- else:
- n //= i
- factors.append(i)
- if n > 1:
- factors.append(n)
- return factors
- def calculate_key(q, alpha, Ya, Yb, Xa, Xb):
- Ka = (Yb ** Xa) % q
- Kb = (Ya ** Xb) % q
- if Ka == Kb:
- return Ka
- else:
- return None
- def calculate_export(q, alpha, Xa, Xb):
- return (alpha ** Xa) % q, (alpha ** Xb) % q
- def calculate_export_keys():
- try:
- q = int(q_entry.get())
- Xa = int(Xa_entry.get())
- Xb = int(Xb_entry.get())
- alpha = find_primitive_root(q)
- Ya, Yb = calculate_export(q, alpha, Xa, Xb)
- if Ya is not None and Yb is not None:
- result_label2.config(text=f"Ключи: {Ya, Yb}")
- else:
- result_label2.config(text="Ошибка: ключи не совпадают.")
- except ValueError:
- messagebox.showerror("Ошибка", "Введите корректные числовые значения.")
- def calculate_key_button_click():
- try:
- q = int(q_entry.get())
- Xa = int(Xa_entry.get())
- Xb = int(Xb_entry.get())
- Ya = int(Ya_entry.get())
- Yb = int(Yb_entry.get())
- alpha = find_primitive_root(q)
- key = calculate_key(q, alpha, Ya, Yb, Xa, Xb)
- if key is not None:
- result_label.config(text=f"Ключ: {key}")
- else:
- result_label.config(text="Ошибка: ключи не совпадают.")
- except ValueError:
- messagebox.showerror("Ошибка", "Введите корректные числовые значения.")
- root = tk.Tk()
- root.title("Алгоритм Диффи-Хелмана")
- q_label = tk.Label(root, text="Простое число q:")
- q_label.pack()
- q_entry = tk.Entry(root)
- q_entry.pack()
- Xa_label = tk.Label(root, text="Число Xa:")
- Xa_label.pack()
- Xa_entry = tk.Entry(root)
- Xa_entry.pack()
- Xb_label = tk.Label(root, text="Число Xb:")
- Xb_label.pack()
- Xb_entry = tk.Entry(root)
- Xb_entry.pack()
- result_label2 = tk.Label(root, text="")
- result_label2.pack()
- Ya_label = tk.Label(root, text="Число Ya:")
- Ya_label.pack()
- Ya_entry = tk.Entry(root)
- Ya_entry.pack()
- Yb_label = tk.Label(root, text="Число Yb:")
- Yb_label.pack()
- Yb_entry = tk.Entry(root)
- Yb_entry.pack()
- calculate_button = tk.Button(root, text="Вычислить ключи на экспорт", command=calculate_export_keys)
- calculate_button.pack()
- calculate_button2 = tk.Button(root, text="Вычислить ключ", command=calculate_key_button_click)
- calculate_button2.pack()
- result_label = tk.Label(root, text="")
- result_label.pack()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement