張 浩,鐘尚平
(福州大學數學與計算機科學學院,福州350108)
信息隱藏是將有意義的信息隱藏在另一個載體信息中得到隱蔽載體,未授權用戶不知道一個普通信息中是否隱藏了其他信息,即使知道也難以提取或去除隱藏的信息[1]。所用的載體可以是文字、圖像、聲音及視頻等。當前使用和研究的信息隱藏技術,多以多媒體數據為載體。其具有很大的冗余性,隱藏信息后對多媒體自身的影響很小;而且由于人眼或人耳的分辨能力有限,使得隱藏信息完全不被察覺[1]。但多媒體、圖像等信息的使用范圍具有一定的局限性,文本的應用使其具有顯而易見的廣泛性。造字法字庫的修改,不利于信息的傳遞。文中將重點討論以文本內容為載體的隱藏技術。
插入法:在文本內容載體中尋找被文本軟件忽略或不顯示的文件位置,插入秘密信息后文件大小增加了,而不影響軟件對文件的讀取和人眼的識別。只增加數據,不修改現有內容。
替代法:修改文本內容載體中的某些信息,不顯著影響載體對信息的表達或對用戶閱讀透明。
直接生成法:秘密信息直接生成文本載體信息,文本載體沒有任何實際意義,它就是秘密信息本身。
采用符號的冗余編碼[3],實現秘密信息在文本隱秘載體中的隱藏。將原來的字符編碼,從一個字符對應一個編碼轉換為一個字符對應多個編碼。根據編碼的不同確定該字符當前攜帶的秘密信息。如A的編碼原本為0x0041,現在定義為A字符對應三種編碼:0x0041,0xE410,0xE411,三種編碼分別表示不攜帶秘密信息、攜帶秘密信息的二進制為’0’、攜帶秘密信息的二進制為’1’。這種信息隱藏技術,必須使用特定的軟件以實現文本的編輯和閱讀,在通用的文本編輯和閱讀軟件中不能通用。
字歸類與節歸類法[4],采用相鄰單詞間字母個數或者相鄰字符內碼的大小關系來存儲隱秘信息。由于文本內容載體是固定的,所以存儲的秘密信息其實也是隨載體而固定,必須采用其他方法如文本格式或顏色進行輔助,才能準確的隱藏信息。或者直接根據秘密信息直接生成一段文本信息。
中英文標點編碼算法[5],根據中英文標點符號的相似性,結合標點前后插入的空格,實現信息的隱藏。標點符號在隱秘載體中個數有限且固定,每個標點只能隱藏1、2個比特的秘密信息,其隱藏容量小;依照隱秘信息插入情況,各個標點的顯示細節仍能通過肉眼區分,隱蔽性較差。類似的方法還有插入制表符。
同義詞隱藏算法[6],根據預先建立的同義詞庫,通過對隱秘載體中的同義詞進行替換,而得到信息隱藏的空間。這種方式中,每個同義詞的替換代表一個隱藏的比特,隱藏容量小;在提取隱秘信息時,必須提供隱秘載體的原文,不能實現盲隱藏。
以文本內容為載體的信息隱藏技術,優點在于通用性依賴于文字信息,只要有文字的地方都能隱藏信息,通用性極強;安全性也依賴于文字信息本身,不受文件格式影響。已有的各類算法主要存在的缺點是透明性差和隱藏容量小。理論上相同的技術中,透明性和隱藏容量呈反比,即透明性降低則隱藏容量提升;透明性提高則隱藏容量減少。本設計提出一種新的以文本內容為載體的信息隱藏技術,不僅在透明性上進行了提升,同時增大了隱藏容量。
為了便于描述,引入幾個定義。
秘密信息:任何可以通過二進制比特串表示的,需要隱藏在文本內容中進行傳輸的數據信息。
文本內容載體:任何只包含字符編碼標準中正常可見字符的文本內容,并用該文本內容來隱藏數據進行傳輸。在信息隱藏技術中,通稱為隱秘載體。
隱秘對象:將秘密信息重新編碼后,嵌入到文本內容載體中,而得到的新文本內容。
ANSI編碼和Unicode編碼均可采用windows的記事本軟件進行相互轉換,通過UltaEdit工具可直接查看各種編碼的二進制表示。ANSI中以8bit表示ASCII碼,Unicode則統一使用16bit。這兩種編碼均可表示216個字符,共計217(128KB)個字節。這些編碼數字以整數形式固定下來,數字即使發生1位的變化,也會導致相關的文本處理程序不能正確表示出原始文字,引起文字錯誤,所以編碼替換或修改是不可能的。換個角度采用插入方式,這些字符并沒有完全在編碼中被使用,而是預留了大量的字符,實驗證明這些字符在各類文本文檔中均不顯示,這類字符可作為存儲信息的隱蔽信道。例如:Unicode編碼0xE4C6,在ANSI標準中編碼0x40A1,該字符在記事本、Adobe Acrobat、OFFICE等文本軟件中均不顯示。由于ANSI編碼標準是Windows預設標準,以ANSI為例進行描述隱藏方法,與基于Unicode編碼標準的實現基本相同。
主要流程如圖1所示,分為5個步驟:

