影像加解密是保護圖像資訊安全的重要技術。
透過加密,可以避免影像內容被未授權的人查看;解密則可還原原始圖片。
今天我們用 OpenCV 與 NumPy,示範如何利用位元異或(bitwise_xor)來實作簡單的影像加密與解密。
首先,準備一張彩色圖片(image.jpg)並放在同一資料夾中。
使用 OpenCV 讀取圖片:
import cv2
import numpy as np
img = cv2.imread('image.jpg')
為了觀察加解密前後的效果,先顯示原始圖片:
cv2.imshow("Original Image", img)
為了讓視窗停留方便觀察,最後加上:
cv2.waitKey()
cv2.destroyAllWindows()
使用 NumPy 隨機產生一個與圖片尺寸及通道數相同的整數陣列,作為加密用的金鑰。
這把金鑰將用於和圖片進行位元異或運算。
# 產生與圖片大小相同的隨機整數陣列(值介於0~255)
key = np.random.randint(0, 256, img.shape, np.uint8)
cv2.imshow("Encryption Key", key)
下圖顯示原圖與隨機金鑰:
利用 OpenCV 的 bitwise_xor
函數,將原圖與金鑰逐位元做 XOR 運算,產生加密後的圖片。
XOR 運算會對應像素的每個 bit 做異或,讓圖片外觀變得像是亂碼。
# 將原圖與金鑰進行 XOR,得到加密後的影像
img_encrypted = cv2.bitwise_xor(img, key)
cv2.imshow("Encrypted Image", img_encrypted)
加密後的圖片如下:
解密過程與加密相同,只要將加密後的圖片與同一把金鑰再做一次 XOR,就能還原原始圖片。
這是 XOR 運算的特性:同一數據 XOR 兩次,會還原成原始資料。
# 對加密圖片與同一金鑰再做 XOR,還原原圖
img_decrypted = cv2.bitwise_xor(img_encrypted, key)
cv2.imshow("Decrypted Image", img_decrypted)
解密後的圖片如下:
你可以比較解密後的圖片和原圖,它們是相同的,代表解密成功。
bitwise_xor
是一種逐位元的異或運算,常用於簡易的影像加解密。
加密時,原圖每個像素的位元與隨機金鑰的對應位元做 XOR,產生看似隨機的加密圖片。
解密時,用相同金鑰對加密圖做 XOR,因 XOR 的可逆性,成功還原原始圖像。
簡單公式:
原始資料 XOR 金鑰 = 加密資料
加密資料 XOR 金鑰 = 原始資料
此方法運算快速且易實現,但金鑰必須妥善保存,且安全性有限,適合教學和簡單保護。