使用 Python 的圖像隱寫術(shù)
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達

今天,世界正在見證前所未有的數(shù)據(jù)爆炸,我們每天產(chǎn)生的數(shù)據(jù)量確實令人難以置信。福布斯的文章“我們每天創(chuàng)造多少數(shù)據(jù)?” 指出,以我們目前的速度每天創(chuàng)建大約2.5 千億字節(jié)的數(shù)據(jù),但隨著物聯(lián)網(wǎng) (IoT) 的發(fā)展,這一速度只會加快。僅在過去兩年中,世界上 90% 的數(shù)據(jù)都是生成的,這篇值得重讀!
現(xiàn)代計算世界圍繞著數(shù)據(jù)這個詞,但到底是什么讓人如此感興趣呢?在當今世界,企業(yè)已經(jīng)開始意識到數(shù)據(jù)就是力量,因為它可以預測客戶趨勢、增加銷售額,并將公司推向新的高度。隨著技術(shù)的快速進步和數(shù)據(jù)不斷創(chuàng)新,數(shù)據(jù)安全已成為我們的首要任務。隨著每天數(shù)以千計的消息和數(shù)據(jù)在互聯(lián)網(wǎng)上從一個地方傳輸?shù)搅硪粋€地方,數(shù)據(jù)共享正在增加,數(shù)據(jù)的保護是發(fā)送者的主要關(guān)注點,我們必須以只有接收者才能理解的秘密方式對消息進行加密,這一點非常重要。
在本文中,我們將了解什么是最低有效位隱寫術(shù),以及我們?nèi)绾问褂?python 實現(xiàn)它。
隱寫術(shù)是將秘密信息隱藏在更大的信息中的過程,使人無法知道隱藏信息的存在或內(nèi)容。隱寫術(shù)的目的是保持雙方之間的秘密通信,與隱藏秘密消息內(nèi)容的密碼學不同,隱寫術(shù)隱藏了消息傳遞這一事實。雖然隱寫術(shù)不同于密碼術(shù),但兩者之間有很多類比,一些作者將隱寫術(shù)歸類為密碼術(shù)的一種形式,因為隱藏通信是一種秘密通信。
到目前為止,密碼學一直在保護發(fā)送者和預期接收者之間的機密性方面發(fā)揮著最終作用。然而,如今除了密碼學之外,隱寫術(shù)被越來越多地用于為隱藏數(shù)據(jù)添加更多保護層。與單獨使用密碼學相比,使用隱寫術(shù)的優(yōu)勢在于,預期的秘密消息本身不會引起人們的注意,不會成為審查的對象。顯而易見的加密消息,無論它們多么牢不可破,都會引起人們的興趣,并且在加密是非法的國家,這些信息本身可能會被指控有罪。[1]
隱寫術(shù)工作已在不同的傳輸媒體上進行,如圖像、視頻、文本或音頻。


如上圖所示,需要隱藏的原始圖像文件 (X) 和秘密消息 (M) 都作為輸入輸入到隱寫編碼器中,隱寫編碼器函數(shù) f(X,M,K) 通過使用最低有效位編碼等技術(shù)將秘密消息嵌入到封面圖像文件中,生成的隱藏圖像看起來與封面圖像文件非常相似,沒有明顯的變化,這樣就完成了編碼。為了檢索秘密消息,隱寫對象被輸入到隱寫解碼器中。[3]
本文將幫助我們使用 Python 實現(xiàn)圖像隱寫術(shù),它將幫助我們編寫 Python 代碼,使用一種稱為最低有效位的技術(shù)隱藏文本消息。
我們可以將數(shù)字圖像描述為一組有限的數(shù)字值,稱為像素。像素是圖像中最小的單個元素,其值表示給定顏色在任何特定點的亮度。因此,我們可以將圖像視為包含固定行數(shù)和列數(shù)的像素矩陣(或二維數(shù)組)。
最低有效位 (LSB) 是一種技術(shù),其中每個像素的最后一位被修改并替換為秘密消息的數(shù)據(jù)位。


從上圖可以清楚地看出,如果我們改變 MSB 會對最終值產(chǎn)生更大的影響,但如果我們改變 LSB 對最終值的影響很小,因此我們使用最低有效位隱寫術(shù)。
每個像素包含紅、綠、藍三個值,這些值的范圍是 0 到 255,換句話說,它們是 8 位值。[4]
讓我們舉一個例子來說明這項技術(shù)的工作原理,假設(shè)我們想將消息“ hi ”隱藏到具有以下像素值的4x4圖像中:
[(225, 12, 99), (155, 2, 50), (99, 51, 15), (15, 55, 22),(155, 61, 87), (63, 30, 17), (1, 55, 19), (99, 81, 66),(219, 77, 91), (69, 39, 50), (18, 200, 33), (25, 54, 190)]
使用ASCII 表,我們可以將秘密消息轉(zhuǎn)換為十進制值,然后轉(zhuǎn)換為二進制值:0110100 0110101。現(xiàn)在,我們逐個迭代像素值,在將其轉(zhuǎn)換為二進制后,我們將每個最低有效位依次替換為該消息位(例如 225 是 11100001,我們用第一個數(shù)據(jù)位(0)等替換最后一位,右邊的位(1),依此類推)。這只會將像素值修改為 +1 或 -1,這根本不明顯。執(zhí)行LSBS后得到的像素值如下圖:
[(224, 13, 99),(154, 3, 50),(98, 50, 15),(15, 54, 23),(154, 61, 87),(63, 30, 17),( 1, 55, 19),(99, 81, 66),(219, 77, 91),(69, 39, 50),(18, 200, 33),(25, 54, 190)]
在本節(jié)中,我們可以找到使用 Python 代碼一步一步地隱藏和顯示過程,打開一個google collab筆記本并按照以下步驟操作:
在開始編寫代碼之前,我們可以使用左側(cè)菜單欄中顯示的上傳選項上傳我們想用于隱寫術(shù)的圖像(png)。

第 1 步:導入所有必需的 Python 庫

第 2 步:定義一個將任意類型數(shù)據(jù)轉(zhuǎn)換為二進制的函數(shù),我們將在編碼和解碼階段使用該函數(shù)來將秘密數(shù)據(jù)和像素值轉(zhuǎn)換為二進制。

第 3 步:編寫一個函數(shù),通過改變 LSB 將秘密信息隱藏到圖像中


第 4 步:定義一個函數(shù),用于解碼隱藏圖像中的隱藏消息

第 5 步:該函數(shù)將輸入的圖像名稱和秘密消息作為用戶的輸入,并調(diào)用 hideData() 對消息進行編碼

第6步:創(chuàng)建一個函數(shù),讓用戶輸入需要解碼的圖片名稱,調(diào)用showData()函數(shù)返回解碼后的信息

第 7 步:主函數(shù)()

結(jié)果:
對消息進行編碼:

解碼消息:

如果小伙伴們對代碼感興趣,可以在Github上找到我的筆記本。
參考:
[1].https://towardsdatascience.com/steganography-hiding-an-image-inside-another-77ca66b2acb1
[2].https://www.edureka.co/blog/steganography-tutorial
[3].https://www.forbes.com/sites/bernardmarr/2018/05/21/how-much-data-do-we-create-every-day-the-mind-blowing-stats-everyone-should-read/#191d0b0160ba
[4].https://www.ukessays.com/essays/computer-science/steganography-uses-methods-tools-3250.php
[5].https://www.thepythoncode.com/article/hide-secret-data-in-images-using-steganography-python
[6].https://www.youtube.com/watch?v=xepNoHgNj0w&t=1922s
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

