> 백엔드 개발 > 파이썬 튜토리얼 > Python을 사용하여 간단한 이미지 암호화 도구 구축

Python을 사용하여 간단한 이미지 암호화 도구 구축

Mary-Kate Olsen
풀어 주다: 2024-10-09 22:18:27
원래의
863명이 탐색했습니다.

오늘은 이미지 처리와 기본 암호화 기술을 결합한 흥미로운 프로젝트에 대해 알아보겠습니다. 간단하면서도 효과적인 방법을 사용하여 이미지를 암호화하고 해독할 수 있는 Python 프로그램을 살펴보겠습니다. 단계별로 나누어 보겠습니다!

전제 조건

따라가려면 다음이 필요합니다.

  1. Python 프로그래밍에 대한 기본 지식
  2. 컴퓨터에 Python이 설치되어 있습니다.
  3. 이미지 처리에 사용되는 Python 이미징 라이브러리인 Pillow 라이브러리입니다. pip install Pillow를 사용하여 설치하세요.

  4. 그래픽 사용자 인터페이스(GUI)를 구축하는 데 사용되는 Python 라이브러리인 Tkinter입니다. 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)을 사용하면 이미지를 열고, 조작하고, 저장할 수 있습니다.
  • 무작위는 시드를 사용하여 결정론적인 방식으로 픽셀을 섞는 데 도움이 됩니다.

시드된 무작위 생성기 기능

def get_seeded_random(seed):
    """Returns a seeded random generator."""
    return random.Random(seed)
로그인 후 복사

get_seeded_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() 함수를 호출하고 완료되면 성공 메시지를 표시합니다.

GUI 만들기

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