如何利用BMP文件的特殊結(jié)構(gòu)對(duì)信息文件進(jìn)行加密
在信息網(wǎng)絡(luò)化的今天,大量文件都是以電子文檔的形式進(jìn)行保存、傳達(dá)的。由于電子文檔具有可復(fù)制性與易傳遞性,在其帶給我們便利的同時(shí),又增加了其內(nèi)容被盜取的可能性。針對(duì)這一問(wèn)題,我們今天就給大家介紹一個(gè)新方法,將文字信息隱藏在24位真彩色BMP位圖中來(lái)實(shí)現(xiàn)信息文件加密。

一、利用BMP文件的特殊結(jié)構(gòu)對(duì)信息文件進(jìn)行加密基本思路
BMP(Bitmap-File)圖形文件是Windows采用的圖形文件格式,在Windows環(huán)境下運(yùn)行的所有圖象處理軟件都支持BMP圖象文件格式。Windows系統(tǒng)內(nèi)部各種圖像繪制操作都是以BMP格式為基礎(chǔ)的。
BMP位圖文件默認(rèn)的文件擴(kuò)展名是BMP或者bmp(有時(shí)它也會(huì)以.DIB或.RLE作擴(kuò)展名)。這種位圖格式把圖形定義成由點(diǎn)(像素)組成的圖案。
一個(gè)典型的位圖文件可看成由4個(gè)部分組成:位圖文件頭(bitmap-fileheader)、位圖信息頭(bitmap-informationheader)、色彩表(colortable)和定義實(shí)際位圖數(shù)據(jù)的字節(jié)陣列,其具體形式如下圖所示:
![]()
位圖文件頭包含關(guān)于這個(gè)文件的信息。如從哪里開(kāi)始是位圖數(shù)據(jù)的定位信息,位圖信息頭含有關(guān)于這幅圖像的信息,例如,以像素為單位的寬度和高度。色表中有圖像顏色的rgb值。對(duì)顯示卡來(lái)說(shuō),如果它不能一次顯示超過(guò)256種顏色,讀取和顯示。bmp文件的程序能夠把這些rgb值轉(zhuǎn)換到顯示卡的調(diào)色板從而產(chǎn)生準(zhǔn)確的顏色。
bmp文件可用每像素1、4、8、16或24位來(lái)為顏色信息編碼,這個(gè)位數(shù)稱(chēng)作圖像的顏色深度,它決定了圖像所含的最大顏色數(shù)。一幅1-bpp(位每像素,bitperpixel)的圖像只能有兩種顏色。而一幅24-bpp的圖像可以有超過(guò)16×106種不同的顏色。假使上圖所示BMP文件的色深是256色,那么在它的實(shí)際位圖數(shù)據(jù)中就是用每8位數(shù)據(jù)代表了位圖上一個(gè)點(diǎn)的色彩值。bmp文件的位圖數(shù)據(jù)格式依賴(lài)于每個(gè)像素顏色所用的編碼位數(shù)。
對(duì)于一個(gè)256色的圖像來(lái)說(shuō),每個(gè)像素占用文件中位圖數(shù)據(jù)部分的一個(gè)字節(jié)。像素的值不是rgb顏色值,而是文件中色表的一個(gè)索引值。所以在色表中如果第一個(gè)r/g/b值是255/0/0,那么像素值為0,表示它是紅色,像素值按從左到右的順序存儲(chǔ),通常從最后一行開(kāi)始。所以在一個(gè)256色的文件中,位圖數(shù)據(jù)中第一個(gè)字節(jié)就是圖像左下角的像素的顏色索引,第二個(gè)就是它右邊的那個(gè)像素的顏色索引。如果位圖數(shù)據(jù)中每行的字節(jié)數(shù)是奇數(shù),就要在每行都加一個(gè)附加的字節(jié)來(lái)調(diào)整位圖數(shù)據(jù)邊界為16位的整數(shù)倍。
并不是所有的bmp文件結(jié)構(gòu)都像上圖所示的那樣。例如,24-bpp(我們常說(shuō)的24位真彩色)的位圖文件就沒(méi)有實(shí)際意義上的色表,像素值可直接表示rgb值,在24-bpp位圖文件中只有“位圖文件頭”、“位圖信息”與“實(shí)際位圖數(shù)據(jù)”三個(gè)部分有實(shí)際意義,其中圖像上每個(gè)點(diǎn)的色彩分別由圖像文件“實(shí)際位圖數(shù)據(jù)”部分中的三個(gè)字節(jié),也就是24位來(lái)表示該點(diǎn)的rgb值,每個(gè)字節(jié)的值對(duì)應(yīng)一種組成混合光的基色光(紅色、綠色、藍(lán)色)的強(qiáng)度,比如說(shuō),24-bpp位圖中某個(gè)點(diǎn)的位圖色彩數(shù)據(jù)是16進(jìn)制數(shù)“00FF00”代表這個(gè)點(diǎn)發(fā)出的光的色彩是綠色光。
了解了24-bpp位圖的這一特點(diǎn)后,我們就可以聯(lián)想到既然對(duì)于24-bpp真彩色位圖“實(shí)際位圖數(shù)據(jù)”部分中的每一個(gè)字節(jié)的數(shù)值都代表位圖上某一個(gè)點(diǎn)的一種基色光的強(qiáng)度,那么,在我們少量改變?cè)撝档那闆r下,對(duì)于我們?nèi)祟?lèi)肉眼的視覺(jué)是無(wú)法辨認(rèn)這幅圖像所發(fā)生的變化的。還用上文所舉的例子:24-bpp位圖中某個(gè)點(diǎn)的位圖色彩數(shù)據(jù)是16進(jìn)制數(shù)“00FF00”代表這個(gè)點(diǎn)發(fā)出的光的色彩是綠色光,如果我們把該點(diǎn)的位圖色彩數(shù)據(jù)改為16進(jìn)制數(shù)“01FE00”,那么,在我們看來(lái)該點(diǎn)所發(fā)出的光仍然是綠色的??蓪?shí)際上,我們已經(jīng)將某些信息文件保存在這個(gè)位圖中了。
二、利用BMP文件的特殊結(jié)構(gòu)對(duì)信息文件進(jìn)行加密的步驟
有了以上基本思路就可以制定以下方案,將信息文件隱藏在24-bpp真彩色位圖的圖像中,其編程步驟是:
1、把機(jī)密文件的信息寫(xiě)到一個(gè)文本文件a.txt中去。
2、找到一個(gè)足夠大的24-bpp的位圖文件b.bmp。假如文本文件a.txt的文件大小是N字節(jié),位圖文件的“實(shí)際位圖數(shù)據(jù)”部分的大小就必須大于8×N字節(jié),因此,b.bmp文件的總長(zhǎng)度就必須大于8×N+54字節(jié)(除去“實(shí)際位圖數(shù)據(jù)”部分,24-bpp位圖文件的文件頭長(zhǎng)度為54字節(jié))。
3、將位圖文件b.bmp的“實(shí)際位圖數(shù)據(jù)”部分的每一個(gè)字節(jié)的末位數(shù)據(jù)都清除為零。
4、將文本文件中的數(shù)據(jù)按二進(jìn)制的方式讀取,最后,把這次讀出的數(shù)據(jù)一位一位地附加到位圖文件b.bmp“實(shí)際位圖數(shù)據(jù)”部分的每一個(gè)字節(jié)的末位上去。
到此,我們就將一個(gè)文本文件的信息藏到了一個(gè)24位真色彩位圖文件中去了,但同時(shí)我們還保證了我們的位圖文件的可用,因?yàn)?,我們只是改變了位圖文件b.bmp“實(shí)際位圖數(shù)據(jù)”部分每一個(gè)字節(jié)末位信息上的數(shù)據(jù),這對(duì)位圖文件原始圖樣的影響非常小。
這樣就造成了在普通用戶(hù)眼中b.bmp還是一個(gè)普通的圖形文件,而對(duì)加密者而言,只要我們把b.bmp文件“實(shí)際位圖數(shù)據(jù)”部分的每一個(gè)字節(jié)的末位數(shù)據(jù)讀出,再把它寫(xiě)入到一個(gè)文本文件中去,我們就可以讀出隱藏在圖形文件b.bmp中的信息文件了。
小知識(shí)之BMP文件
BMP是英文Bitmap(位圖)的簡(jiǎn)寫(xiě),它是Windows操作系統(tǒng)中的標(biāo)準(zhǔn)圖像文件格式,能夠被多種Windows應(yīng)用程序所支持。隨著Windows操作系統(tǒng)的流行與豐富的Windows應(yīng)用程序的開(kāi)發(fā),BMP位圖格式理所當(dāng)然地被廣泛應(yīng)用。







