孫穎穎,陳震海,張瀚勻
(1.廣西師范大學(xué)計(jì)算機(jī)科學(xué)與信息工程學(xué)院,桂林541004;2.廣西師范大學(xué)圖書(shū)館,桂林541006)
隨著計(jì)算機(jī)網(wǎng)絡(luò)的快速發(fā)展,信息隱藏技術(shù)已經(jīng)成為信息安全領(lǐng)域的一個(gè)重要分支。該技術(shù)類(lèi)似于生物學(xué)中的保護(hù)色,通過(guò)將秘密信息加密隱藏至外部載體中,以達(dá)到保護(hù)秘密信息的效果。一般來(lái)說(shuō),載體圖像會(huì)因?yàn)槊孛苄畔⒌那度氚l(fā)生一定程度的失真,在例如醫(yī)學(xué)、軍事、藝術(shù)品保護(hù)等領(lǐng)域,載體圖像的失真可能造成用戶(hù)的誤讀和錯(cuò)判,從而帶來(lái)巨大的損失。新興的無(wú)損圖像信息隱藏技術(shù)[1-3]恰好解決了這一問(wèn)題。這一技術(shù)實(shí)現(xiàn)了在不破壞載體圖像的前提下完成信息的傳遞,這種獨(dú)特的優(yōu)勢(shì)吸引著越來(lái)越多的研究人員將目光集中在無(wú)損圖像信息隱藏技術(shù)上。目前常見(jiàn)的可逆信息隱藏算法[4]主要有以下5 大類(lèi):①基于無(wú)損壓縮的可逆信息隱藏算法[5],該類(lèi)算法通過(guò)壓縮數(shù)據(jù)的冗余信息騰出空間來(lái)嵌入秘密信息。②基于差值擴(kuò)展的可逆信息隱藏算法[6],該類(lèi)算法通過(guò)擴(kuò)展兩個(gè)像素之間的差異來(lái)嵌入秘密信息。③基于直方圖平移的可逆信息隱藏算法[7],該類(lèi)算法通過(guò)修改圖像的最值信息獲取冗余空間來(lái)嵌入秘密信息。④基于預(yù)測(cè)誤差擴(kuò)展的可逆信息隱藏算法[8],該類(lèi)算法使用預(yù)測(cè)誤差擴(kuò)展來(lái)嵌入數(shù)據(jù)。⑤基于整數(shù)變換的可逆信息隱藏算法[9],該類(lèi)算法使用可逆對(duì)比映射的整數(shù)變換技術(shù)來(lái)構(gòu)建。
因?yàn)楝F(xiàn)有實(shí)現(xiàn)信息隱藏技術(shù)的工具較少,故本文使用直方圖平移技術(shù)設(shè)計(jì)并實(shí)現(xiàn)了基于直方圖平移的無(wú)損圖像信息隱藏軟件。該軟件不僅可以實(shí)現(xiàn)秘密信息在載體圖像上的嵌入與提取,同時(shí)可以保證在信息提取之后,可以無(wú)差別地將載體圖像恢復(fù)至秘密信息嵌入之前的狀態(tài)。實(shí)驗(yàn)結(jié)果表明,該軟件可以有效實(shí)現(xiàn)秘密信息的嵌入和提取,并且能無(wú)損恢復(fù)載體圖像。接下來(lái)將介紹該軟件核心算法、設(shè)計(jì)與實(shí)現(xiàn)、軟件測(cè)試這三部分。
本文利用Ni 等人在文獻(xiàn)[7]提出的基于直方圖平移的可逆信息隱藏算法實(shí)現(xiàn),基本原理是計(jì)算出載體圖像的像素直方圖,修改直方圖中的最值使圖像產(chǎn)生冗余空間,并向冗余空間中嵌入秘密信息。下面將詳細(xì)介紹信息嵌入、信息提取和圖像恢復(fù)的具體方法。
嵌入秘密信息需先平移直方圖產(chǎn)生冗余空間,再將秘密信息嵌入該空間。通過(guò)計(jì)算找到相應(yīng)直方圖的最大值P 和最小值Z。之后對(duì)圖像進(jìn)行整體掃描,使圖像在P 到Z 的開(kāi)區(qū)間內(nèi)的像素值進(jìn)行加一或者減一操作。設(shè)Mij表示載體圖像像素,M'ij表示直方圖平移后的圖像像素,則產(chǎn)生冗余空間的公式可定義為:

