https://cryptohack.org/challenges/general/#
今天這題比較難,要自己找出密鑰。
題目要求我們對這兩張圖片的 RGB 顏色值進行 XOR 運算
pip install numpy
pip install pillow
from PIL import Image as img
import numpy as np
# 讀取兩張圖片
img1 = img.open('lemur.png')
img2 = img.open('flag.png')
# 將圖片轉換為numpy數組
arr1 = np.array(img1)
arr2 = np.array(img2)
接下來的步驟提供兩種解法(方法大同小異)
1.
# 執行RGB字節的XOR操作
result_arr = np.bitwise_xor(arr1, arr2)
# 創建新的圖片對象
result_img = img.fromarray(result_arr.astype('uint8'), 'RGB')
# 保存结果图片
result_img.save('result.png')
print("XOR 操作完成。請檢察 'result.png' 以查看结果。")
#進行RGB字節的XOR操作並將圖片直接顯示
img.fromarray(arr1^arr2).show()
最後得到的圖片如下:
>crypto{X0Rly_n0t!}
運用到了前面所學到的xor運算性質,若A^B=C,那麼C^B會還原成A,C^A會還原成B。而在這題,兩張圖片都和同一個密鑰進行了XOR運算,所以當我們再對這兩張圖片做 XOR 操作時,密鑰的效果會被抵消,所得到的結果就是原始圖片之間的差異。這樣會生成一張新圖片,顯示出兩張原始圖片的不同,當中可能就藏著flag。
而需要注意的是,這個方法成立的前提是這兩張圖片的大小和格式相同,若不相同則還需要進行額外的處理。
rgba(22, 0, 0, 1)
代表不透明的紅色。這題涉及到我的知識盲區了,所以上述內容與解法都上在網路上查詢、詢問chatbot後統整的,在此放上相關資料。
解題相關:
今天發現challenge裡面還有一題xor題目,所以就來解解看~