謝作如 浙江省溫州中學
隱寫術(steganography)一詞來源于希臘詞匯stegons和graphia,意即“隱藏”和“書寫”,即把某些特殊信息隱藏于正常載體之中,從而實現掩蓋特殊信息存在的事實,不易引起敵方的懷疑。信息隱藏的發展很大程度上得益于戰爭中隱蔽通信的需要。我國古代有文字可考的最早的信息隱藏見于《六韜》中對“陰符”的記載。其辦法是先制造形制、花紋不同的兵符,每一種表示一種固定的含義。這種含義須事先約定好,只有當事人可以理解,即使被敵方截獲,他們也不會知道其中的含義。
在教學《數據與計算》(高中信息技術必修模塊1)中關于信息加密的時候,筆者給學生介紹了密碼的加密解密技術,并在網頁上演示了圖片隱寫術的做法,不想引起了學生極大的學習興趣。于是筆者就產生了想法:用Python的PIL庫來實現圖片隱寫術,從而讓學生深入理解信息的編碼原理和規則。
圖片是由一個個像素組成的。在常見的彩色圖片中,每一個像素都由三組數字表示,代表紅色(r)、綠色(g)、藍色(b)三種顏色。其中,每一種顏色的深淺一般由0~255之間的數字表示,即一個字節(8個Bit),因而在Windows中查看這類圖片的屬性,會看到其位深度為“32”,如圖1所示。

圖1
既然每一個像素的單種顏色是采用8位來存儲,那么如果改變其最低位的值,對整個圖片來說,其視覺效果變化就很小,通過肉眼是看不出來的,如當一組顏色白色(255,255,255),變為(254,255,255)時,幾乎沒有區別,因為差距僅僅是1/255。如下頁圖2所示的兩張小狗,其中一張加入了隱藏的信息,但是幾乎看不出任何區別。
那么,對于一張大小為800*600的圖片來說,就有800*600*3個位的空間可用于隱藏信息。只要將待隱藏的文字信息轉換為二進制,再將每個二進制碼存儲在圖片的像素中,就達到了隱藏信息的目的。
Python的PIL庫可以讀取圖片的信息,包括所有的像素顏色。這就需要編寫一段代碼,逐步完成如下工作:




①獲取原圖片的所有像素,將每一個像素顏色的數字最低位變為“0”;
②將待隱藏信息轉換為二進制字符串,如果位數不夠8個時,在最高位補0;
③將二進制的待隱藏信息依次與圖片中每個像素的r、g、b顏色數字進行相加,形成新的圖片。
為了方便調用,筆者編寫了三個函數,分別實現這些功能,函數代碼如圖3、圖4、圖5所示。
準備工作已經完成,接下來要隱藏信息就調用“encodeDataInImage”函數。為了方便理解,筆者在代碼中輸出了一些特定的信息,如加密后的二進制代碼和加密后的像素,具體效果如下頁圖6所示。

圖6
在運行代碼后,目錄中將多出一張名稱為“加密.png”的圖片。這就是加密過的圖片。用肉眼你肯定看不出有任何變化,因為僅僅改動了17個像素,而且這17個像素的變化又非常小。需要注意的是,選擇的“原始.png”圖片不支持“透明”,即沒有透明度的信息,支持“透明”的PNG文件的每一個像素是4組數字。
在得到加密后的圖片后,下一步的工作就是解密,以驗證這一做法是否可行。需要完成如下工作:獲取圖片的所有像素,將像素值的最低位取出并拼接為一個二進制字符串。需要注意的是,我們只要把“有效”的信息取出即可,如果二進制字符串出現連續的16個以上的0,說明后面就不存在有效信息了。
獲取存儲的信息的二進制值,按每8位為一組,將上述二進制轉換為十進制形式,再轉換為Bytes類型,用decode將十進制轉為字符并存儲到字符串中。
同樣為了方便調用,筆者分別編寫了兩個函數來實現以上功能(如圖7、圖8)。


分別執行decodeImage和binaryToString兩個函數,即可輸出解密后的信息,如圖9所示。

圖9
實現圖片隱寫術的方法很多。本案例僅僅使用了一個像素單色數據的最低位,如果要隱藏更多的信息,甚至可以利用這個字節的后四位。當然,如果使用了后四位來加密,那么用于加密的原始圖片的背景顏色最好比較復雜,這樣加密后就不容易被發現,不能選擇存在大片相同顏色的圖片,如藍天白云的風景圖。此外,用于加密的原始圖片可以是任意格式,但是保存后的圖片需要用PNG或者BMP格式,即未壓縮格式,不然加密后的圖片一旦被壓縮,信息就被破壞了。
計算機的發明和密碼破譯有著千絲萬縷的關系,信息的編碼又是加密和解密的基礎。本案例涉及了字符編碼、圖片編碼、進制轉換、Python編程等方面的知識,將知識學習融入到有意義的探究過程之中,值得作為一個信息技術實驗讓學生在課堂上研究。本案例代碼還有很多細節可以讓學生探究,如為什么出現16個0就說明后面的信息是無效的、為什么加密時二進制字符串(binary)的長度要按照3的倍數進行補足等。
此外,信息的加密解密是一個很不錯的信息技術學習主題,完全可以作為一個項目讓學生深入研究。有趣的是,筆者的學生在研究完這個案例后,就開始研究如何在聲音和視頻中隱藏信息。雖然他們可能會遇到很多困難,但這一探究過程對他們學習信息技術有著非常重要的意義。