隨后將秘密信息嵌入到圖像中。本軟件使用OpenCV 圖像處理庫(kù)中Mat 類(lèi)的at()函數(shù),讀取圖像像素值,當(dāng)載體圖像中像素值等于最大值P 時(shí),如果對(duì)應(yīng)的嵌入信息為“1”,那么該像素值進(jìn)行加一操作,反之該像素值不變。設(shè)Sl表示秘密信息,M''ij表示嵌入秘密信息后的圖像像素,可以通過(guò)如下公式表示該嵌入過(guò)程。
實(shí)際就是信息嵌入模塊的逆向操作。為保證軟件的安全性,首先要進(jìn)行安全檢驗(yàn),使用提取出的密鑰與用戶(hù)所輸入的密鑰進(jìn)行對(duì)比,兩者相同即可進(jìn)行以下信息提取操作。對(duì)該載體圖像進(jìn)行整體掃描,若遇到像素值為P+1,則對(duì)應(yīng)提取信息為“1”。反之,若遇到像素值為最大值P,那么對(duì)應(yīng)提取信息為“0”。將提取出的二進(jìn)制序列與密鑰進(jìn)行異或操作即可得到解密后的秘密信息。設(shè)b 為提取的信息,則可用以下公式表示信息提取過(guò)程。

顯然這部分是將載體圖像的像素值進(jìn)行還原,以實(shí)現(xiàn)載體圖像無(wú)失真的恢復(fù)。具體操作為:先將在最大值P 和最小值Z 的開(kāi)區(qū)域間的像素值進(jìn)行加一(或減一)操作即進(jìn)行直方圖平移操作,再將提取出的開(kāi)銷(xiāo)信息整合到載體圖像中。設(shè)Aij表示移位后的新像素,則可用以下公式表示圖像恢復(fù)模塊的直方圖平移過(guò)程。

設(shè)Aij表示無(wú)損恢復(fù)后的像素,(m,n)表示零值點(diǎn)的位置信息,可以通過(guò)如下公式將開(kāi)銷(xiāo)信息整合到載體圖像以實(shí)現(xiàn)圖像的無(wú)損恢復(fù)。

該軟件將文本信息或數(shù)據(jù)文件嵌入到BMP 格式的載體圖像中[10],并且可以將該信息提取出來(lái),最后完全恢復(fù)圖像。接下來(lái)對(duì)該軟件設(shè)計(jì)以及實(shí)現(xiàn)部分進(jìn)行介紹。
根據(jù)上述功能需求,該軟件的功能結(jié)構(gòu)如圖1 所示,其功能模塊介紹如下。①文本信息嵌入模塊:選擇載體圖像,手動(dòng)輸入信息和密鑰,將文本信息嵌入載體圖像中。②數(shù)據(jù)文件嵌入模塊:選擇載體圖像和數(shù)據(jù)文件,輸入密鑰,將數(shù)據(jù)文件嵌入載體圖像中。③文本信息提取模塊:選擇載體圖像,輸入提取密鑰,獲取并顯示秘密信息。④數(shù)據(jù)文件提取模塊:選擇載體圖像,輸入提取密鑰,將數(shù)據(jù)文件提取出來(lái)并顯示其路徑。⑤查看恢復(fù)圖像模塊:選擇載體圖像,輸入恢復(fù)密鑰,密鑰正確會(huì)顯示該圖像路徑,通過(guò)路徑可查看恢復(fù)后的圖像。

圖1 軟件功能結(jié)構(gòu)圖
軟件信息嵌入過(guò)程(a)和提取過(guò)程(b)如圖2 所示。用戶(hù)A 選取一張載體圖像和需要嵌入的秘密信息,并且輸入密鑰,該軟件將秘密信息預(yù)處理后,通過(guò)嵌入算法將其嵌入載體圖像中,生成載密圖像。用戶(hù)B 得到載密圖像,使用該軟件,通過(guò)提取密鑰從載密圖像中獲得秘密信息和無(wú)損的原圖像。
為保證秘密信息的安全性,需要對(duì)它進(jìn)行預(yù)處理。該軟件采用MD5 加密技術(shù)將密鑰轉(zhuǎn)為32 位隨機(jī)字符串,再將其轉(zhuǎn)為比特流,通過(guò)與秘密信息進(jìn)行異或運(yùn)算,達(dá)到對(duì)秘密信息的加密處理。設(shè)表示密鑰,表示秘密信息,表示加密后的秘密信息,加密公式(異或運(yùn)算)可定義為:


圖2 軟件信息嵌入和提取過(guò)程圖
因信息提取過(guò)程需要借助最值信息,故需將其構(gòu)造為附加信息嵌入圖像。先把第一對(duì)最值信息寫(xiě)入圖像的前兩個(gè)像素,并將這兩個(gè)像素、最值對(duì)數(shù)和剩余最值信息一起轉(zhuǎn)為比特序列構(gòu)成附加信息。另外,附加信息的長(zhǎng)度是由所需字節(jié)+信息長(zhǎng)度(比特序列)組成,其中使用兩位比特?cái)?shù)表示其所需字節(jié)。若信息長(zhǎng)度為0~255,則需要一個(gè)字節(jié)存儲(chǔ);若為256~65535,則需兩個(gè)字節(jié)存儲(chǔ);若長(zhǎng)度大于65535,則需四個(gè)字節(jié)存儲(chǔ)。本文設(shè)定“00”表示一個(gè)字節(jié),“01”表示兩個(gè)字節(jié),“10”表示三個(gè)字節(jié)。加密后的秘密信息長(zhǎng)度組成方式與附加信息相同。
另外,若零值點(diǎn)(頻率最小值點(diǎn))不為0,則需記錄下這些零值點(diǎn)的位置信息,以便圖像恢復(fù)時(shí)使用。所以需將其作為開(kāi)銷(xiāo)信息嵌入圖像中。預(yù)處理后秘密信息結(jié)構(gòu)如圖3 所示。

