python图片隐写_Lsb图片隐写
前言
在剛剛過去的網鼎杯第一場比賽中,做到了一道雜項題是關于lsb隱寫的。LSB全稱為 least significant bit,是最低有效位的意思。Lsb圖片隱寫是基于lsb算法的一種圖片隱寫術,以下統稱為lsb隱寫,這是一種常見的信息隱藏方法。當然關于圖像的隱寫的方法有很多,統稱為隱寫術,以后會寫一篇總結這類隱寫的文章。這里只把lsb隱寫單獨拿出來分析,因為lsb隱寫很實用,算法簡單,能存儲的信息量也大,更何況是CTF比賽中的常客。還有一個原因是最近本人做的不少雜項題的坑都踩在了lsb隱寫上(是我太菜了,大神莫笑。),所以發誓一定要把這類題搞清楚。
隱寫術簡介
先簡單的講講什么是隱寫。由于我們識別聲音或圖片的能力有限,因此稍微改動信息的某一位是不會影響我們識別聲音或圖片的。隱寫和加密之間的相同點就是,都是需要經過特殊的處理才能獲得特定的信息。它們之間的不同點簡單的說就是,加密的話會是一些奇怪的字符,或數據。隱寫的話,就是信息明明就在眼前,但是你卻視而不見。古人的藏頭詩也是隱寫的一種啦。
Lsb隱寫
其實吧一開始我是想把一大堆算法理論和公式擺上來講講lsb隱寫是什么,但是想想,這種做法是真的可惡啊,擺明不想讓人看嘛。所以我想先從一道例題出發,原理什么的將在這個過程中,細細地講來。
先來看下面一張圖,這道題來自實驗吧(原題鏈接:http://www.shiyanbar.com/ctf/1897),題目名字叫--最低位的輕吻。
打開看是一張很著名的圖片-----勝利之吻。圖片是bmp格式。看到題目中有最低位幾個字,如果是對隱寫類的題目熟悉的話就能一下子想到是lsb隱寫。因為lsb隱寫就是利用的圖像中的最低有效位。最低有效位這個詞在前文中出現很多次了,但是到底是什么意思呢?
首先來講png圖片,png圖片是一種無損壓縮的位圖片形格式,也只有在無損壓縮或者無壓縮的圖片(BMP)上實現lsb隱寫。如果圖像是jpg圖片的話,就沒法使用lsb隱寫了,原因是jpg圖片對像數進行了有損壓縮,我們修改的信息就可能會在壓縮的過程中被破壞。而png圖片雖然也有壓縮,但卻是無損壓縮,這樣我們修改的信息也就能得到正確的表達,不至于丟失。BMP的圖片也是一樣的,是沒有經過壓縮的。BMP圖片一般是特別的大的,因為BMP把所有的像數都按原樣儲存,沒有進行壓縮。
png圖片中的圖像像數一般是由RGB三原色(紅綠藍)組成,每一種顏色占用8位,取值范圍為0x00~0xFF,即有256種顏色,一共包含了256的3次方的顏色,即16777216種顏色。而人類的眼睛可以區分約1000萬種不同的顏色,這就意味著人類的眼睛無法區分余下的顏色大約有6777216種。
LSB隱寫就是修改RGB顏色分量的最低二進制位也就是最低有效位(LSB),而人類的眼睛不會注意到這前后的變化,每個像數可以攜帶3比特的信息。
上圖我們可以看到,十進制的235表示的是綠色,我們修改了在二進制中的最低位,但是顏色看起來依舊沒有變化。我們就可以修改最低位中的信息,實現信息的隱寫。我修改最低有效位的信息的算法就叫做lsb加密算法,提取最低有效位信息的算法叫做lsb解密算法。
再放兩張圖加深下理解:
回到題目上來,這里我們使用一款功能很強大的lsb隱寫分析工具---StegSolve圖片通道查看器(下載地址:http://www.caesum.com/handboo...)。
使用過photoshop的朋友應該對圖片通道有些概念,一幅完整的圖像,紅色綠色藍色三個通道缺一不可。一幅圖像,如果關閉了紅色通道,那么圖像就偏青色。如果關閉了綠色通道,那么圖像就偏洋紅色。如果關閉了藍色通道,那么圖像就偏黃色。當然還有個Alpha通道,是一個8位的灰度通道,也可以理解為透明度(粗糙的理解)。關于圖像通道詳細的講解可以自行百度,這里不再詳細說明。
使用stegsolve打開圖片,按右方向鍵查看各通道顯示的圖像。一般有些題目會在某一個圖像通道中直接顯示出flag,但是顯然這題不行,看來還需要繞些彎,要獲取最低位的圖片信息。
所以這道題的思路就是將圖片轉換成0,1 像素點(圖像處理問題),這里可以直接使用MATLAB(MATLAB特別適合圖像處理,而且語法特別特別簡單):
在命令行窗口輸入以下命令:
filename='01.bmp';
imfinfo(filename);
A = imread(filename);
B = logical(bitget(A,1));
imshow(B);
指令詳解:
運行得結果如下。掃描這個二維碼,就能直接得到flag,有興趣的朋友可以自己動手掃一下。
這里還可以使用其他的編程算法來解,原理都是一樣的,但如果不會matlab語法,該怎么辦呢。其實這題還有一種解法,因為只是簡單的獲取最后一位然后畫圖,但是為啥stegsolve獲取不到呢。
我們先來看下圖像信息:
發現是bmp的8位灰度圖。猜測是StegSolve解析8位的BMP存在問題?
常見的8位通道RGB圖像,3個通道共24位,即一張24位RGB圖像里可表現大約1670萬種顏色;而16位通道RGB圖像,3個通道共48位,2的48次方是多少種顏色。32位深度CMYK(8位×4通道)。
這里的8位、16位、32位指顏色深度(Color Depth)用來度量圖像中有多少顏色信息可用于顯示或打印像素,其單位是“位(Bit)”,所以顏色深度有時也稱為位深度。
常用的顏色深度是1位、8位、24位和32位。1位有兩個可能的數值:0或1。較大的顏色深度(每像素信息的位數更多)意味著數字圖像具有較多的可用顏色和較精確的顏色表示。
試試轉換成png格式呢再看看呢?用畫圖另存為png格式(不能直接改后綴)。此時發現文件變大,圖像信息如下圖:
用StegSolve打開后,在RGB的最后一位看到二維碼。(原圖在保存的時候顯示的類型是256色位圖,就是位深度為8,如果保存為24位位圖的bmp格式,不轉換為png格式,也能用StegSolve找到如上圖的二維碼。)
所以我們改變圖片位深度,就能得到其中的二維碼信息。
Lsb隱寫的變形題
經過上面的例子,我們基本上了解了什么是lsb隱寫。一般的lsb隱寫我們都能使用工具或者編寫程序提取到圖片的最低有效位信息,從而得到其中的內容。但是出題人的腦洞不局限于此,lsb隱寫還有各種擴展的使用方法。下面是網鼎杯第一場中的一道雜項題,也是一道lsb隱寫題。不同的是,光提取最低有效位是不能進行解答的。
首先給我們的是一張花花的圖是png格式。題目名字是minify,使變小的意思,那應該就是指lsb隱寫。
光憑肉眼是真的什么也看不出,我們借助于工具StegSolve進行分析。
一路翻下去,除了花花的還是花花的,唯一值得懷疑的地方就在red plane 0 這里是純黑,
說明這里什么也沒有,正常的圖片都不會是這樣子的,其它通道也都顯示正常。所以這個異常給我們什么啟示呢?從這里可以真正確定是lsb隱寫了。
那我們要從其他的通道比如:blue、alpha、green中找些到信息。整張圖片看起來是毫無規則的像素點,那一定想把真正的信息隱藏起來,再用一些毫無規則的像素點干擾我們。我們如果想得到其中的信息,就要去掉這些干擾點。但是到底去掉哪些呢。經過前面的步驟我們知道了信息可能隱藏在plane 0中,所以我們要先把各個通道的plane 0提取出來。Red plane 0因為是空信息,可以不用提取了。我們提取出(File->Save as)Green plane 0、Alpha plane 0、Blue plane 0,把他們各另存為一張圖。然后各個圖進行比對(Analyse->image Combiner),最后發現Alpha plane 0 和Green plane 0 異或運算下的圖出現了flag
異或對比常常是為了檢查兩張圖片之間的差異,能發現我們肉眼看不到的及細微的差異。
上圖是異或(XOR)對比出一張圖片中的區別,所以用這個方法,也能把我們的信息隱藏在其中,但我覺得這并不是一種實用的方法。
后話
CTF中有關隱寫術的這類題目真的是考驗腦洞了,擴展開講,還有能有很多很多可以舉例的。Lsb隱寫還能結合其他的隱寫術,不只是能隱藏一些圖片,還能把文件寫入其中。這類題目這就需要用其他的工具進行文件提取分離,比如binwalk和foremost。當然,萬變不離其宗,這里我們只要把原理搞清楚就足夠了,剩下的就是解題思路,這就需要開開腦洞了。網上也存在著很多優秀的lsb隱寫算法,能夠實現更多復雜的操作,有興趣的朋友可以進一步的去了解。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python图片隐写_Lsb图片隐写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CRM、SRM、SCM系统的区别
- 下一篇: php 程序执行时间检测