Криптонасрал

 avatar
unknown
python
11 days ago
5.1 kB
5
Indexable
import random
import tkinter as tk
from tkinter import messagebox


class EllipticCurve:
    def __init__(self, a, b, p):
        self.a = a
        self.b = b
        self.p = p

    def is_on_curve(self, point):
        if point is None:
            return True
        x, y = point
        return (y ** 2 - (x ** 3 + self.a * x + self.b)) % self.p == 0

    def add_points(self, P, Q):
        if P is None:
            return Q
        if Q is None:
            return P

        x1, y1 = P
        x2, y2 = Q

        if x1 == x2 and y1 != y2:
            return None

        if x1 == x2:
            m = (3 * x1 ** 2 + self.a) * pow(2 * y1, -1, self.p)
        else:
            m = (y2 - y1) * pow(x2 - x1, -1, self.p)

        x3 = (m ** 2 - x1 - x2) % self.p
        y3 = (m * (x1 - x3) - y1) % self.p

        return (x3, y3)

    def scalar_multiply(self, k, P):
        result = None
        addend = P

        while k:
            if k & 1:
                result = self.add_points(result, addend)
            addend = self.add_points(addend, addend)
            k >>= 1

        return result


def generate_keys(curve, G):
    private_key = random.randint(1, curve.p - 1)
    public_key = curve.scalar_multiply(private_key, G)
    return private_key, public_key


def gronsfeld_encrypt(text, key):
    encrypted_text = ""
    key_length = len(key)
    for i, char in enumerate(text):
        if char.isalpha():
            shift = key[i % key_length]
            if char.isupper():
                encrypted_text += chr((ord(char) - 65 + shift) % 26 + 65)
            else:
                encrypted_text += chr((ord(char) - 97 + shift) % 26 + 97)
        else:
            encrypted_text += char
    return encrypted_text


def gronsfeld_decrypt(text, key):
    decrypted_text = ""
    key_length = len(key)
    for i, char in enumerate(text):
        if char.isalpha():
            shift = key[i % key_length]
            if char.isupper():
                decrypted_text += chr((ord(char) - 65 - shift) % 26 + 65)
            else:
                decrypted_text += chr((ord(char) - 97 - shift) % 26 + 97)
        else:
            decrypted_text += char
    return decrypted_text


class CryptoApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Elliptic Curve & Gronsfeld Cryptosystem")

        # Параметры эллиптической кривой
        self.a = 2
        self.b = 2
        self.p = 17
        self.curve = EllipticCurve(self.a, self.b, self.p)
        self.G = (5, 1)

        # Генерация ключей
        self.private_key, self.public_key = generate_keys(self.curve, self.G)
        self.key = [int(x) for x in str(self.public_key[0])]

        # GUI элементы
        self.create_widgets()

    def create_widgets(self):
        # Метки
        tk.Label(self.root, text="Private Key:").grid(row=0, column=0, sticky="w")
        tk.Label(self.root, text=str(self.private_key)).grid(row=0, column=1, sticky="w")

        tk.Label(self.root, text="Public Key:").grid(row=1, column=0, sticky="w")
        tk.Label(self.root, text=str(self.public_key)).grid(row=1, column=1, sticky="w")

        tk.Label(self.root, text="Gronsfeld Key:").grid(row=2, column=0, sticky="w")
        tk.Label(self.root, text=str(self.key)).grid(row=2, column=1, sticky="w")

        # Поле ввода текста
        tk.Label(self.root, text="Enter Text:").grid(row=3, column=0, sticky="w")
        self.text_entry = tk.Entry(self.root, width=40)
        self.text_entry.grid(row=3, column=1, columnspan=2, pady=5)

        # Кнопки
        tk.Button(self.root, text="Encrypt", command=self.encrypt_text).grid(row=4, column=1, pady=5)
        tk.Button(self.root, text="Decrypt", command=self.decrypt_text).grid(row=4, column=2, pady=5)

        # Поле вывода результата
        tk.Label(self.root, text="Result:").grid(row=5, column=0, sticky="w")
        self.result_text = tk.Text(self.root, height=5, width=40)
        self.result_text.grid(row=5, column=1, columnspan=2, pady=5)

    def encrypt_text(self):
        text = self.text_entry.get()
        if not text:
            messagebox.showwarning("Warning", "Please enter text to encrypt")
            return

        encrypted_text = gronsfeld_encrypt(text, self.key)
        self.result_text.delete(1.0, tk.END)
        self.result_text.insert(tk.END, f"Encrypted Text: {encrypted_text}")

    def decrypt_text(self):
        text = self.text_entry.get()
        if not text:
            messagebox.showwarning("Warning", "Please enter text to decrypt")
            return

        decrypted_text = gronsfeld_decrypt(text, self.key)
        self.result_text.delete(1.0, tk.END)
        self.result_text.insert(tk.END, f"Decrypted Text: {decrypted_text}")


if __name__ == "__main__":
    root = tk.Tk()
    app = CryptoApp(root)
    root.mainloop()
Editor is loading...
Leave a Comment