信息隐藏 实验二 BMP 图像信息隐藏.doc
文本预览下载声明
实验二 BMP 图像信息隐藏
实验目的
了解BMP图像文件格式
了解利用BMP图像文件隐藏信息的原理
设计并实现一种基于24位真彩色BMP图像的文件信息隐藏方法。
二,实验环境
1, Windows XP 操作系统
2, Ultra Edit 文本编辑工具
3, Matlab 7.1版本软件
4, BMP格式图片文件
三,实验原理
在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中的文件长度的值即可。
在调色板或者位图信息头和实际的图像数据之间隐藏数据,如果将秘密数据放在文件头与图像数据之间,则至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。
修改文件头和信息头中保留字段隐藏信息。
在图像像素区利用图像宽度字节必须是4的倍数额特点,在补足位处隐藏数据。
四,实验过程
在实际的图像数据后隐藏信息
(1)将载体baboon.bmp和秘密信息hidden.txt放置在同一目录下,在Windows的MS-DOS方式下执行命令copy baboon.bmp /b + hidden.txt /a baboon1.bmp,如下图所示:
图一 DOS界面
(2)生成的新图像baboon1.bmp,表面上看上去与原图像几乎完全一样
图二 隐藏前后对比图
(3)在Ultra Edit看两幅图像的结构,发现有所差别。
图三 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)在Ultra Edit中手动修改文件长度,再运行上述程序,发现diff=0,表示图像隐藏并修改文件长度后,通过该方法无法发现图像有隐藏信息。
文件头与图像数据之间隐藏信息
(1)在数据区开始之前隐藏信息,也就是在54个和55个字节之间隐藏信息。代码如下所示:
clc;
clear;
wm=randsrc(1,300,[0 1]);%产生随机水印
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为7
wa(3)=wa(3)+count;%修改图像数据的文件长度
for i=55:61 %隐藏7位信息
wa(i)=uint8(msg(j,1));%隐藏密码信息
j=j+1;
end
for i=55:length
wa(i+7)=a(i);
end
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)%显示新图像
(2)从图像看,两幅没有什么区别
图六 隐藏前后对比图
在图像文件头和信息头的保留字段中隐藏信息
BMP图像中第7,8,9,10字节是保留的,必须为0,所以可以在这四个字节中隐藏秘密信息。下面代码即隐藏了0,1,2,3这四个信息。
clc;
clear;
wm=randsrc(1,300,[0 1]);%产生随机水印
fid=fopen(baboon.bmp,r);%读入载体图像文件
[a,length]=fread(fid,inf
显示全部