首先,你能看出下面两幅图片有什么区别吗?
乍看之下,这两幅图片一模一样。但是实际上,右边的这幅图片里面隐藏了一篇奥巴马就职的演讲稿(注意:图片上传到此处存在损失,上图可能无法读取出文件)。
这个想必读者以前应该有所耳闻吧。《失控》这边巨著里面的“密码无政府状态:加密永胜”一章也提到过:
既然如此简单,为什么实现着玩一下呢?理论上一幅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)网站( )找到相关函数。使用方法很简单,文件隐藏进音频的思想与图片一致,就不再赘述。