#!/usr/bin/env python import tkinter as tk import tkinter.filedialog import tkinter.messagebox from io import BytesIO from pathlib import Path from pprint import pprint from functools import partial from Crypto.Cipher import AES from PIL import ( ImageTk, Image ) import config as cfg class MainWin(tk.Tk): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.title('Mein Titel ;-)') self.menubar = tk.Menu(self) self.config(menu=self.menubar) self.filemenu = tk.Menu(self.menubar, tearoff=False) self.menubar.add_cascade(label='File', menu=self.filemenu) self.filemenu.add_command(label='Open Plain', command=self.open_plain) self.filemenu.add_command(label='Save Plain', command=self.save_plain) self.filemenu.add_command(label='Open Crypt', command=self.open_crypt) self.filemenu.add_command(label='Save Crypt', command=self.save_crypt) self.filemenu.add_command(label='Exit', command=self.destroy) self.filename = tk.Label(self, relief=tk.SUNKEN) self.filename.pack(side=tk.TOP, fill=tk.X) self.canvas = tk.Canvas(self) self.canvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True) self.image = None self.filepath = None tk.messagebox.showwarning( title='Achtung!', message='Dieses Programm benutzt eine unsichere Verschlüsselung!\n' 'Ein besserer Nonce ist notwendig!' ) def on_resize(self, *args, **kwargs): self.display_file() def open_plain(self, *args, **kwargs): self.filepath = Path(tk.filedialog.askopenfilename(master=self, title='Verzeichnis?', initialdir=cfg.DIR_PLAIN)) if self.filepath: with open(self.filepath, 'rb') as ifh: data = BytesIO(ifh.read()) self.image = Image.open(data) self.display_file() def save_plain(self, *args, **kwargs): newfilepath = Path(tk.filedialog.asksaveasfilename(master=self, title='Verzeichnis?', initialdir=cfg.DIR_PLAIN)) if self.filepath: self.image.save(newfilepath) def save_crypt(self, *args, **kwargs): newfilepath = Path(tk.filedialog.asksaveasfilename(master=self, title='Verzeichnis?', initialdir=cfg.DIR_CRYPT)) if self.filepath: buf = BytesIO() self.image.save(buf, format=self.image.format) ### for a real application, use a better nonce cipher = AES.new( cfg.CRYPT_KEY.encode(), AES.MODE_EAX, nonce=cfg.CRYPT_KEY.encode() # HERE BE DRAGONS! ) encrypted = cipher.decrypt(buf.getvalue()) newfilepath.write_bytes(encrypted) def open_crypt(self, *args, **kwargs): self.filepath = Path(tk.filedialog.askopenfilename(master=self, title='Verzeichnis?', initialdir=cfg.DIR_CRYPT)) if self.filepath: with open(self.filepath, 'rb') as ifh: data = BytesIO(ifh.read()) ### for a real application, use a better nonce cipher = AES.new( cfg.CRYPT_KEY.encode(), AES.MODE_EAX, nonce=cfg.CRYPT_KEY.encode() # HERE BE DRAGONS! ) decrypted = cipher.decrypt(data.read()) data = BytesIO(decrypted) try: self.image = Image.open(data) except: Path('1.img').write_bytes(decrypted) self.display_file() def display_file(self): self.canvas.update() width = self.canvas.winfo_width() height = self.canvas.winfo_height() image = self.image.copy() image.thumbnail((width, height), Image.Resampling.LANCZOS) img = ImageTk.PhotoImage(image=image) self.canvas.create_image(1, 1, anchor=tk.NW, image=img) self.canvas.image = img self.filename.config(text=str(self.filepath.name)) if __name__ == '__main__': MainWin().mainloop()