乍看之下,這兩幅圖片一模一樣。但是實際上,右邊的這幅圖片裡面隱藏了一篇奧巴馬就職的演講稿(注意:圖片上傳到此處存在損失,上圖可能無法讀取出文件)。
這個想必讀者以前應該有所耳聞吧。《失控》這邊巨著裡面的“密碼無政府狀態:加密永勝”一章也提到過:
既然如此簡單,為什麼實現著玩一下呢?理論上一幅300*300的圖片存3萬左右ASCII字符沒有任何問題。鑒於Matlab圖像處理的強大功能,用它實現就再好不過了。
按照前面《失控》中提到的,可以將文本的每一位分插到圖片的每個像素的最低位,這裡我另外將文本計算有關的長度保存到第二位和第三位(當然這不是一個好辦法,最好是都插入最後一位,這樣對像素顏色RGB值的變化只有1,影響不至於肉眼可辨)。
讀取的時候,只需要將預存數據的位提取出來變換成相應的ASCII碼即可。(注:此處僅提供演示,因此是順序插入位,用於實際加密效果不是很好,可以考慮通過PN序列或者Hash、Arnold變換等方法進行進一步處理)。
以下是DC本人寫的拙劣代碼,僅供參考:
------------------------------------------------華麗的分割線----------------------------------------------------
1、將文件藏進圖片:(img)
fid = fopen('D:\matlab_files\圖片藏文件\alphabet.txt', 'r'); %c = fread(fid, 5, 'uint8=>char')'; c = fread(fid);%讀入文件數據 c=dec2bin(c);%轉化為2進制數組 fclose(fid); img=imread('D:\matlab_files\圖片藏文件\1.png');%打開圖片 figure,imshow(img) %先存行數到第一位 len1=size(c,1); length = dec2bin(len1); for i=1:32 img(i)=bitset(img(i),1,0); end for i=(33-size(length,2)):32 img(i)=bitset(img(i),1,str2num(length(i+1-(33-size(length,2))))); end %再存列數到第二位 len2=size(c,2); length = dec2bin(len2); for i=1:32 img(i)=bitset(img(i),2,0); end for i=(33-size(length,2)):32 img(i)=bitset(img(i),2,str2num(length(i+1-(33-size(length,2))))); end %存文件到第三位 for i=1:len1*len2 img(i)=bitset(img(i),3,str2num(c(i)));%更改第一位 end imwrite(img,'D:\matlab_files\圖片藏文件\res.png'); figure,imshow(img)------------------------------------------------華麗的分割線----------------------------------------------------
2、將圖片中的文件解析出來:
img=imread('D:\matlab_files\圖片藏文件\res.png');%打開圖片 len1=[]; for i=1:32 len1=[len1 num2str(bitget(img(i),1))];%提取文件行數 end len1=bin2dec(len1); len2=[]; for i=1:32 len2=[len2 num2str(bitget(img(i),2))];%提取文件列數 end len2=bin2dec(len2); res=[]; for i=1:len1*len2 res=[res num2str(bitget(img(i),3))]; end res=reshape(res,[len1 len2]);%轉成二進制數組 res=bin2dec(res);%轉十進制 char(res')%轉成字符
------------------------------------------------華麗的分割線----------------------------------------------------
以下是運行後讀取出來的結果:
前後圖片對比
隱藏的文件
------------------------------------------------華麗的分割線----------------------------------------------------
至於音頻藏數據,也很容易實現。由於Matlab音頻處理工具箱只提供了wav格式音頻處理的函數,想要將文件存入Mp3等音樂裡,需要做些准備。
可喜的是,可以在哥倫比亞大學的LabROSA實驗室(Laboratory for the Recognition and Organization of Speechand Audio)網站(http://labrosa.ee.columbia.edu/matlab/mp3read.html )找到相關函數。使用方法很簡單,文件隱藏進音頻的思想與圖片一致,就不再贅述。