iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
Security

密碼學小白的學習之路系列 第 8

[Day 8] 題目(Lemur XOR) & RGB、Hex色碼介紹

  • 分享至 

  • xImage
  •  

Challenge-Xor5 Lemur XOR

https://cryptohack.org/challenges/general/#
https://ithelp.ithome.com.tw/upload/images/20240814/20168165sUFyvftUXv.png
今天這題比較難,要自己找出密鑰。

題意:

  • 題目說他已經用相同的密鑰透過 XOR 隱藏了兩個很酷的圖像,這樣我們就看不到它們了!

hint:

題目要求我們對這兩張圖片的 RGB 顏色值進行 XOR 運算

前置準備:

  • 先下載題目給的兩張圖片並分別改名成lemur.png、flag.png,接著確保這兩張圖片等下要執行的python檔在同一個資料夾內
    兩張圖片分別如下:
    https://ithelp.ithome.com.tw/upload/images/20240814/20168165P0B7s5kjg9.png

https://ithelp.ithome.com.tw/upload/images/20240814/20168165AGZoIxGrPF.png

  • 安裝numpy庫以及PIL庫
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()

最後得到的圖片如下:
https://ithelp.ithome.com.tw/upload/images/20240814/201681658B0ivVCMjg.png

>crypto{X0Rly_n0t!}


操作原理:

運用到了前面所學到的xor運算性質,若A^B=C,那麼C^B會還原成A,C^A會還原成B。而在這題,兩張圖片都和同一個密鑰進行了XOR運算,所以當我們再對這兩張圖片做 XOR 操作時,密鑰的效果會被抵消,所得到的結果就是原始圖片之間的差異。這樣會生成一張新圖片,顯示出兩張原始圖片的不同,當中可能就藏著flag。

而需要注意的是,這個方法成立的前提是這兩張圖片的大小和格式相同,若不相同則還需要進行額外的處理。


RGB 介紹

  • 三原色:主要用於螢幕顯示。
  • R 代表紅色光 (Red)、G 代表綠色光 (Green)、B 代表藍色光 (Blue)。
  • 三種顏色的光各自具有 0~255 的色階(共 256 個,也就是 8 位元,2^8=256)。
  • 表示法為:(R, G, B) = (0~255, 0~255, 0~255)。
    • 這個數值表示該顏色的亮度,例如紅色是 (255, 0, 0),藍色是 (0, 0, 255),綠色是 (0, 255, 0),三種顏色各自達到最大值。白色為 (255, 255, 255),而黑色為 (0, 0, 0)。
  • 此外,可以在最後加入 Alpha 值,表示透明度,0 為全透明,1 為完全不透明。例如:rgba(22, 0, 0, 1) 代表不透明的紅色。

Hex 色碼(RGB模式)介紹

  • 色碼由「#」開頭,長度為六位數,前三組的兩位數字分別表示 RGB 三個色碼的值。例如:
    RGB與Hex對照表
  • 為什麼 RGB 各有兩位呢?RGB 各有 256 個色階,轉換成 16 進制時,16^2 = 256,所以每個色階用兩位數字表示。
  • Hex 色碼由 0-9 和 A-F 組成(A-F 對應值為 10-15)。數字越大,表示該色的亮度越高。
  • 例如:
    #FFFFFF 是白色(RGB 都達到最亮)。
    #000000 是黑色(RGB 都為最暗)。
    #FF0000 是純紅色(R 為最亮,G 和 B 為最暗)。
    #0000FF 是純藍色(R 和 G 為最暗,B 為最亮)。

參考資料:

這題涉及到我的知識盲區了,所以上述內容與解法都上在網路上查詢、詢問chatbot後統整的,在此放上相關資料。
解題相關:

後話:

今天發現challenge裡面還有一題xor題目,所以就來解解看~


上一篇
[Day 7] 題目(Intro- 10)
下一篇
[Day 9]題目(Modular-1、2) & GCD、EGCD介紹
系列文
密碼學小白的學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言