BMP图片隐写

BMP图片隐写

【实验目的】

了解BMP图像文件格式,了解利用BMP图像文件隐藏信息的原理,设计并实现BMP图像文件信息隐藏方法。

【实验环境】

matlab/python,*ultra* *edit编译工具*

【实验原理】

BMP(Bitmap-File)图形文件是Windows采用的常见图形文件格式,要利用BMP位图进行信息隐藏首先需要详细了解BMP文件的格式,BMP图像文件结构比较单一而且固定,BMP图像由文件头、信息头、调色板区和数据区四个部分组成,而24位真彩色图像中没有调色板信息。24位真彩色BMP位图文件包括 3 部分。 第一部分是BMP文件头。前2个字节是“BM”,是用于识别BMP文件的标志;第3-6字节存放的是位图文件的大小,以字节为单位;第7-10字节是保留的,必须为0;第11-14字节给出位图阵列相对于文件头的偏移,在24位真彩色图像中,这个值固定为54;19-22表示的是图像文件的宽度,以像素为单位;23-26表示的是图像文件 的高度,以像素为单位。第二部分是位图信息头。从第29个字节开始,第29~30字节描述的是像素的位数,24位真彩色位图。该位的值为0x18;第三部分是数据区。从第55个字节开始,每3个字节表示一个像素,这3个字节依次表示该像素的红、绿、蓝亮度分量值。

任务:

在不影响图像正常显示情况下,可使用以下四种方法在24位真彩色BMP图像中隐藏信息:

(1)在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中文件长度的值即可。

待隐藏的秘密信息文件名称为hidden.txt,baboon.bmp为载体图像,将载体和秘密信息放置在同一目录下,在windows的命令行模式下执行命令:Copy baboon.bmp /b+hidden.txt /a baboonl.bmp(CMD中), 其中参数/b指定以二进制格式复制、合并文件,参数/a以ASCII格式复制、合并文件。将baboon.bmp 和 hidden.txt文件进行合并,并生成新的文件baboon1.bmp(名字可自定义),信息隐藏在baboon1.bmp文件的尾部(使用ultra edit可查看),而图像的3-6的四个字节存放整个BMP图像的长度,如果在末尾添加了隐藏信息,3-6字节没变,但实际长度变大,二者相比较就可以知道是否嵌入了隐藏信息。

要求:编写代码,比较两个文件(baboon.bmp和baboon1.bmp的文件的实际大小和保存文件大小(3-6字节),比较嵌入隐藏信息和未嵌入隐藏信息图片的差异),提交相关代码,图片(baboon.bmp和baboon1.bmp图片、在Ultra Edit中不同地方,实际长度和3-6字节保存的长度大小差异截图)

Tips:fid表示图片

[a,length]=fread(fid,inf,’uint8’); %读取图片中实际的字节数(大小)

status=fseek(fid,2,’bof’); %偏移2个字节,使首字节变成第三字节

fileb=fread(fid,4,’uint8’); %读取3-6字节

filelength=fileb(1)*1+fileb(2)*256+fileb(3)*256^2+fileb(4)*256^3 %通过3-6字节得到图片的大小

diff=length-filelength; %计算两者大小是否一致

(2)在调色板或者位图信息头和实际的图像数据之间隐藏数据,如果将秘密数据放在文件头与图像数据之间,则至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。 即54+隐藏字节长度,

​ 要求:隐藏信息图片(自己学号)+ultraedit中二者的对比(不同部分的截图)+实际大小与3-6字节保存大小差异截图+提取水印+代码

Tips:

[a,length]=fread(fid,inf,’uint8’); %a是每bit的值,length是长度

wa=a;

wa(11)=54+count; %修改文件偏移

wa(3)=wa(3)+count; % 修改文件大小

for i=55:63

wa(i)=uint8(msg(j,1));%隐藏密码信息

disp(wa(i));

j=j+1;

end

for i=55:length

wa(i+9)=a(i);

end

(3)在图像像素区利用图像宽度字节必须是4的倍数的特点,在补足位处隐藏数据。

