在密碼學(Cryptography)與資安鑑識中,XOR(Exclusive OR,異或運算) 是最核心且無所不在的運算。從基礎的串流加密(Stream Cipher)、一次性密碼本(One-Time Pad, OTP),到現代對稱式加密(如 AES),其背後都大量仰賴 XOR 的強大數學特性。
今天我們將深入探討 XOR 的位元特性,並結合**視覺密碼學(Visual Cryptography)**的概念,透過 Python (Pillow + NumPy) 處理兩張雜訊圖片,完成經典 CTF 題目破解。
Pixelated。XOR 的運算規則非常簡單:「相同為 0,不同為 1」。
| Bit A | Bit B | A XOR B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
假設 P 為明文(Plaintext)、K 為金鑰(Key)、C 為密文(Ciphertext):
A XOR A = 0 (任何數與自己做 XOR 必定為 0)A XOR 0 = A (任何數與 0 做 XOR 保持不變)C = P XOR K
P = C XOR K
C XOR K = (P XOR K) XOR K = P XOR (K XOR K) = P XOR 0 = P
視覺密碼學(Visual Cryptography) 是將秘密資訊(如文字或圖像)拆分成兩張或多張看似隨機亂碼(Noise)的影像。單看任一張圖都無法取得任何資訊,但只要將圖片對應位置的像素點(RGB 值)進行 ADD(相加) 或 XOR(異或) 疊加運算,雜訊就會彼此抵消,隱藏的 Flag 便會浮現。
Pixelated在 CyLab 平台開啟 Pixelated 題目,下載給定的兩張圖片:scrambled1.png 與 scrambled2.png。
圖片打開後皆為滿滿的彩點雜訊,無法直接辨識任何字樣。
開啓 WSL / Linux 終端機,確保已安裝圖片處理套件:
sudo apt update && sudo apt install python3-pil python3-numpy -y
撰寫 Python 解題腳本 solve.py:
from PIL import Image
import numpy as np
# 1. 載入兩張雜訊圖片
img1 = Image.open('scrambled1.png').convert('RGB')
img2 = Image.open('scrambled2.png').convert('RGB')
# 2. 轉為 NumPy 陣列進行逐像素運算
arr1 = np.array(img1)
arr2 = np.array(img2)
# 方式一:像素相加 (ADD 運算)
result_add_array = (arr1.astype(np.uint16) + arr2.astype(np.uint16)) % 256
Image.fromarray(result_add_array.astype(np.uint8)).save('flag_add.png')
# 方式二:像素異或 (XOR 運算)
result_xor_array = arr1 ^ arr2
Image.fromarray(result_xor_array.astype(np.uint8)).save('flag_xor.png')
print("處理完成!已生成 flag_add.png 與 flag_xor.png")

python3 solve.py
explorer.exe flag_add.png

開啟產出的 flag_add.png,畫面中央即浮現出清晰的文字 Flag:
academy{2f16d0c4}
