使用Python的tkinter库实现了一个简单的图像加密和解密功能。具体功能如下:创建一个选项卡tab2用于显示图像。定义了一个函数load_image用于加载图像并使用文件对话框让用户选择要加载的图像文件。定义了一个函数save_image用于保存图像将加密后的图像保存为jpg格式文件。定义了一个函数generate_key用于生成随机密钥并显示在密钥输入框中。定义了一个函数copy_key用
示例代码:
import tkinter as tk from tkinter import filedialog from tkinter import messagebox from PIL import Image, ImageTk from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import clipboard
class ImageEncryptor: def init(self, master): self.master = master self.master.title("Image Encryptor") self.master.geometry("600x600")
# create tab control
self.tabControl = tk.ttk.Notebook(self.master)
self.tabControl.pack(expand=1, fill="both")
# create tab2
self.tab2 = tk.Frame(self.tabControl)
self.tabControl.add(self.tab2, text="Image")
# create widgets
self.image_label = tk.Label(self.tab2)
self.image_label.pack()
self.load_button = tk.Button(self.tab2, text="Load Image", command=self.load_image)
self.load_button.pack()
self.generate_key_button = tk.Button(self.tab2, text="Generate Key", command=self.generate_key)
self.generate_key_button.pack()
self.copy_key_button = tk.Button(self.tab2, text="Copy Key", command=self.copy_key)
self.copy_key_button.pack()
self.key_label = tk.Label(self.tab2, text="Key:")
self.key_label.pack()
self.key_entry = tk.Entry(self.tab2, show="*")
self.key_entry.pack()
self.encrypt_button = tk.Button(self.tab2, text="Encrypt Image", command=self.encrypt_image)
self.encrypt_button.pack()
self.decrypt_button = tk.Button(self.tab2, text="Decrypt Image", command=self.decrypt_image)
self.decrypt_button.pack()
self.save_button = tk.Button(self.tab2, text="Save Image", command=self.save_image)
self.save_button.pack()
def load_image(self):
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg;*.jpeg;*.png;*.bmp")])
if file_path:
self.image = Image.open(file_path)
self.photo = ImageTk.PhotoImage(self.image)
self.image_label.config(image=self.photo)
def save_image(self):
if not hasattr(self, "encrypted_image"):
messagebox.showerror("Error", "No encrypted image to save.")
return
file_path = filedialog.asksaveasfilename(defaultextension=".jpg", filetypes=[("Image Files", "*.jpg")])
if file_path:
self.encrypted_image.save(file_path)
def generate_key(self):
key = AES.new(AES.block_size).encrypt(AES.block_size * b"\x00")
key_hex = key.hex()
self.key_entry.delete(0, "end")
self.key_entry.insert(0, key_hex)
def copy_key(self):
key_hex = self.key_entry.get()
clipboard.copy(key_hex)
def encrypt_image(self):
if not hasattr(self, "image"):
messagebox.showerror("Error", "No image to encrypt.")
return
key_hex = self.key_entry.get()
if not key_hex:
messagebox.showerror("Error", "Please enter a key.")
return
try:
key = bytes.fromhex(key_hex)
except ValueError:
messagebox.showerror("Error", "Invalid key format.")
return
cipher = AES.new(key, AES.MODE_ECB)
image_data = self.image.tobytes()
encrypted_data = cipher.encrypt(pad(image_data, AES.block_size))
self.encrypted_image = Image.frombytes(self.image.mode, self.image.size, encrypted_data)
self.encrypted_photo = ImageTk.PhotoImage(self.encrypted_image)
self.image_label.config(image=self.encrypted_photo)
def decrypt_image(self):
if not hasattr(self, "encrypted_image"):
messagebox.showerror("Error", "No encrypted image to decrypt.")
return
key_hex = self.key_entry.get()
if not key_hex:
messagebox.showerror("Error", "Please enter a key.")
return
try:
key = bytes.fromhex(key_hex)
except ValueError:
messagebox.showerror("Error", "Invalid key format.")
return
cipher = AES.new(key, AES.MODE_ECB)
encrypted_data = self.encrypted_image.tobytes()
decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
self.decrypted_image = Image.frombytes(self.encrypted_image.mode, self.encrypted_image.size, decrypted_data)
self.decrypted_photo = ImageTk.PhotoImage(self.decrypted_image)
self.image_label.config(image=self.decrypted_photo)
if name == "main": root = tk.Tk() app = ImageEncryptor(root) root.mainloop(
原文地址: https://www.cveoy.top/t/topic/hjQw 著作权归作者所有。请勿转载和采集!