圖3 預(yù)處理后秘密信息結(jié)構(gòu)
本文軟件是在Windows 7 系統(tǒng)環(huán)境下,使用C++語(yǔ)言在Microsoft Visual C++2013 平臺(tái)進(jìn)行開(kāi)發(fā)。其中使用的圖像處理庫(kù)為OpenCV3,故在軟件開(kāi)發(fā)前期,需對(duì)該平臺(tái)進(jìn)行OpenCV 環(huán)境配置。軟件界面利用MFC進(jìn)行設(shè)計(jì),功能界面設(shè)計(jì)較為簡(jiǎn)潔。界面整體設(shè)計(jì)采用菜單與子菜單的形式,實(shí)現(xiàn)用戶(hù)運(yùn)行軟件后出現(xiàn)含有“信息嵌入”與“信息提取”兩個(gè)菜單項(xiàng)的主界面,點(diǎn)擊菜單項(xiàng)可以選擇子菜單。每個(gè)子菜單項(xiàng)分別對(duì)應(yīng)一個(gè)功能模塊,其中每個(gè)模塊的界面都有菜單、按鈕、編輯框、復(fù)選框等控件。
軟件使用面向?qū)ο蠛湍K化的思想,將每個(gè)功能模塊作為一個(gè)類(lèi)進(jìn)行代碼實(shí)現(xiàn)。其中設(shè)計(jì)TextHide 類(lèi)實(shí)現(xiàn)文本信息嵌入模塊、FileHide 類(lèi)實(shí)現(xiàn)數(shù)據(jù)文件嵌入模塊、TextExtract 類(lèi)實(shí)現(xiàn)文本信息提取模塊、FileExtract類(lèi)實(shí)現(xiàn)數(shù)據(jù)文件提取模塊、PicExtract 類(lèi)實(shí)現(xiàn)圖像恢復(fù)模塊。因?yàn)楸拒浖幚淼氖荁MP 格式,所以在讀取和保存圖像文件時(shí),使用Windows.h 頭文件中的BIT?MAPEFILE 和BITMAPINFOHEADER 來(lái)讀取或者構(gòu)造BMP 文件。在圖像信息處理部分,軟件通過(guò)OpenCV圖像處理庫(kù)中calcHist()函數(shù)計(jì)算圖像直方圖,Mat 類(lèi)的at()函數(shù)讀取圖像像素值。軟件設(shè)計(jì)了char_array_2_binary_str()函數(shù)實(shí)現(xiàn)信息嵌入之前秘密信息從字符流轉(zhuǎn)為字節(jié)流以及信息提取之后將秘密信息從字節(jié)流轉(zhuǎn)換成字符流。設(shè)計(jì)HistShift()函數(shù)實(shí)現(xiàn)信息嵌入功能,InfoExtr()函數(shù)實(shí)現(xiàn)信息提取功能,RecoverPic()函數(shù)實(shí)現(xiàn)圖像恢復(fù)功能。
為測(cè)試該軟件的功能,選取如圖4 所示彩色圖(a)以及灰度圖(b)作為測(cè)試圖像用例,使用“在我塵世歲月的狹窄河流上……”為文本測(cè)試用例,“G://newOut?put.txt”為數(shù)據(jù)文件測(cè)試用例。

圖4 載體圖像測(cè)試用例
在軟件界面中選擇“信息隱藏”菜單中的“文本信息隱藏”或者“數(shù)據(jù)文件隱藏”子菜單,隨后選取圖像并輸入秘密信息和密鑰,點(diǎn)擊“隱藏”按鈕,如圖5 所示。

圖5 文本信息隱藏與數(shù)據(jù)文件隱藏功能測(cè)試界面圖
在“信息提取”菜單中選擇“文本信息提取”、“數(shù)據(jù)文件提取”或者“查看恢復(fù)圖像”子菜單,隨后選取圖像并輸入密鑰,點(diǎn)擊“提取”或者“恢復(fù)”按鈕,如圖6 所示。經(jīng)測(cè)試,該軟件達(dá)到無(wú)損圖像的信息隱藏效果。
本文利用直方圖平移技術(shù)設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)圖像無(wú)損信息隱藏軟件。它包含文本信息隱藏、文本信息提取、數(shù)據(jù)文件隱藏、數(shù)據(jù)文件提取和查看恢復(fù)圖像五大功能。軟件界面簡(jiǎn)潔大方,易于操作。經(jīng)測(cè)試,它能有效實(shí)現(xiàn)秘密信息的嵌入和提取,并且能無(wú)損恢復(fù)載體圖像。

圖6 數(shù)據(jù)文件提取以及查看恢復(fù)圖像功能測(cè)試界面圖