使用 Python 构建简单的图像加密工具
今天,我们将深入研究一个令人兴奋的项目,该项目将图像处理与基本加密技术相结合。我们将探索一个可以使用简单而有效的方法加密和解密图像的 Python 程序。让我们一步步分解吧!
先决条件
要跟随,您应该:
- Python 编程基础知识。
- Python 安装在您的计算机上。
Pillow 库,这是一个用于处理图像的 Python 成像库。使用 pip installpillow 来安装。
Tkinter 这是一个用于构建图形用户界面 (GUI) 的 Python 库。使用 pip install tk 进行安装。
这个程序有什么作用?
该程序创建了一个图形用户界面 (GUI),允许用户:
- 选择图像文件
- 选择输出位置
- 输入种子密钥
- 加密或解密图像
加密过程根据种子密钥对图像的像素进行混洗,从而使图像无法识别。解密过程逆转了这一过程,恢复了原始图像。
代码说明
导入所需的库
import os from tkinter import Tk, Button, Label, Entry, filedialog, messagebox from PIL import Image import random
- os 提供与操作系统交互的函数。
- tkinter 提供 GUI 元素,如按钮、标签和输入字段。
- PIL(Pillow)允许我们打开、操作和保存图像。
- random 帮助我们使用 种子. 以确定的方式对像素进行洗牌
种子随机生成器函数
def get_seeded_random(seed): """Returns a seeded random generator.""" return random.Random(seed)
get_seed_random 函数返回一个随机对象,如果给定相同的种子值,该对象每次都可以以相同的方式对项目进行洗牌。
这是一致加密和解密图像的关键。
图像加密
def encrypt_image(input_image_path, output_image_path, seed): """Encrypts the image by manipulating pixel values.""" image = Image.open(input_image_path) width, height = image.size # Get pixel data as a list pixels = list(image.getdata()) random_gen = get_seeded_random(seed) # Create a list of pixel indices indices = list(range(len(pixels))) # Shuffle the indices using the seeded random generator random_gen.shuffle(indices) # Reorder pixels based on shuffled indices encrypted_pixels = [pixels[i] for i in indices] # Create new image encrypted_image = Image.new(image.mode, (width, height)) # Apply encrypted pixels to the new image encrypted_image.putdata(encrypted_pixels) # Save the encrypted image encrypted_image.save(output_image_path) return True
在此 encrypt_image 函数中:
- 我们加载图像并提取其像素数据。
- 使用种子随机生成器对像素顺序进行打乱,以确保解密时保持相同的打乱顺序。
- 我们使用打乱后的像素值创建一个新图像,并将其保存为加密图像。
图像解密
def decrypt_image(input_image_path, output_image_path, seed): """Decrypts the image by reversing the encryption process.""" image = Image.open(input_image_path) width, height = image.size # Get encrypted pixel data as a list encrypted_pixels = list(image.getdata()) random_gen = get_seeded_random(seed) # Create a new list to hold pixel indices in their original order indices = list(range(len(encrypted_pixels))) # Shuffle the indices again to get the original order random_gen.shuffle(indices) # Create a new image to hold the decrypted data decrypted_pixels = [None] * len(encrypted_pixels) # Restore original pixels using the shuffled indices for original_index, shuffled_index in enumerate(indices): decrypted_pixels[shuffled_index] = encrypted_pixels[original_index] # Save the decrypted image decrypted_image = Image.new(image.mode, (width, height)) decrypted_image.putdata(decrypted_pixels) decrypted_image.save(output_image_path) return True
decrypt_image 函数通过反转加密过程来工作。它:
- 加载加密图像。
- 使用相同的随机种子将像素重新调整回原来的顺序。
- 使用解密的像素创建并保存新图像。
文件选择功能
def select_input_image(): """Opens a file dialog to select an input image.""" input_image_path = filedialog.askopenfilename(title="Select Image") input_image_label.config(text=input_image_path) def select_output_image(): """Opens a file dialog to select an output image path.""" output_image_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png"),("JPEG files", "*.jpg;*.jpeg"),("All files", "*.*")], title="Save Encrypted/Decrypted Image") output_image_label.config(text=output_image_path)
select_input_image 函数允许用户使用文件对话框选择他们想要加密或解密的图像。
选定的图像路径将显示在 GUI 上。
同样,select_output_image函数允许用户选择保存输出图像的位置。
加密和解密按钮功能
def encrypt(): input_image_path = input_image_label.cget("text") output_image_path = output_image_label.cget("text") seed = seed_entry.get() if not input_image_path or not output_image_path: messagebox.showerror("Error", "Please select input and output images.") return if encrypt_image(input_image_path, output_image_path, seed): messagebox.showinfo("Success", "Image encrypted successfully!") def decrypt(): input_image_path = input_image_label.cget("text") output_image_path = output_image_label.cget("text") seed = seed_entry.get() if not input_image_path or not output_image_path: messagebox.showerror("Error", "Please select input and output images.") return if decrypt_image(input_image_path, output_image_path, seed): messagebox.showinfo("Success", "Image decrypted successfully!")
加密和解密函数:
- 获取选定的文件路径和用户输入的种子值。
- 确保用户在继续之前已选择输入和输出图像路径。
- 调用相应的 encrypt_image() 或 decrypt_image() 函数并在完成后显示成功消息。
创建图形用户界面
root = Tk() root.title("Image Encryption Tool") # Create and place widgets Label(root, text="Select Image to Encrypt/Decrypt:").pack(pady=5) input_image_label = Label(root, text="No image selected") input_image_label.pack(pady=5) Button(root, text="Browse", command=select_input_image).pack(pady=5) Label(root, text="Output Image Path:").pack(pady=5) output_image_label = Label(root, text="No output path selected") output_image_label.pack(pady=5) Button(root, text="Save As", command=select_output_image).pack(pady=5) Label(root, text="Enter Seed Key:").pack(pady=5) seed_entry = Entry(root) seed_entry.pack(pady=5) Button(root, text="Encrypt Image", command=encrypt).pack(pady=5) Button(root, text="Decrypt Image", command=decrypt).pack(pady=5) root.mainloop()
标签、按钮和文本输入字段使用 pack() 放置。
root.mainloop 函数使窗口保持打开状态并响应用户输入。
行动计划
结论
该程序演示了如何在像素级别操作数字图像以及如何使用伪随机数生成器来执行基本加密任务。
祝您编码愉快,并保持安全!
以上是使用 Python 构建简单的图像加密工具的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)