BMP 图像信息隐藏及检测
原理简介
针对文件结构的信息隐藏方法需详细掌握文件的格式,利用文件结构块之间的关系或根据块数据和块大小之间的关系来隐藏信息。
BMP(Bitmap-File)图形文件是 Windows 采用的常见图形文件格式,要利用 BMP 位图进行信息隐藏首先需要详细了解 BMP 文件的格式,BMP 图像文件结构比较单一而且固定,BMP 图像由文件头、信息头、调色板区和数据区四个部分组成,而 24 位真彩色图像中没有调色板信息。24 位真彩色 BMP 位图文件包括 3 部分。 第一部分是 BMP 文件头(14个字节)。前 2 个字节是“BM”,是用于识别 BMP文件的标志;第 3、4、5、6 字节存放的是位图文件的大小,以字节为单位;第7、8、9、10 字节是保留的,必须为 0;第 11、12、13、14 字节给出位图阵列相对于文件头的偏移,在 24 位真彩色图像中,这个值固定为 54;第二部分是位图信息头(40个字节)。第19,20,21,22字节表示的是图像文件的宽度,以像素为单位;第23,24,25,26 字节表示的是图像文件的高度,以像素为单位。从第 29个字节开始,第 29、30 字节描述的是像素的位数, 24 位真彩色位图。该位的值为 0x18; 第三部分是数据区。从第 55 个字节开始,每 3 个字节表示一个像素,这 3 个字节依次表示该像素的红、绿、蓝亮度分量值。
在不影响图像正常显示情况下,可使用以下四种方法在 24 位真彩色 BMP 图像中隐藏信息。
- 在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中文件长度的值即可。
- 在调色板或者位图信息头和实际的图像数据之间隐藏数据,如果将秘密数据放在文件头与图像数据之间,则至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。
- 修改文件头和信息头中的保留字段隐藏信息。
- 在图像像素区利用图像宽度字节必须是 4 的倍数的特点,在补足位处隐藏数据。
操作环境
Windows 10 操作系统
MATLAB 2019a 版本软件
BMP 格式图片文件
010 编辑工具
技术过程
一、在实际的图像数据后隐藏信息
待隐藏的秘密信息文件名称为 hidden.txt, Baboon.bmp 为载体图像,将载体和秘密信息放置在同一个目录下,在 Windows 的 MS-DOS 方式下执行命令 Copy baboon.bmp /b + hidden.txt /a baboon1.bmp ,其中参数/b 指定以二进制格式复制、合并文件,参数/a 以 ASCII 格式复制、合并文件。执行该命令后,生成一个新的 baboon1.bmp 文件,使用图像浏览工具浏览该文件发现与原始载体图像几乎完全相同,信息隐藏在 baboon.bmp 文件的尾部。从 BMP 图像的结构中可知,图像的 3、4、5、6 四个字节存放整个 BMP 图像的长度。使用该方法隐藏信息时,未修改图像文件的文件长度字节,通过比较文件的实际长度和
文件中保存的文件长度,就可发现该图像是否隐藏秘密信息。
(1)制作隐藏信息的图片QftmModify1.bmp
创建Hidden.txt文件
制作QftmModify1.bmp
copy Qftm.bmp/b + hidden.txt/a QftmModify1.bmp
(2)Matlab脚本检测文件是否存在隐藏信息
检测图片QftmModify1.bmp文件长度
clc;
clear;
fid=fopen('QftmModify1.bmp','r'); %读入载体图像文件
[a,length]=fread(fid,inf,'uint8');%length 是文件的实际长度
fclose(fid);
fid=fopen('QftmModify1.bmp','r');
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 %文件图像中保存的文件长度
diff=length-filelength;
%diff 表示隐藏的信息长度如果相同,表示图像没有隐藏任何信息。
fclose(fid);
运行脚本查看diff结果
从结果可以看出来当没有对bmp的文件头文件长度进行修改时,隐藏的图片diff差值不等于0,得到图片存在信息隐藏。
二、文件头与图像数据之间隐藏信息
在数据区开始之前隐藏信息,隐藏的秘密信息从 hidden.txt 文件中读取(隐藏整个文件),此种方法修改图像数据的偏移量和图像数据的文件长度。
(1)Matlab脚本进行隐藏信息
clc;
clear;
wm=randsrc(1,300, [0 1]); % 产生随机水印
fid=fopen('Qftm.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:54+count
wa(i)=uint8(msg(j,1));%隐藏密码信息
j=j+1;
end
for i=55:length
wa(i+count)=a(i);
end
figure;
wa=uint8(wa);
fid=fopen('watermarked.bmp', 'wb');
fwrite(fid,wa);
fclose(fid);
I=imread('Qftm.bmp');
J=imread('watermarked.bmp');
subplot(1,2,1)
imshow(I)
title('未修改图像');
subplot(1,2,2)
imshow(J)
title('修改后图像')
运行结果查看
分析《watermarked.bmp》16进制清晰查看隐藏效果
三、BMP 图像文件隐藏信息的检测
在BMP图像中隐藏信息的时候一般都是通过修改文件的偏移量和图像文件中图像的长度来隐藏信息,但在BMP图像文件中,file_length=biwidth*biBytecount*biHeight+bfoffBits,其中 biwidth,biheight表示
图像文件的宽度和高度,bfoffBits表示文件头到实际位图图像数据之间的偏移量。
(1)Matlab脚本对Bmp进行信息隐藏多层Check
clc;
clear;
wm=randsrc(1,300, [0 1]); % 产生随机水印信息
fid=fopen('watermarked.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,10,'bof');
b=fread(fid,4,'uint8');
bfoffbitsmodify=b(1)*1+b(2)*256+b(3)*256^2+b(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
filetruelength=biwidth*biBytecount*biHeight+bfoffbits %图片实际真实长度(固定偏移54)
filelengthbfoffbits=biwidth*biBytecount*biHeight+bfoffbitsmodify %读取偏移计算文件长度
fclose(fid);
diff1=length-filelength; %未修改图片长度时Check1
diff2=filelength-filetruelength %修改了图片长度时Check2
diff3=filelengthbfoffbits-filetruelength %修改了图片偏移时Check3
diff=diff1+diff2+diff3
对watermarked.bmp(文件长度和文件偏移都被修改了)进行测试,根据diff的值进行判定该图片是否存在信息隐藏,运行结果查看:
从结果diff != 0可以看出来该图片存在信息隐藏。
四、在图像文件头和信息头的保留字段中隐藏信息
BMP 图像文件中有很多从不使用的保留字节,如 7、8、9、10 字节是保留的,必须为 0,可在第 7、8、9、10 字节隐藏秘密信息。
(1)Matlab脚本对Bmp的保留字段隐藏信息
clc;
clear;
fid=fopen('Qftm.bmp','r'); %读入载体图像文件
[a,length]=fread(fid,inf,'uint8');
fclose(fid);
wa=a;
% 在BMP的7、8、9、10保留字中隐藏秘密信息Qftm,ASCII值为0x51 0x66 0x74 0x6d
wa(7)=81;
wa(8)=102;
wa(9)=116;
wa(10)=109;
figure;
wa=uint8(wa);
fid=fopen('watermarkedReserve.bmp', 'wb');
fwrite(fid,wa);
fclose(fid);
I=imread('Qftm.bmp');
J=imread('watermarkedReserve.bmp');
subplot(1,2,1)
imshow(I)
title('未修改图像');
subplot(1,2,2)
imshow(J)
title('修改后图像')
分析《watermarkedReserve.bmp》16进制清晰查看隐藏效果
BMP 图像信息隐藏及检测的更多相关文章
- BMP图像信息隐藏
图像隐写算法LSB—Least Significant Bits,又称最不显著位.LSB算法就是将秘密信息嵌入到载体图像像素值得最低有效位,改变这一位置对载体图像的品质影响最小. 原理如下: 以实验用 ...
- Python实现图像信息隐藏
Python实现图像信息隐藏 之前学习密码学的时候老师有提到过『信息隐藏』,现在用图像的方法尝试一下.思想是:把信息藏到RGB通道中的B通道,然后利用奇偶性可以恢复过来 原理 从源图中提取文字图像信息 ...
- Windows2003 内核级进程隐藏、侦测技术
论文关键字: 内核 拦截 活动进程链表 系统服务派遣表 线程调度链 驱动程序简介 论文摘要:信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式.信息对抗促使 ...
- Windows 备用数据流(ADS)的妙用___转载
NTFS交换数据流(Alternate Data Streams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流.通俗的理解,就是其它文件可以“寄宿”在某 ...
- sasasa
/***************************************************************************************** 文件:app_to ...
- malware analysis、Sandbox Principles、Design && Implementation
catalog . 引言 . sandbox introduction . Sandboxie . seccomp(short for secure computing mode): API级沙箱 . ...
- Web Api 上传图片,解决上传图片无格式
制作这个功能时,找了很多资料,不过忘记了地址,所以就不一一放连接了, 直接上代码吧! 1. 首先新建一个上传的控制器 /// <summary> /// 上传 /// </summa ...
- Chkrootkit Sourcecode Learning
目录 . Chkrootkit Introduce . Source Code Frame . chklastlog.c . chkwtmp.c . ifpromisc.c . chkproc.c . ...
- Linux Rootkit Learning
目录 . 学习Rootkit需要了解的基础知识 . 挂钩(HOOKING) . 直接内核对象操作 . LSM框架(Linux Security Module)于LKM安全 . rootkit检测技术及 ...
随机推荐
- Tomcat源码分析 (六)----- Tomcat 启动过程(一)
说到Tomcat的启动,我们都知道,我们每次需要运行tomcat/bin/startup.sh这个脚本,而这个脚本的内容到底是什么呢?我们来看看. 启动脚本 startup.sh 脚本 #!/bin/ ...
- 解决Sklearn中使用数据集MNIST无法获取的问题(WinError 10060)
今天在学习PCA的时候,使用mnist数据集遇到一个问题,代码是这样的: import numpy as np from sklearn.datasets import fetch_mldata mn ...
- 记忆化搜索模板题---leetcode 1155. 掷骰子的N种方法
1155. 掷骰子的N种方法 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, ..., f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数 ...
- Sublime Text 3 使用手册
Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...
- poli-java开源BI软件
目录 快速入门 Github地址: 特性 一个易于使用的SQL报告应用程序,专为SQL爱好者而设计. SQL中的电源数据分析,可获得更快的业务洞察力. 快速入门 https://shzlw.githu ...
- MySQL多表关联数据同时删除
MySQL多表关联时的多表删除: DELETE t1, t2FROM t1LEFT JOIN t2 ON t1.id = t2.idWHERE t1.id = 25
- Hibernate对象状态之间的神奇转换
状态分类 在Hibernate框架中,为了管理持久化类,Hibernate将其分为了三个状态: 瞬时态(Transient Object) 持久态(Persistent Object) 脱管态(Det ...
- Codeforces 1004E
题意略. 思路: 这k个点应该放在这棵树的直径上,并且能连成一条路径.如果k比树的直径上的点要多,那么我们就不用把这k个点都用上, 只需要把这棵树直径上所有的点都覆盖上就行了.如果k比树的直径上的点要 ...
- Codeforces 976D
题意略. 思路:构造题. 我们把全部的d[n]+1个点分作3部分来构造. 首先我们把原问题归约成构造d1.dn.和{d2 - d1,d3 - d1,.....,d[n-1] - d1}这样的问题,其中 ...
- Leetcode之二分法专题-154. 寻找旋转排序数组中的最小值 II(Find Minimum in Rotated Sorted Array II)
Leetcode之二分法专题-154. 寻找旋转排序数组中的最小值 II(Find Minimum in Rotated Sorted Array II) 假设按照升序排序的数组在预先未知的某个点上进 ...