Проблема с Label в tkinter

Рейтинг: 0Ответов: 0Опубликовано: 22.05.2023

Есть 2 окна: отправитель и получатель. Они нужны для реализации алгоритма шифрования RSA. Были созданы классы под генерацию простого числа и генерацию ключей, простые числа и открытый ключ надо вывести на экран. Почему-то так работает только в окне Sender

введите сюда описание изображения

Весь код ниже

main.py

import threading


def start_sender():
    from sender import Sender
    sender = Sender()
    sender.mainloop()


def start_receiver():
    from reciever import Reciever
    receiver = Reciever()
    receiver.mainloop()


if __name__ == "__main__":
    thread_sender = threading.Thread(target=start_sender)
    thread_receiver = threading.Thread(target=start_receiver)

    thread_sender.start()
    thread_receiver.start()

    thread_sender.join()
    thread_receiver.join()

sender.py

import tkinter as tk
from tkinter import ttk
from tkinter import font
import rsa_keygen as rk


class Sender(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Отправитель")
        self.iconbitmap(True, "key_icon.ico")

        self.my_keys = []
        self.prime_q = tk.StringVar()
        self.prime_p = tk.StringVar()
        self.n_value = tk.StringVar()
        self.openk_value = tk.StringVar()
        self.foreign_ok_value = tk.StringVar()
        self.foreign_n_value = tk.StringVar()

        custom_font = font.Font(size=12, weight="bold")

        # Верхняя половина окна
        top_frame = tk.Frame(self)
        top_frame.pack(side=tk.TOP, pady=10)

        # Правая часть окна для подписи
        right_frame = tk.Frame(top_frame)
        right_frame.pack(side=tk.LEFT)

        rf_name = tk.Label(right_frame, text="Для подписи", font=custom_font)
        rf_name.grid(pady=10, sticky="nw")

        p_label = tk.Label(right_frame, text="P:")
        p_label.grid(row=1, column=0, sticky="e")
        self.p_entry = tk.Label(right_frame, textvariable=self.prime_p)
        self.p_entry.grid(row=1, column=1, sticky="ew")

        q_label = tk.Label(right_frame, text="Q:")
        q_label.grid(row=2, column=0, sticky="e")
        self.q_entry = tk.Label(right_frame, textvariable=self.prime_q)
        self.q_entry.grid(row=2, column=1, sticky="ew")

        pubkey_label = tk.Label(right_frame, text="Открытый ключ:")
        pubkey_label.grid(row=3, column=0, sticky="e")
        self.pubkey_entry = tk.Label(right_frame, textvariable=self.openk_value)
        self.pubkey_entry.grid(row=3, column=1, sticky="ew")

        n1_label = tk.Label(right_frame, text="N:")
        n1_label.grid(row=4, column=0, sticky="e")
        self.n1_entry = tk.Label(right_frame, textvariable=self.n_value)
        self.n1_entry.grid(row=4, column=1, sticky="w")

        # Линия разделения
        separator = ttk.Separator(top_frame, orient=tk.VERTICAL)
        separator.pack(side=tk.LEFT, padx=10)

        # Левая часть окна для сообщения
        left_frame = tk.Frame(top_frame)
        left_frame.pack(side=tk.RIGHT)

        lf_name = tk.Label(left_frame, text="Для сообщения", font=custom_font)
        lf_name.grid(sticky="nw")

        pubkey2_label = tk.Label(left_frame, text="Открытый ключ:")
        pubkey2_label.grid(row=1, column=0, sticky="e")
        self.pubkey2_entry = tk.Label(left_frame, textvariable=self.foreign_ok_value)
        self.pubkey2_entry.grid(row=1, column=1, sticky="ew")

        n2_label = tk.Label(left_frame, text="N:")
        n2_label.grid(row=2, column=0, sticky="e")
        self.n2_entry = tk.Label(left_frame, textvariable=self.foreign_n_value)
        self.n2_entry.grid(row=2, column=1, sticky="ew")

        # Кнопка подтверждения
        formKeysButton = tk.Button(self, text="Сформировать ключи", command=self.formKeys)
        formKeysButton.pack()

    def formKeys(self):
        rsaGen = rk.RSAKeygen()
        p, q, n, e, d = rsaGen.generate_rsa_keys()
        self.my_keys.append(e)
        self.my_keys.append(d)
        self.my_keys.append(n)

        self.prime_p.set(p)
        self.prime_q.set(q)
        self.openk_value.set(e)
        self.n_value.set(n)

reciever.py

import tkinter as tk
from tkinter import ttk
from tkinter import font
import rsa_keygen as rk


class Reciever(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Получатель")
        self.iconbitmap(True, "key_icon.ico")

        self.my_keys = []
        self.prime_q = tk.StringVar()
        self.prime_p = tk.StringVar()
        self.n_value = tk.StringVar()
        self.openk_value = tk.StringVar()
        self.foreign_ok_value = tk.StringVar()
        self.foreign_n_value = tk.StringVar()

        custom_font = font.Font(size=12, weight="bold")

        # Верхняя половина окна
        top_frame = tk.Frame(self)
        top_frame.pack(side=tk.TOP, pady=10)

        # Правая часть окна для подписи
        right_frame = tk.Frame(top_frame)
        right_frame.pack(side=tk.LEFT)

        rf_name = tk.Label(right_frame, text="Для сообщения", font=custom_font)
        rf_name.grid(pady=10, sticky="nw")

        p_label = tk.Label(right_frame, text="P:")
        p_label.grid(row=1, column=0, sticky="e")
        self.p_entry = tk.Label(right_frame, textvariable=self.prime_p)
        self.p_entry.grid(row=1, column=1, sticky="ew")

        q_label = tk.Label(right_frame, text="Q:")
        q_label.grid(row=2, column=0, sticky="e")
        self.q_entry = tk.Label(right_frame, textvariable=self.prime_q)
        self.q_entry.grid(row=2, column=1, sticky="ew")

        pubkey_label = tk.Label(right_frame, text="Открытый ключ:")
        pubkey_label.grid(row=3, column=0, sticky="e")
        self.pubkey_entry = tk.Label(right_frame, textvariable=self.openk_value)
        self.pubkey_entry.grid(row=3, column=1, sticky="ew")

        n1_label = tk.Label(right_frame, text="N:")
        n1_label.grid(row=4, column=0, sticky="e")
        self.n1_entry = tk.Label(right_frame, textvariable=self.n_value)
        self.n1_entry.grid(row=4, column=1, sticky="w")

        # Линия разделения
        separator = ttk.Separator(top_frame, orient=tk.VERTICAL)
        separator.pack(side=tk.LEFT, padx=10)

        # Левая часть окна для сообщения
        left_frame = tk.Frame(top_frame)
        left_frame.pack(side=tk.RIGHT)

        lf_name = tk.Label(left_frame, text="Для подписи", font=custom_font)
        lf_name.grid(sticky="nw")

        pubkey2_label = tk.Label(left_frame, text="Открытый ключ:")
        pubkey2_label.grid(row=1, column=0, sticky="e")
        self.pubkey2_entry = tk.Label(left_frame, textvariable=self.foreign_ok_value)
        self.pubkey2_entry.grid(row=1, column=1, sticky="ew")

        n2_label = tk.Label(left_frame, text="N:")
        n2_label.grid(row=2, column=0, sticky="e")
        self.n2_entry = tk.Label(left_frame, textvariable=self.foreign_n_value)
        self.n2_entry.grid(row=2, column=1, sticky="ew")

        formKeysButton = tk.Button(self, text="Сформировать ключи", command=self.formKeys)
        formKeysButton.pack()

    def formKeys(self):
        rsaGen = rk.RSAKeygen()
        p, q, n, e, d = rsaGen.generate_rsa_keys()
        self.my_keys.append(e)
        self.my_keys.append(d)
        self.my_keys.append(n)

        self.prime_p.set(p)
        self.prime_q.set(q)
        self.openk_value.set(e)
        self.n_value.set(n)

prime_generator.py

from tkinter import messagebox
import random


class PrimeGen:
    def generate_prime(self):
        while True:
            n = random.randint(2**31, 2**32 - 1)

            if self.miller_rabin_test(n) and self.fermat_test(n):
                messagebox.showinfo("Проверка на простоту", f"Число прошло тест Ферма и Миллера-Рабина на простоту")
                return n

    def miller_rabin_test(self, n):
        if n == 2 or n == 3:
            return True
        if n < 2 or n % 2 == 0:
            return False

        d = n - 1
        r = 0
        while d % 2 == 0:
            d //= 2
            r += 1

        def witness(a):
            x = pow(a, d, n)
            if x == 1 or x == n - 1:
                return True
            for _ in range(r - 1):
                x = pow(x, 2, n)
                if x == n - 1:
                    return True
            return False

        for _ in range(100):
            a = random.randint(2, n - 2)
            if not witness(a):
                return False

        return True

    def fermat_test(self, n):
        for _ in range(100):
            a = random.randint(2, n - 1)
            if pow(a, n - 1, n) != 1:
                return False

        return True

rsa_keygen.py

import prime_generator as pg
import random


class RSAKeygen:
    def gcd(self, a, b):
        """Находит наибольший общий делитель двух чисел."""
        while b != 0:
            a, b = b, a % b
        return a

    def extended_gcd(self, a, b):
        """Расширенный алгоритм Евклида для нахождения обратного элемента по модулю."""
        if a == 0:
            return b, 0, 1
        gcd, x, y = self.extended_gcd(b % a, a)
        return gcd, y - (b // a) * x, x

    def generate_coprime(self, phi):
        """Генерирует взаимно простое число с заданным значением phi."""
        while True:
            e = random.randint(2, phi - 1)
            if self.gcd(e, phi) == 1:
                return e

    def generate_rsa_keys(self):
        gen = pg.PrimeGen()
        p = gen.generate_prime()
        q = gen.generate_prime()

        n = p * q
        phi = (p - 1) * (q - 1)

        e = self.generate_coprime(phi)

        _, d, _ = self.extended_gcd(e, phi)
        d %= phi

        return p, q, n, e, d

Ответы

Ответов пока нет.