BMP 图像文件中有很多从不使用的保留字节,如 7、8、9、10 字节是保留的,必须为 0,可在第 7、 8、9、10 字节隐藏秘密信息。

要求同上(2);

二、stirmark软件的使用

​ 将需要进行攻击测试的图像放在Media\Input\Images\Set1目录下,注意,这里只能使用bmp格式的图像,在profiles目录下可以看到****SMBsettings.ini****配置文件,可以对需要设定需要测试的文件目录和配置不同攻击方式的参数:

Test_PSNR:起始位0,终值为100;步进为50;

Test_AddNoise:起始位10,终值为50;步进为20;

Test_JPEG:质量因子15,25,35

Test_ConvFilter:使用高斯滤波

Test_SelfSimilarities 使用rgb色系,r,g通道,交换攻击

Test_RotationCrop:旋转角度为-5、0、75、10

Test_RotationScale;旋转角度为-5、0、75、10

熟悉stirmark软件,每一种选取1到2种进行实验。

【实验步骤】

1、BMP图像信息隐藏

方法一:

①将bmp图片与待隐藏字节同时置于同一文件夹下。

img

②使用cmd中Copy-Item对文件进行合并生成新文件。

img

③新图片与原图肉眼上观察并无差异。

img

④用十六进制编辑器打开两张图片,发现信息已经成功写入。

img

img

⑤用matlab分别计算两张图片实际长度和长度信息的差值,发现原图的diff值为0,而新图片的diff值为10。

img

img

方法二:

①编写代码并生成水印图片

img

img

Diff为0,但在UE中发现信息已经嵌入

img

方法三:

①编写代码并嵌入信息,打开UE查看信息。

img

img

2、Strimark使用

① 使用默认配置,运行StirMarkBenchmark程序

img

②进入输出目录查看结果

img

⑥使用strmark攻击测试实验步骤1中的水印图像baboonl.bmp

img

说明LSB攻击不抗JPEG攻击。

img

不抗PSNR攻击。

【实验代码】

diff检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

clc;

clear;

wm=randsrc(1,300, [0 1]); % 产生随机水印信息

fid=fopen('baboon.bmp','r'); %读入载体图像文件

[a,length]=fread(fid,inf,'uint8'); %文件图像实际长度

status=fseek(fid,2,'bof');

fileb=fread(fid,4,'uint8');

filelength=fileb(1)*1+fileb(2)*256+fileb(3)*256^2+fileb(4)*256^3

%文件图像的理论长度

status=fseek(fid,18,'bof');

b=fread(fid,4,'uint8');

biwidth=b(1)*1+b(2)*256+b(3)*256^2+b(4)*256^3

status=fseek(fid,22,'bof');

b=fread(fid,4,'uint8');

biHeight=b(1)*1+b(2)*256+b(3)*256^2+b(4)*256^3;

bfoffbits=54;%偏移量

biBytecount=3;%24 位真彩色图像为 3

fclose(fid);

diff=length-filelength;

方法2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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;

j=1;

wa(11)=54+count;

wa(3)=wa(3)+count;

for i=55:62

wa(i)=uint8(msg(j,1));%隐藏密码信息

disp(wa(i));

j=j+1;

end

for i=55:length

wa(i+9)=a(i);

end

figure;

wa=uint8(wa);

fid=fopen('baboon2.bmp', 'wb');

fwrite(fid,wa);

fclose(fid);

imshow('baboon2.bmp');

方法3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
clc; 

clear;

fid=fopen('baboon.bmp','r'); %读入载体图像文件

[a,length]=fread(fid,inf,'uint8');

fclose(fid);

wa=a;

%在 BMP 的 7、8、9 保留字中隐藏秘密信息 CJM ,ASCII 值为67 74 77

wa(7)=67;

wa(8)=74;

wa(9)=77;

figure;

wa=uint8(wa);

fid=fopen('baboon3.bmp', 'wb');

fwrite(fid,wa);

fclose(fid);

imshow('baboon3.bmp');

BMP图片隐写
http://example.com/2022/12/30/BMP图片隐写/
作者
Magnesium
发布于
2022年12月30日
许可协议