使我的隱寫術程式碼更難檢測和破解
我正在做一個關於 MATLAB 上的數字圖像隱寫術的大學項目。到目前為止,我已經能夠從 stackoverflow 上的帥哥那裡獲得我需要的幫助,但我現在需要讓我的算法更難被發現。這是我到目前為止所擁有的:
- 我的主要功能讀取 4 個灰度 RGB 24 點陣圖像和一個 RGB 24 點陣圖像以將這四個圖像編碼成。前兩個應該是藍圖,另外兩個是僅包含文本的圖像(大尺寸)。所有圖像的大小相同。
- 在編碼之前,每個灰度圖像的像素位置被隨機打亂(例如:第 1 個像素變成第 24 個像素,第二個像素變成第 300 個像素)這是通過生成代表新像素位置的數字的隨機排列來完成的一粒種子。這樣做是為了使程式碼更難被外人破解,並且種子將充當接收端恢復圖像所需的密碼。
- 第一個混洗後的灰度圖像被編碼到 RGB 圖像的 R 平面,第二個混洗後的圖像被編碼到 G 平面。這是通過測試每個圖像中的每個像素來完成的,例如: 位置 (x,y) 中的像素:如果黑色–> 使所選平面中位置 (x,y) 中的像素的 lsb = 0。如果白色->使像素的 lsb = 1。
- 通過選擇第一個像素位置的棋盤狀圖案和第二個像素位置的補充圖案,將其他兩個僅包含文本的混洗灰度圖像組合成一個灰度圖像。生成的灰度圖像被編碼到 RGB 圖像的 B 平面中,與前兩個相同。這樣做是因為您不需要太多細節來閱讀文本,但您確實需要細節才能製作藍圖,恢復的文本灰度會有點失真,但它們會是可讀。現在完成了過程編碼,並為生成的編碼 RGB 圖像計算了 S/N 比,以測量與原始 RGB 圖像的差異,結果差異對於未經訓練的眼睛來說是不明顯的。
- 恢復灰度圖像是通過以相反的順序對編碼的 RGB 圖像執行的操作進行反轉來完成的。
所以你去。我現在正在尋找一種方法,讓我的程式碼更難檢測和破解。也許使用小波變換?我已經閱讀了一段時間,但我現在不知道這將如何適用於我的項目。
關於隱寫術的一些一般建議:
就像在物理世界中一樣,你想要隱藏的東西越小,目標就越容易。因此,您可能希望壓縮有效載荷,並將結果視為由任意位組成的新的、更小的有效載荷。由於您的有效負載由圖像組成,因此可能會使用一些有損方案(例如JPEG或JPEG 2000)來獲得出色的壓縮效果。此外,明顯的矢量消息越大,隱藏起來就越容易(所有其他條件都相同,例如該矢量消息的格式)。
洗牌位(問題中的第二個項目符號)是一種嘗試使數據難以理解的原始技術。為了保護有效載荷的機密性,請使用加密。如果操作正確,對於不持有解密密鑰的人來說,從消息中恢復原始有效負載(與檢測有效負載的存在相反)顯然是沒有希望的。一種簡單的加密形式是從密鑰生成偽隨機數據流,並將其與明文(可能如上所述壓縮)進行異或運算,但需要注意的是永遠不能重複使用流的同一部分(參見例如AES-CTR)。使用經過身份驗證的加密(例如AES-GCM) 還可以使對手無法誘導對隱藏消息的未檢測到的更改。
現在是困難的部分:將修改後的有效負載隱藏到矢量消息中(這裡,可以作為圖像傳遞),這樣就不會發現有效負載的存在。速記方案試圖在三個粗略的水平上進行評級:
- 不可檢測性取決於對手(攔截器試圖證明隱藏了一條消息)不知道方案本身。一個範例是在大多數普通程序跳過的矢量文件的一部分中發送有效負載,例如某些註釋欄位或預告片。這樣的計劃一旦知道就會失敗。
- 不可檢測性依賴於對手沒有註意到矢量數據的一些微小特徵。一個例子是在向量中編碼 RGB 值的字節的低位中對有效負載進行編碼,而其餘所有內容都保持不變。此類方案通常會失敗(例如,如果原始矢量是未壓縮的電腦螢幕截圖,此時 GUI 正在顯示顏色完全一致的區域,則低位中將存在極端冗餘,並且所描述的方案將消除,啟用檢測,甚至可能用敏銳的眼睛)。
- 不可檢測性(在某種可量化的程度上)在某些假設下是可以證明的,通常是對手不知道密鑰,並且最關鍵的是假設向量中的數據模型(對不起,我唯一的簡單範例是該模型是:真正隨機數據)。在現實世界中,這種方案仍然可能失敗,因為對手有一些更好的模型(例如,考慮到有關據稱是矢量圖像源的特定相機如何生成其文件的一些細節,或者其感測器或鏡頭的某些特徵)。
此外,一些隱寫術方案還有另一個更難的目標:在不顯著改變向量的感知質量的情況下防止刪除隱藏的有效載荷(或至少通過隨意變換使向量基本不受干擾,例如將圖像保存為高度壓縮JPEG,或將數字音頻重新編碼為MP3)。這在某些DRM方案中是必要的。有時這被稱為(數字)水印,但與同名印刷紙張製造技術的類比是相反的:在 DRM 中,設計者希望未經授權的副本擁有水印/有效載荷,而在鈔票上則希望水印不被複製。上面的三個粗略級別有一些變化。