首页  >  文章  >  后端开发  >  使用 Python 构建简单的图像加密工具

使用 Python 构建简单的图像加密工具

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-09 22:18:27829浏览

今天,我们将深入研究一个令人兴奋的项目,该项目将图像处理与基本加密技术相结合。我们将探索一个可以使用简单而有效的方法加密和解密图像的 Python 程序。让我们一步步分解吧!

先决条件

要跟随,您应该:

  1. Python 编程基础知识。
  2. Python 安装在您的计算机上。
  3. Pillow 库,这是一个用于处理图像的 Python 成像库。使用 pip installpillow 来安装。

  4. 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 函数使窗口保持打开状态并响应用户输入。

行动计划

Building a Simple Image Encryption Tool Using Python

结论

该程序演示了如何在像素级别操作数字图像以及如何使用伪随机数生成器来执行基本加密任务。

祝您编码愉快,并保持安全!

以上是使用 Python 构建简单的图像加密工具的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn