Python 黑科技!把秘密藏在圖片裡!用 20 行程式碼實作 LSB 隱寫術 (Steganography)
各位好! 想像一個場景:你是電影裡的特務,要把一份機密文件傳給總部。你不能直接發 Email,因為網路被監控了;你也不能加密傳送,因為一團亂碼反而會引起懷疑。
最安全的做法,是把秘密藏在一張看起來人畜無害的貓咪梗圖裡。 這不是電影情節,這是真實存在的技術,叫做 隱寫術(Steganography)。今天我們要用 Python,實作其中最經典的一種手法:LSB (Least Significant Bit,最低有效位元)。
透過這個技術,你可以把文字、甚至另一張圖片,藏進一張圖的「像素」裡,而人類的肉眼完全看不出差異。
核心原理:欺騙你的眼睛
電腦裡的圖片,其實是由成千上萬個像素 (Pixel) 組成的。每一個像素都有三個顏色通道:R (紅)、G (綠)、B (藍)。
每個顏色的數值範圍是 0 ~ 255。 在電腦的二進位世界裡,255 寫成 11111111。 什麼是 LSB? LSB 指的就是這串二進位數字的最後一位 (最右邊那位)。 紅色 255 (二進位 11111111) -> 極限紅 紅色 254 (二進位 11111110) -> 稍微沒那麼紅一點點
重點來了: 人類的眼睛其實很鈍。我們根本分不出「紅色 255」和「紅 色 254」的差別。
駭客的思路 既然最後一位變了你也看不出來,那我們何不把最後一位替換成我們的秘密? 原本的像素:11111111 (最後一位是垃圾資訊) 藏入秘密後:11111110 (這最後一位是我們秘密訊息的一部分) 只要修改整張圖片所有像素的最後一位,我們就能神不知鬼不覺地塞入大量的文字資訊。 實作開始
為了讓程式碼簡潔有力,我們不手寫位元運算 (Bitwise Operation),直接使用 Python 專門處理這種黑科技的庫:stegano。
- 安裝套件
pip install stegano
- 準備一張圖片 請準備一張 PNG 圖片。 這項技術只能用 PNG (無失真壓縮)。千萬不能用 JPG!因為 JPG 會為了縮小檔案體積,自動把這些「微小的顏色差異」當作雜訊刪除掉,你的秘密就會直接消失。 我們假設這張圖片叫 cat.png。
- 把秘密藏進去 (Encode) 寫一個 hide_secret.py:
from stegano import lsb
secret_message = "hello world."
secret_image = lsb.hide("cat.png", secret_message)
secret_image.save("secret_cat.png")
print("秘密已隱藏!請查看 secret_cat.png")
print("這張圖看起來跟原圖一模一樣,但裡面藏了驚人的秘密...")
執行後,你會得到一張 secret_cat.png。
現在,請你把它打開來跟原圖 cat.png 比對一下。我可以保證,哪怕你用放大鏡看,你也看不出任何差別。這就是隱寫術的魅力。
- 把秘密取出來 (Decode) 現在,假設你的同伴收到了這張 secret_cat.png,他只需要執行這段解碼程式 reveal_secret.py:
from stegano import lsb
clear_message = lsb.reveal("secret_cat.png")
print("解密結果:")
print(clear_message)
輸出結果:
解密結果:
hello world.
進階:為什麼這叫「降維打擊」? 一般的資安防護(如防火牆、DLP)通常會檢查檔案內容是不是包含敏感關鍵字。 但當你用 LSB 隱寫術時: 檔案格式是正常的 PNG 圖片。 檔案大小幾乎沒有變化。 圖片內容肉眼看起來完全正常。 對於傳統的偵測工具來說,這就是一張普通的貓咪照片。這就是為什麼這種技術常被用於 CTF (駭客奪旗賽) 。
結語與應用 今天我們用 Python 體驗了一把當駭客的感覺。 雖然這裡用的是現成的 stegano 庫,但背後的原理(修改 RGB 的最後一個 bit)是非常通用的。這項技術在現實生活中也有正當用途,例如 數位浮水印 (Digital Watermarking) —— 攝影師會在照片的雜訊中藏入版權資訊,證明這張圖是他的。 最後的小作業: 試試看,能不能把一篇完整的文章,甚至把「另一張小圖片」轉成文字編碼後,藏進一張 4K 的大桌布裡?(提示:圖片越大,能藏的像素就越多!) 下次如果朋友傳給你一張奇怪的風景照,說不定裡面就藏著給你的告白信喔!
0 留言
發表留言