圖1 主要流程
(1)定義預留編碼集合,在常用編碼庫中選擇不可見字符編碼的集合,假設集合中元素個數為L,L是2的r次冪;
(2)定義L進制編碼,根據L的值來定義L進制編碼;
(3)定義L進制編碼到預留編碼集合的雙射函數,L個L進制編碼和預留編碼集合中的L個預留編碼實現一一對應;
(4)定義字符嵌入方法,根據實際應用環境和要求,選擇字符嵌入位置和方法;
(5)秘密信息嵌入與提取,根據自定義的預留編碼集合、L進制編碼、L進制編碼和預留編碼集合的雙射關系、字符嵌入方法,實現在隱秘載體中隱藏秘密信息,或者從隱秘對象中獲取秘密信息。
該技術遵循Kerckhoffs原則,雙射關系f、預留編碼集合、嵌入方法共同組成隱藏密鑰K,構成對稱隱藏算法。
3.4.1 定義預留編碼集合
在ANSI編碼標準所有的216個編碼中,篩選出不同文本軟件中不可見字符編碼的交集,剔除特殊用途的不可見編碼。通常一種文本軟件中的不可見字符編碼,在其他文本軟件中具有相同的不可見顯示特性,所以可操作性較強。將ANSI編碼標準中的不可見字符編碼,轉換為Unicode編碼格式后,通常仍具有相同的不可見顯示特性。以ANSI編碼標準為例,從ANSI編碼中篩選了1024個不可見字符編碼,并為每個編碼分配一個序號,構成預留編碼集合。
如圖2所示,預留編碼集合中,所有預留編碼并無規律,在建立預留編碼集合的同時為每個預留編碼分配一個整數型序號,以便檢索和標識。

圖2 L進制編碼和預留編碼集合
3.4.2 定義L進制編碼
預留編碼集合基數為1024,是2的r=10次冪。建立L進制編碼,采用r位比特串進行1024進制編碼。如圖2所示,L進制編碼采用整數和二進制編碼兩種方式表示。
3.4.3 定義雙射函數
L進制編碼的整數表示到預留編碼集合的整數型序號的雙射函數可任意選擇,以選擇f(x)=x函數為例,其逆函數 f-1(x)=x。
3.4.4 定義字符嵌入方法
在文本內容中可選擇的嵌入位置中有:單引號前后1個字符、雙引號前后1個字符、其他標點后1個字符、段落后若干個字符、段首2個字符、文章結束后若干個字符等不顯眼位置。具體位置選擇,需根據實際情況選擇。選擇以下嵌入位置為例:
(1)逗號后1個字符、分號后1個字符、句號后1個字符。
(2)文章結束后若干個字符。
具體實現時還需注意:若位置(1)數量超過需要插入預留編碼字符串的長度,則在剩余的位置中填充空格;若位置(1)數量小于需要嵌入預留編碼字符串的長度,則在位置(2)中插入剩余的預留編碼字符。
3.4.5 秘密信息的嵌入與提取過程
嵌入過程,如圖3所示,首先秘密信息表示為比特串形式,以r(r=10)位為單位進行劃分,轉換為L進制編碼串;根據雙射函數f和預留編碼集合,將L進制編碼串映射為預留編碼字符串;根據字符在文本內容中的嵌入方法,將預留編碼字符串嵌入到信息載體中,形成隱秘對象,得到的隱秘對象就可以通過各種方式進行傳輸。

