隱寫術是將機密信息隱藏在更大的信息中,使別人沒法知道隱藏信息的存在以及隱藏信息內容的過程。隱寫術的目的是保證雙方之間的機密交流。與隱藏機密信息內容的密碼學不一樣,隱寫術隱瞞了傳達消息的事實。儘管隱寫術與密碼學有所不一樣,可是二者之間有許多相似,而且一些做者會將隱寫術歸類爲一種密碼學形式,由於隱祕通訊也是一種機密消息。python
不少人學習python,不知道從何學起。
不少人學習python,掌握了基本語法事後,不知道在哪裏尋找案例上手。
不少已經作案例的人,殊不知道如何去學習更加高深的知識。
那麼針對這三類人,我給你們提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!
QQ羣:1097524789git
迄今爲止,密碼學一直是做用於保護髮送者與接收者之間的保密性。然而,如今除了密碼學以外,隱寫術也愈來愈多地用於爲須要被隱藏的數據添加更多保護層。使用隱寫術比單獨使用 密碼學 的優點在於,有意加密的消息不會做爲被監視的對象而引發注意。明顯可見的加密消息,不管其多麼難以解破,都會引發人們的注意。而且在 加密 是非法行爲的國家中,這自己可能就是在犯罪。github
隱寫術目前已經能夠在圖像、視頻、文本或音頻等多種傳輸媒介上進行。數組
如上圖所示,原始圖像文件(X)和機密消息(M)都做爲入參傳入到隱寫術編碼器中。隱寫術編碼器函數 f(X,M,K) 經過使用最低有效位編碼等技術將機密消息寫入到封面圖像文件中。最後生成的隱寫術圖像看起來與封面圖像文件很是類似,肉眼難辨。這樣就完成了編碼。若要取出機密消息,將以前生成的隱寫術圖像輸入隱寫術解碼器便可。函數
本文將使用 Python 來實現圖像隱寫術。手把手教您使用 Python 語言,經過一種叫「 最低有效位(Least Significant Bit,LSB) 」的技術來隱藏文本消息。post
咱們能夠將 數字圖像 描述爲一組有限的數字值,稱爲像素。像素是圖像中最小的不可分割單位,其值表示在任何特定點上給定顏色的亮度。所以,咱們能夠將圖像想象爲像素的矩陣(或二維數組),其中包含固定數量的行和列。學習
最低有效位(LSB)是一種將每一個像素的最後一位修改並用機密消息的數據位代替的技術。google
從上圖能夠清楚地看出,若是咱們修改最高有效位(MSB),它將對最終值產生更大的影響,可是若是咱們修改最低有效位(LSB),則對最終值的影響將是最小的,所以,咱們使用最低有效位隱寫術。編碼
每一個像素包含三個值,紅、綠、藍,這些值的範圍從 0 到 255,換句話說,它們是一個 8 位二進制數。讓咱們舉一個例子來講明它是如何工做的,假設您想要將消息 「 hi 」 隱藏到一個 4x4 的圖像中,該圖像具備如下像素值:加密
使用 ASCII 表 ,咱們能夠先將機密消息轉換爲十進制值,而後再轉換爲二進制: 0110100 0110101 。如今,咱們對像素值逐一進行迭代,在將它們轉換爲二進制後,咱們將每一個最小有效位依次替換爲該信息位。(例如 225 是 11100001,咱們替換最後一位,最右邊的(1)和機密消息的第一位(0),依次類推)。這樣的操做只會對像素值進行 +1 或 -1 的修改,所以肉眼根本看不出來。執行最低有效位隱寫術後獲得的像素值以下所示:
在本節中,咱們將使用 Python 代碼逐步瞭解隱藏文本和顯示文本的過程。首先,打開 google collab notebook ,按照下面的步驟操做:
在開始編寫代碼以前,可使用左側菜單欄中的 upload 選項上傳要用於隱寫的圖像(png 文件)。
第一步:導入全部必需的 Python 庫。
第二步:定義一個能夠將任何類型的數據轉換爲二進制數據的函數,咱們將在編碼和解碼階段使用這個函數來將機密消息數據和像素值轉換爲二進制。
第三步:編寫一個函數,經過改變最低有效位將機密消息隱藏到圖像中。
第四步:定義一個函數,用於從隱藏後的圖像中解碼隱藏信息。
第五步:定義將輸入的圖像名稱和機密消息做爲用戶的輸入的函數。
第六步:建立一個函數,要求用戶輸入須要解碼的圖像的名稱,而後調用 showData() 函數以返回解碼後的消息。
加密消息:
解碼消息:
若是您對代碼感興趣,能夠在 Github 上查看個人 jupyter notebook 代碼。