2017年4月23日 星期日

隱寫術實作: 把小檔案藏在圖檔或文字檔裡

隱寫術: 把資訊藏在圖檔裡 美國越來越不像是個民主國家。 以後旅經美國可能會需要 交出密碼。 表面上說這是為了反恐, 但其實是 維安劇場 的一部分, 真正的目的是要讓政府可以擴權、 甚至踐踏人權。 所以你的資料光是加密還不夠, 甚至需要讓人看不出加密檔的存在。 這個時候你需要 隱寫術 Steganography [ 維基百科]。

最簡單的方式是 cat cover.jpg secret.zip > steg.jpg 這裡的 cover.jpg 叫做 cover file, 也就是用來掩護內嵌檔的 「載具」; secret.zip 是需要隱藏/內嵌 (embed) 的機密檔; 打包完的 steg.jpg 稱為 stegofile。 用看圖軟體去開 steg.jpg 看起來就是一張普通的圖片; 但用 unzip 指令去開 steg.jpg 則會將 secret.zip 的內容解出來。

這個方法限用於 zip 格式。 它的優點是可以藏任意大小的檔案; 缺點是攻擊者只需要用 unzip 指令去測試每個 jpg 檔就可以把它挖出來了。

如果你需要更高的防護力, 而且你要保護的極重要機密檔案很小 (幾 k, 最多四五十 k, 例如像是 「只在記憶體裡解密」 文中的 gnupg.gpg) 那麼可以用 steghide 來打包隱藏它。 以 steghide 方式所打包隱藏的檔案, 即使用第一階的統計方法去測試它, 也無法看出跟普通圖片檔有何不同。 請安裝 steghide 套件, 並且強烈建議先將你的機密檔案壓縮、 加密。

再來要找一張 jpg 圖來當做 cover file。 可以先查看它能夠容納多大的機密檔: steghide info cover.jpg 一般桌布大小的圖大概只能放幾 k; 放個 20k 就很不錯了。 相機通常預設調到很高的解析度, 所以拍起來的圖檔夠大, 也許可以存放 40k 左右的機密資訊。 如果有很多相片/圖片檔, 可以一口氣查詢, 找出每張圖檔的容量。 為了避免上述指令不斷詢問, 我們乾脆用 -p 隨便指定一個 (不存在的) 密碼、 忽略錯誤訊息, 然後把它包在迴圈裡面, 最後並將所有相片檔按照容量排序: for f in *.jpg ; do steghide info -p '' $f | perl -pe 's/\n/ /' ; echo ; done > capacity.txt ; sort -n -k 5 capacity.txt

找到夠大又夠自然的理想 cover.jpg 之後, steghide embed -cf cover.jpg -ef gnupg.gpg -sf steg.jpg 照著要求設定密碼, 就產生成果檔 steg.jpg (當然不要取這個名字, 要取比較自然、 不起眼的名字)。 成果檔不僅看起來跟原始的 cover.jpg 一模樣, 而且甚至可能更小一點。 現在可以把 gnupg.gpg 刪掉, 任誰怎麼找也無法在電腦上發現這個機密檔案; 但是只要下: steghide extract -sf steg.jpg 並回答密碼, 這個機密檔案就又回來了!

因為它能夠隱藏的檔案很小, 所以建議拿它來隱藏密碼文字檔 (當然不要用 .odt 或 .doc 等等, 用純文字檔比較小) 或是 gpg 私鑰就好。 雖然 steghide 也可以拿 .wav 或 .au 來當作 cover file, 但是大家聽音樂都是 .mp3, 這些格式看起來不太自然呵!

[2019/8/24] 突然有靈感, 搜尋到 「lsb steganography」 類型的演算法, 例如 cloacked-pixel。 可是這類演算法只能拿 *.png 當作 cover file ; jpg 因為採用 DCT 存檔, 無法修改個別的 pixel。 又回頭搜尋 steghide 的相關文章, 從 這個問答 找到 steghide 的論文。 看不太懂, 但總之他們的演算法很厲害, 安全性高, 且適用於 png 與 jpg。 論文裡有提到: 一個 jpg 格式的 cover file 大約可以承載 5.8% 左右的 embed file。 我也實作測試了一下: 如果不夠用, 可以用 convert -resize 300% cover.jpg cover3.jpg 之類的, 把解析度變成 3*3 倍, 那麼可承載的容量也會變大。 (但是容量跟檔案大小大約成正比, 而不是跟解析度成正比。)

另外還有 outguess 也有類似的功能; 不過有看到一篇 攻擊 outguess 的文章, 所以就不敢推薦它了。 (其實這個攻擊是否適用於 steghide? 我也不知道。) 至於另一個隱寫套件 stegsnow 則是把資訊以空格/Tab 方式藏在文字檔每列後面, 這連我都可以寫個簡單程式偵測出來, 當然就更不適合隱藏重要的資訊, 只能用來耍帥騙騙小朋友而已。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。