오늘은 이미지 처리와 기본 암호화 기술을 결합한 흥미로운 프로젝트에 대해 알아보겠습니다. 간단하면서도 효과적인 방법을 사용하여 이미지를 암호화하고 해독할 수 있는 Python 프로그램을 살펴보겠습니다. 단계별로 나누어 보겠습니다!
따라가려면 다음이 필요합니다.
이미지 처리에 사용되는 Python 이미징 라이브러리인 Pillow 라이브러리입니다. pip install Pillow를 사용하여 설치하세요.
그래픽 사용자 인터페이스(GUI)를 구축하는 데 사용되는 Python 라이브러리인 Tkinter입니다. pip install tk를 사용하여 설치하세요.
이 프로그램은 사용자가 다음을 수행할 수 있는 그래픽 사용자 인터페이스(GUI)를 생성합니다.
암호화 프로세스는 시드 키를 기반으로 이미지의 픽셀을 섞어서 이미지를 인식할 수 없게 만듭니다. 복호화 프로세스에서는 이를 역전시켜 원본 이미지를 복원합니다.
import os from tkinter import Tk, Button, Label, Entry, filedialog, messagebox from PIL import Image import random
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!")
암호화 및 해독 기능:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!