实验二BMP图像信息隐藏一,实验目的1,了解BMP图像文件格式2,了解利用BMP图像文件隐藏信息的原理3,设计并实现一种基于24位真彩色BMP图像的文件信息隐藏方法。二,实验环境1,WindowsXP操作系统2,UltraEdit文本编辑工具3,Matlab7.1版本软件4,BMP格式图片文件三,实验原理1,在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中的文件长度的值即可。2,在调色板或者位图信息头和实际的图像数据之间隐藏数据,如果将秘密数据放在文件头与图像数据之间,则至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。3,修改文件头和信息头中保留字段隐藏信息。4,在图像像素区利用图像宽度字节必须是4的倍数额特点,在补足位处隐藏数据。四,实验过程1,在实际的图像数据后隐藏信息(1)将载体baboon.bmp和秘密信息hidden.txt放置在同一目录下,在Windows的MS-DOS方式下执行命令copybaboon.bmp/b+hidden.txt/ababoon1.bmp,如下图所示:图一DOS界面(2)生成的新图像baboon1.bmp,表面上看上去与原图像几乎完全一样图二隐藏前后对比图(3)在UltraEdit看两幅图像的结构,发现有所差别。图三baboon.bmp图四baboon1.bmp(4)在Matlab中通过比较文件的实际长度和文件中保存的文件长度,就可以发现该图像是否隐藏秘密信息。代码如下所示:clc;clear;fid=fopen('baboon1.bmp','r');%读入伪装载体图像文件[a,length]=fread(fid,inf,'uint8');%length是文件的实际长度fclose(fid);fid=fopen('baboon1.bmp','r');%读入伪装载体图像文件status=fseek(fid,2,'bof');fileb=fread(fid,4,'uint8');filelength=fileb(1)*1+fileb(2)*256+fileb(3)*256*256+fileb(4)*256^3;%文件图像中保存的文件长度diff=length-filelength;%diff表示隐藏的信息长度如果相同,表示图像没有隐藏任何信息fclose(fid);从Workspace中可以读出diff数据为8图五Workspace(5)在UltraEdit中手动修改文件长度,再运行上述程序,发现diff=0,表示图像隐藏并修改文件长度后,通过该方法无法发现图像有隐藏信息。2,文件头与图像数据之间隐藏信息(1)在数据区开始之前隐藏信息,也就是在54个和55个字节之间隐藏信息。代码如下所示:clc;clear;wm=randsrc(1,300,[01]);%产生随机水印fid=fopen('baboon.bmp','r');%读入载体图像文件[a,length]=fread(fid,inf,'uint8');fclose(fid);msgfid=fopen('hidden.txt','r');%打开秘密文件[msg,count]=fread(msgfid);fclose(msgfid);wa=a;%a为图像变为uint8类型后的一维矩阵j=1;wa(11)=54+count;%修改偏移量,其中count为7wa(3)=wa(3)+count;%修改图像数据的文件长度fori=55:61%隐藏7位信息wa(i)=uint8(msg(j,1));%隐藏密码信息j=j+1;endfori=55:lengthwa(i+7)=a(i);endfigure;wa=uint8(wa);fid=fopen('watermarked.bmp','wb');fwrite(fid,wa);fclose(fid);subplot(1,2,1);imshow('baboon.bmp');%显示原始图像subplot(1,2,2);imshow('watermarked.bmp')%显示新图像(2)从图像看,两幅没有什么区别图六隐藏前后对比图3,在图像文件头和信息头的保留字段中隐藏信息BMP图像中第7,8,9,10字节是保留的,必须为0,所以可以在这四个字节中隐藏秘密信息。下面代码即隐藏了0,1,2,3这四个信息。clc;clear;wm=randsrc(1,300,[01]);%产生随机水印fid=fopen('baboon.bmp','r');%读入载体图像文件[a,length]=fread(fid,inf,'uint8');fclose(fid);wa=a;%在BMP的7,8,9,10保留字中隐藏秘密信息0123,ASCII值为)Ox30Ox31Ox32Ox33wa(7)=48;wa(7)=49;wa(7)=50;wa(7)=51;figure;wa=uint8(wa);fid=fopen('watermarked.bmp','wb');fwrite(fid,wa);fclose(fid);subplot(1,2,1);imshow('baboon.bmp');%显示原始图像subplot(1,2,2);imshow('watermarked.bmp')%显示新图像图七隐藏前后对比图五,实验总结通过该实验,我了解BMP图像文件格式,了解利用BMP图像文件隐藏信息的原理,并通过在实际的图像数据后隐藏信息,文件头与图像数据之间隐藏信息,以及在图像文件头和信息头的保留字段中隐藏信息这三种方式实现了信息隐藏。