您的当前位置:首页信息隐藏-实验二-BMP-图像信息隐藏

信息隐藏-实验二-BMP-图像信息隐藏

2021-07-23 来源:爱问旅游网


信息隐藏-实验二-BMP-图像信息隐藏

实验二 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)*256^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')%显示新图像

图七 隐藏前后对比图

五,实验总结

通过该实验,我了解BMP图像文件格式,了解利用BMP图像文件隐藏信息的原理,并通过在实际的图像数据后隐藏信息,文件头与图像数据之间隐藏信息,以及在图像文件头和信息头的保留字段中隐藏信息这三种方式实现了信息隐藏。

因篇幅问题不能全部显示,请点此查看更多更全内容