圖3 秘密信息的嵌入與提取
秘密信息:“信息隱藏方法”
隱秘載體:“沿著荷塘,是一條曲折的小煤屑路。這是一條幽僻的路;白天也少人走,夜晚更加寂寞。荷塘四周,長著許多樹,蓊蓊郁郁的。路的一旁,是些楊柳,和一些不知道名字的樹。沒有月光的晚上,這路上陰森森的,有些怕人。今晚卻很好,雖然月光也還是淡淡的。”
秘密信息的ANSI編碼串16進制表示為:D0 C5 CF A2 D2 FE B2 D8 B7 BD B7 A8
秘密信息的ANSI編碼串2進制表示,以r位為單位進行劃分得到的就是L進制二進制表示,$符號為分隔符,最后不足r位部分以0補足,括號中為補足的0:$1101000011$0001011100
$1111101000$1011010010$1111111010
$1100101101$1000101101$1110111101
$1011011110$101000(0000)
秘密信息的L進制編碼整數表示:[835][92][1000][722][1018][813][557][957][734][640]
根據雙射函數f計算每個L進制編碼整數對應的預留編碼集合的整數型序號。
秘密信息的預留編碼集合的整數序號序列為:[835][92][1000][722][1018][813][557][957][734][640]
通過查找預留編碼集合得出整數型序號對應的預留編碼。
秘密信息的預留編碼字符串的16進制表示:[ABE5][A19D][ADCE][AAD2][ADE0][ABCF][A68D][ADA3][AADE][A780],其中每16位表示一個字符,這里就有10個字符需要插入到隱秘載體中。
根據預留編碼字符串在文本內容中嵌入的方法,在隱秘載體中找出嵌入位置。
插入后得到的隱秘對象:“沿著荷塘,是一條曲折的小煤屑路。這是一條幽僻的路;白天也少人走,夜晚更加寂寞。荷塘四周,長著許多樹,蓊蓊郁郁的。路的一旁,是些楊柳,和一些不知道名字的樹。沒有月光的晚上,這路上陰森森的,有些怕人。今晚卻很好,雖然月光也還是淡淡的。”
從隱秘對象中提取秘密信息是嵌入過程的逆過程:
從傳輸系統得到隱秘對象,根據字符在文本內容中的嵌入方法,從隱秘對象中分別提取出隱秘載體和預留編碼字符串,根據預留編碼集合和雙射函數f-1,將預留編碼字符串映射為L進制編碼串,將L進制編碼串轉換為二進制比特串形式就是需要得到的秘密信息。
實現過程主要采用移位操作,r位L進制仍使用雙字節表示,高位補零。L進制編碼中,需r位對齊,尾部填充0;提取信息時要去除。
對照現有的以文本為載體的信息隱藏技術,提出的隱藏方法有以下特點:
(1)透明性與隱藏容量:用于存儲秘密信息的編碼,是ANSI編碼或Unicode編碼中的預留編碼。這些編碼不僅數量多(3k字節以上),而且完全不影響文本的正常顯示。秘密信息隱藏前后的編碼利用率高,本例中采用了16比特編碼表示r比特信息。較強的透明性,也使得隱藏容量大,且不受隱秘載體內容多少的限制。
(2)安全性:本技術采用插入法,在文本內容中直接增加冗余空間。對文件格式的修改、文本排版的修改、以及文本內容在不同格式文件中的拷貝,都不會影響到隱秘信息,具有較強的安全性。
(3)魯棒性:魯棒性弱是基于文本載體的信息隱藏技術不可避免的問題。當文本內容中的不可見字符遭到刪除或篡改攻擊,都會影響到隱秘信息的恢復。該方法適合應用于實現易損水印來保護隱秘載體C,在特定條件下適合作為隱秘通道。
(4)通用性:本方法能以任何文本文件格式為載體,如.txt、.doc、.pdf等格式。即便有個別差異,只需要對不可見預留編碼集合重新篩選。秘密信息可為任何類型數據,如各種格式的文本信息、圖片信息、音視頻信息等,只需轉換為二進制編碼進行插入即可。本方法具有很強的通用性和兼容性。
提出的信息隱藏方法,是以文本內容為載體,著眼于文字本身的編碼,完全獨立于文件格式之上。能夠在任何文本文件格式中,在文本內容的數據中隱藏不限制大小和類型的秘密數據。可以提供一種易損的盲隱藏技術,其中未包含對秘密信息的加密,可通過其他加密算法加強。結合非對稱加密算法,可實現文本內容的不可抵賴性和完整性,主要應用領域是電子簽章。也可以在特定環境下,結合加密算法,用作隱蔽通道。本技術已申請國家發明專利。
[1]王麗娜,張煥國.信息隱藏技術與應用[M].武昌:武漢大學出版社,2003.
[2]徐迎暉.文本載體信息隱藏技術研究[D].北京:北京郵電大學,2006.
[3]劉東.以符號的冗余編碼攜帶隱藏信息的文本數字水印技術[P]:中國:200410040307.0,2005-3-23.
[4]耿紅琴.基于文本的信息隱藏技術研究[J].科學技術與工程,2007,7(6):1070 -1073.
[5]張學鋒.基于文本載體的數字水印算法探究[J].計算機與現代化,2009(3):84-87.
[6]眭新光,羅慧.一種安全的基于文本的信息隱藏技術[J].計算機工程,2004,30(19):104 -105.
[7]戴躍偉.信息隱藏技術的理論與應用研究[D].南京:南京理工大學,2002.