首页 / 操作系统 / Linux / Matlab用图片和音频藏文件
首先,你能看出下面两幅图片有什么区别吗?
乍看之下,这两幅图片一模一样。但是实际上,右边的这幅图片里面隐藏了一篇奥巴马就职的演讲稿(注意:图片上传到此处存在损失,上图可能无法读取出文件)。这个想必读者以前应该有所耳闻吧。《失控》这边巨著里面的“密码无政府状态:加密永胜”一章也提到过:
既然如此简单,为什么实现着玩一下呢?理论上一幅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:32img(i)=bitset(img(i),1,0);endfor i=(33-size(length,2)):32img(i)=bitset(img(i),1,str2num(length(i+1-(33-size(length,2)))));end%再存列数到第二位len2=size(c,2);length = dec2bin(len2);for i=1:32img(i)=bitset(img(i),2,0);endfor i=(33-size(length,2)):32img(i)=bitset(img(i),2,str2num(length(i+1-(33-size(length,2)))));end%存文件到第三位for i=1:len1*len2img(i)=bitset(img(i),3,str2num(c(i)));%更改第一位endimwrite(img,"D:matlab_files图片藏文件
es.png");figure,imshow(img)------------------------------------------------华丽的分割线---------------------------------------------------- 2、将图片中的文件解析出来:img=imread("D:matlab_files图片藏文件
es.png");%打开图片len1=[];for i=1:32len1=[len1 num2str(bitget(img(i),1))];%提取文件行数endlen1=bin2dec(len1);len2=[];for i=1:32len2=[len2 num2str(bitget(img(i),2))];%提取文件列数endlen2=bin2dec(len2);res=[];for i=1:len1*len2res=[res num2str(bitget(img(i),3))];endres=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 )找到相关函数。使用方法很简单,文件隐藏进音频的思想与图片一致,就不再赘述。