- 原文地址:Hiding data in an image : Image Steganography using Python
- 原文做者:Rupali Roy
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:Jessica
- 校對者:江不知,Baddyo
現在,世界正在經歷一場史無前例的數據爆炸。咱們天天產生着的使人難以置信的數據量。《福布斯》文章**「咱們天天創造了多少數據?」**中指出,按照咱們目前的速度,天天大約創造了 2.5 億字節的數據,可是這種速度會隨着物聯網(IoT)的增加而加速。僅在過去的兩年中,咱們就產生了全球 90% 的數據。這篇文章反應的數據爆炸現象須要引發咱們的重視!php
數據。本質上,現代計算機世界就是圍繞着這個詞展開的。但它到底有什麼魅力使咱們如此着迷呢?在當今世界,不少企業已經開始意識到數據的強大力量,由於它能夠潛在地預測客戶趨勢,增長銷售並將公司規模推向更高的高度。隨着技術的快速進步和數據使用方式的不斷創新,確保數據安全已成爲咱們的重中之重。數據共享愈來愈多,由於天天都有成千上萬的信息和數據在互聯網上從一個地方傳送到另外一個地方。數據的保護是發送方最關心的問題,以一種只有接收方可以理解的加密方式加密咱們的消息是很是重要的。前端
在本文中,咱們將瞭解什麼是最低有效位隱寫術以及如何用 Python 來實現它。python
隱寫術是將機密信息隱藏在更大的信息中,使別人沒法知道隱藏信息的存在以及隱藏信息內容的過程。隱寫術的目的是保證雙方之間的機密交流。與隱藏機密信息內容的密碼學不一樣,隱寫術隱瞞了傳達消息的事實。儘管隱寫術與密碼學有所不一樣,可是二者之間有許多相似,而且一些做者會將隱寫術歸類爲一種密碼學形式,由於隱祕通訊也是一種機密消息。android
迄今爲止,密碼學一直是做用於保護髮送者與接收者之間的保密性。然而,如今除了密碼學以外,隱寫術也愈來愈多地用於爲須要被隱藏的數據添加更多保護層。使用隱寫術比單獨使用密碼學的優點在於,有意加密的消息不會做爲被監視的對象而引發注意。明顯可見的加密消息,不管其多麼難以解破,都會引發人們的注意。而且在加密是非法行爲的國家中,這自己可能就是在犯罪。[1]ios
隱寫術目前已經能夠在圖像、視頻、文本或音頻等多種傳輸媒介上進行。git
如上圖所示,原始圖像文件(X)和機密消息(M)都做爲入參傳入到隱寫術編碼器中。隱寫術編碼器函數 f(X,M,K) 經過使用最低有效位編碼等技術將機密消息寫入到封面圖像文件中。最後生成的隱寫術圖像看起來與封面圖像文件很是類似,肉眼難辨。這樣就完成了編碼。若要取出機密消息,將以前生成的隱寫術圖像輸入隱寫術解碼器便可。[3]github
本文將使用 Python 來實現圖像隱寫術。手把手教您使用 Python 語言,經過一種叫「最低有效位(Least Significant Bit,LSB)」的技術來隱藏文本消息。後端
咱們能夠將數字圖像描述爲一組有限的數字值,稱爲像素。像素是圖像中最小的不可分割單位,其值表示在任何特定點上給定顏色的亮度。所以,咱們能夠將圖像想象爲像素的矩陣(或二維數組),其中包含固定數量的行和列。數組
最低有效位(LSB)是一種將每一個像素的最後一位修改並用機密消息的數據位代替的技術。安全
從上圖能夠清楚地看出,若是咱們修改最高有效位(MSB),它將對最終值產生更大的影響,可是若是咱們修改最低有效位(LSB),則對最終值的影響將是最小的,所以,咱們使用最低有效位隱寫術。
每一個像素包含三個值,紅、綠、藍,這些值的範圍從 0 到 255,換句話說,它們是一個 8 位二進制數[4]。讓咱們舉一個例子來講明它是如何工做的,假設您想要將消息 「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 表,咱們能夠先將機密消息轉換爲十進制值,而後再轉換爲二進制:0110100 0110101。如今,咱們對像素值逐一進行迭代,在將它們轉換爲二進制後,咱們將每一個最小有效位依次替換爲該信息位。(例如 225 是 11100001,咱們替換最後一位,最右邊的(1)和機密消息的第一位(0),依次類推)。這樣的操做只會對像素值進行 +1 或 -1 的修改,所以肉眼根本看不出來。執行最低有效位隱寫術後獲得的像素值以下所示:
[(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)]
在本節中,咱們將使用 Python 代碼逐步瞭解隱藏文本和顯示文本的過程。首先,打開 google collab notebook,按照下面的步驟操做:
在開始編寫代碼以前,可使用左側菜單欄中的 upload 選項上傳要用於隱寫的圖像(png 文件)。
第一步: 導入全部必需的 Python 庫。
第二步: 定義一個能夠將任何類型的數據轉換爲二進制數據的函數,咱們將在編碼和解碼階段使用這個函數來將機密消息數據和像素值轉換爲二進制。
第三步: 編寫一個函數,經過改變最低有效位將機密消息隱藏到圖像中。
第四步: 定義一個函數,用於從隱藏後的圖像中解碼隱藏信息。
第五步: 定義將輸入的圖像名稱和機密消息做爲用戶的輸入的函數。
第六步: 建立一個函數,要求用戶輸入須要解碼的圖像的名稱,而後調用 showData() 函數以返回解碼後的消息。
第七步: 主函數
輸出/結果:
加密消息:
解碼消息:
若是您對代碼感興趣,能夠在 Github 上查看個人 jupyter notebook 代碼。
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。