今日は、画像処理と基本的な暗号化技術を組み合わせたエキサイティングなプロジェクトに取り組んでいきます。シンプルかつ効果的な方法を使用して画像を暗号化および復号化できる Python プログラムを検討します。段階的に見ていきましょう!
この手順を進めるには、次のものが必要です:
画像処理に使用される Python イメージング ライブラリである Pillow ライブラリ。インストールするには pip install ピローを使用します。
Tkinter は、グラフィカル ユーザー インターフェイス (GUI) の構築に使用される Python ライブラリです。インストールするには 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 中国語 Web サイトの他の関連記事を参照してください。