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, 這些格式看起來不太自然呵!

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

沒有留言:

張貼留言