歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Matlab用圖片和音頻藏文件

Matlab用圖片和音頻藏文件

日期:2017/3/1 10:10:25   编辑:Linux編程

首先,你能看出下面兩幅圖片有什麼區別嗎?


乍看之下,這兩幅圖片一模一樣。但是實際上,右邊的這幅圖片裡面隱藏了一篇奧巴馬就職的演講稿(注意:圖片上傳到此處存在損失,上圖可能無法讀取出文件)。

這個想必讀者以前應該有所耳聞吧。《失控》這邊巨著裡面的“密碼無政府狀態:加密永勝”一章也提到過:


既然如此簡單,為什麼實現著玩一下呢?理論上一幅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 )找到相關函數。使用方法很簡單,文件隱藏進音頻的思想與圖片一致,就不再贅述。

Copyright © Linux教程網 All Rights Reserved