信息隐藏 实验二 BMP 图像信息隐藏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二 BMP 图像信息隐藏
一,实验目的
1,了解BMP图像文件格式
2,了解利用BMP图像文件隐藏信息的原理
3,设计并实现一种基于24位真彩色BMP图像的文件信息隐藏方法。
二,实验环境
1, Windows XP 操作系统
2, Ultra Edit 文本编辑工具
3, Matlab 7.1版本软件
4, BMP格式图片文件
三,实验原理
1,在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中的文件长度的值即可。
2,在调色板或者位图信息头和实际的图像数据之间隐藏数据,如果将秘密数据放在文件头与图像数据之间,则至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。
3,修改文件头和信息头中保留字段隐藏信息。
4,在图像像素区利用图像宽度字节必须是4的倍数额特点,在补足位处隐藏数据。
四,实验过程
1,在实际的图像数据后隐藏信息
(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)*25
6^3;
%文件图像中保存的文件长度
diff=length-filelength;
%diff表示隐藏的信息长度如果相同,表示图像没有隐藏任何信息
fclose(fid);
从Workspace中可以读出diff数据为8
图五 Workspace
(5)在Ultra Edit中手动修改文件长度,再运行上述程序,发现diff=0,表示图像隐藏并修改文件长度后,通过该方法无法发现图像有隐藏信息。
2,文件头与图像数据之间隐藏信息
(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)从图像看,两幅没有什么区别
图六隐藏前后对比图
3,在图像文件头和信息头的保留字段中隐藏信息
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,'uint8');
fclose(fid);
wa=a;
%在BMP的7,8,9,10保留字中隐藏秘密信息0 1 2 3,ASCII值为)Ox30 Ox31 Ox32 Ox33
wa(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')%显示新图像