import os
import base64
import math
import tkinter as tk
from tkinter import ttk, messagebox

WIDTH = 256
HEIGHT = 256
TARGET_ENTROPY = 7.7

def shannon_entropy(data):
    counts = [0] * 256
    for b in data:
        counts[b] += 1
    total = len(data)
    entropy = 0.0
    for c in counts:
        if c:
            p = c / total
            entropy -= p * math.log2(p)
    return entropy

def generate_high_entropy_image():
    while True:
        data = os.urandom(WIDTH * HEIGHT)
        entropy = shannon_entropy(data)
        if entropy > TARGET_ENTROPY:
            break
    header = f"P6\n{WIDTH} {HEIGHT}\n255\n".encode('ascii')
    pixel_bytes = bytearray(WIDTH * HEIGHT * 3)
    for i, v in enumerate(data):
        idx = i * 3
        pixel_bytes[idx] = v
        pixel_bytes[idx + 1] = v
        pixel_bytes[idx + 2] = v
    ppm = header + bytes(pixel_bytes)
    b64 = base64.b64encode(ppm).decode('ascii')
    return b64, entropy

class App:
    def __init__(self, root):
        self.root = root
        self.root.title("Random High-Entropy Image")
        self.photo = None
        self.create_widgets()

    def create_widgets(self):
        self.generate_button = ttk.Button(self.root, text="Generate", command=self.generate)
        self.generate_button.pack(pady=10)

        self.image_label = ttk.Label(self.root)
        self.image_label.pack(padx=10, pady=10)

        self.entropy_var = tk.StringVar(value="Энтропия: -")
        self.entropy_entry = ttk.Entry(
            self.root,
            textvariable=self.entropy_var,
            state='readonly',
            width=40
        )
        self.entropy_entry.pack(pady=10)

    def generate(self):
        try:
            b64, entropy = generate_high_entropy_image()
            self.photo = tk.PhotoImage(data=b64)
            self.image_label.configure(image=self.photo)
            self.entropy_var.set(f"Энтропия: {entropy:.4f} бит/пиксель")
        except Exception as e:
            messagebox.showerror("Error", f"Ошибка: {e}")

if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    root.mainloop()