实验原理

针对文件结构的信息隐藏方法需详细掌握文件的格式,利用文件结构块之间 的关系或根据块数据和块大小之间的关系来隐藏信息。

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)在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中文件长度的值即可。
(2)在调色板或者位图信息头和实际的图像数据之间隐藏数据,如果将秘密数据放在文件头与图像数据之间,则至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。 
(3)修改文件头和信息头中的保留字段隐藏信息。
(4)在图像像素区利用图像宽度字节必须是4的倍数的特点,在补足位处隐藏数据。

实验记录

(1)在实际的图像数据后隐藏信息
待隐藏的秘密信息文件名称为hidden.txt、baboon.bmp为载体图像,将载体和秘密信息放置在同一目录 下,在 windows 的命令行模式下执行命令:

Copy baboon.bmp /b+hidden.txt /a baboonl.bmp


其中参数/b指定以二进制格式复制、合并文件,参数/a以ASCII格式复制、合并文件。将baboon.bmp 和 hidden.txt文件进行合并,并生成新的文件baboon1.bm,浏览原图像和合成后的图像,几乎完全相同
将两张图片分别放入UltraEdit中,查看图片信息如下:

如图所示,看到合并后的图片中隐藏了hidden.txt中的内容
隐写代码:

clc;
clear;
fid=fopen('baboon.bmp ','r');
%读入载体图像文件
[a,length]=fread(fid,inf,'uint8');
%length 是文件的实际长度
fclose(fid);
fid=fopen('baboon.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);

将红字部分分别写为baboon.bmp和baboonl.bmp,观察工作区如图所示

上图为baboon.bmp,下图为baboonl.bmp
由此,可观察到合并后的工作区中diff值为6,说明隐藏了6个字节,因此,要在图像中隐藏信息,需修改图像文件长度,即修改第3~6字节,在UltraEdit中手工将第三个字节由原来的0x66(十进制的102)变为0x6d(十进制的109),保存后再运行代码,查看baboonl1.bmp.bak的工作区diff=0

表示图像隐藏并修改文件的长度后,通过该种方法无法发现图像中是否隐藏信息,同时使用图像查看工具打开图像文件,发现图像在视觉上和原图像没有任何差别

(2)文件头与图像数据之间隐藏信息
修改图像数据的偏移量和图像数据的文件长度代码:

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:60(54+隐藏字节)wa(i)=uint8(msg(j,1));%隐藏密码信息      j=j+1;
end
for i=55:lengthwa(i+6)=a(i);
end
figure;
wa=uint8(wa);
fid=fopen('watermarked.bmp', 'wb');
fwrite(fid,wa);
fclose(fid);
imshow('watermarked.bmp');

运行后观察图片,几乎看不出差别

在UltraEdit中打开watermarked.bmp,看到hidden.txt中的内容出现在头部,信息隐藏成功

(3)BMP 图像文件隐藏信息的检测
在 BMP 图像中隐藏信息的时候一般都是通过修改文件的偏移量和图像文件中图像的长度来隐藏信息, 但在 BMP 图像文件中,file length = biwidth * biBytecount * biHeight + bfoffBits,其中biwidth,biheight表示图像文件的宽度和高度,bfoffBits 表示文件头到实际位图图像数据之间的偏移量。
检测代码:

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,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; %diff表示隐藏的信息长度如果相同,表示没有隐藏任何信息

将红色部分分别改为baboon.bmp和watermarked.bmp,查看工作区

上图为原图像,下图为修改后图像,看到其中diff值都为0,说明修改偏移量成功

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

clc;
clear;
fid=fopen('baboon.bmp','r'); %读入载体图像文件
[a,length]=fread(fid,inf,'uint8');
fclose(fid);
wa=a;
%在 BMP 的 7、8、9保留字中隐藏秘密信息 SMY,ASCII 值为 0x53, 0x4D, 0x59
wa(7)=83;
wa(8)=77;
wa(9)=89;
figure;
wa=uint8(wa);
fid=fopen('watermarked.bmp', 'wb');
fwrite(fid,wa);
fclose(fid);
imshow('watermarked.bmp');


在UltraEdit中打开watermarked.bmp,看到第一行有隐藏的信息SMY,隐藏成功

(5)扩展实验,使用LSB在bmp中隐写txt文本信息,并读取
将bmp图片转换为灰度图片代码:

RGB = imread('baboon.bmp');
grey1 = rgb2gray(RGB);
figure
imshow(grey1)

看到图片变灰

写入代码:

Double_Picture=grey1;
Double_Picture=double(Double_Picture);
%将图像转换为二进制
id=fopen('hidden.txt','r'); %读取秘密信息文件
[msg,len]=fread(id,'ubit1');
[m,n]=size(Double_Picture);
p=1; %p为秘密信息的位计数器
for f2=1:nfor f1=1:mDouble_Picture(f1,f2) =Double_Picture(f1,f2)-mod(Double_Picture(f1,f2),2)+msg(p,1);%将秘密信息按位隐藏人连续的像素中if p==lenbreak;endp=p+1;endif p==lenbreak;end
end
Double_Picture=uint8(Double_Picture);
imwrite(Double_Picture,'baboonout.bmp'); %生成秘密信息
imshow(Double_Picture);

写入后查看图片看到图片与原图几乎一样

读取图片中的txt文本信息,并将文本信息写入新建的hidden1.txt文本文件
读取信息代码:

Picture=imread('baboonout.jpg'); %读人隐秘信息的图像
Picture=double(Picture);
[m,n]=size(Picture);
frr=fopen('hidden1.txt','a');
len=8;%设定隐秘信息长度
p=1;
for f2=1:nfor f1=1:mif bitand(Picture(f1,f2),1)==1%顺序提取图像相应像素LSB的秘密信息fwrite(frr,1,'bit1');result(p,1)=1;elsefwrite(frr,0,'bit1');result(p,1)=0;endif p==len%判断秘密信息是否读完break;endp=p+1;endif p==lenbreak;end
end
fclose(frr);

分别查看hidden.txt和hidden1.txt

看到文本文件内容相同,说明LSB隐写成功

BMP 图像信息隐藏及检测相关推荐

  1. java bmp信息隐藏_BMP图像信息隐藏及检测

    1.实验目的 (1)了解BMP图像文件格式 (2)了解利用BMP图像文件隐藏信息的原理 (3)掌握基于24位真彩色BMP图像的文件信息隐藏方法 2.实验内容 (1)在图像数据后隐藏信息 (2)文件头与 ...

  2. matlab信息隐藏图片,信息隐藏 实验二 BMP 图像信息隐藏

    实验二 BMP 图像信息隐藏 一,实验目的 1,了解BMP图像文件格式 2,了解利用BMP图像文件隐藏信息的原理 3,设计并实现一种基于24位真彩色BMP图像的文件信息隐藏方法. 二,实验环境 1, ...

  3. python控制台图片_Python实现图像信息隐藏

    Python实现图像信息隐藏 之前学习密码学的时候老师有提到过『信息隐藏』,现在用图像的方法尝试一下.思想是:把信息藏到RGB通道中的B通道,然后利用奇偶性可以恢复过来 原理 从源图中提取文字图像信息 ...

  4. [译] APT分析报告:10.Lazarus以ThreatNeedle家族攻击工业事件还原(BMP图片隐藏RAT)

    这是作者新开的一个专栏,主要翻译国外知名安全厂商的APT报告,了解它们的安全技术,学习它们溯源APT组织和恶意代码分析的方法,希望对您有所帮助.当然,由于作者英语有限,会借助机翻进行校验,还请包涵!前 ...

  5. LSB图像信息隐藏(实现及分析)

    一.LSB图像信息隐藏(python实现) 1.实验目的 将信息图片存入载体图片,并从载体图片中提取出信息图片.具体操作为将信息图片的信息写入载体图片的最低位层(载体图片至少应为信息图片8倍). 2. ...

  6. 基于离散小波变换 (DWT)的图像信息隐藏算法

    离散小波变换 (DWT) 是一种常用于图像信息隐藏的算法.这种算法通过将图像进行小波变换来隐藏信息.在这个过程中,图像被分成不同的尺度和方向的部分,称为小波系数. 具体来说, 首先将图像进行小波分解, ...

  7. 【图像隐藏】基于DCT、DWT、LHA、LSB的数字图像信息隐藏系统含各类攻击和性能参数附matlab代码

    1 内容介绍 1.1 课题研究的目的和意义 自二十世纪九十年代以来,网络在我们的生活中得到了快速的普及,网络几乎存 在于家家户户中,特别是一些用于交流的软件自诞生以来更是为我们的生活都带来了 极大的便 ...

  8. matlab信息隐藏和提取,使用matlab进行图像信息隐藏和提取

    基于格式的信息隐藏方法通常在文件头与图像数据之间,或图像数据末尾添加秘密信息,具有实现简单,透明性高,隐藏容量大等多个优点:LSB图像信息隐藏算法是将秘密信息隐藏在图像像素数据的低位上来隐藏信息的方法 ...

  9. 基于计算全息的半色图像信息隐藏

    基于计算全息的半色图像信息隐藏 简介 光学信息隐藏算法大致可以分为两类. 第一类是基于双随机相位编码的信息隐藏算法,第二类是基于数字全息编码的信息隐藏算法.这两类算法分别利用了双随机编码和全息编码对水 ...

最新文章

  1. COMCMS_CORE 起步篇,如何运行和部署
  2. linux查看native进程,Android 分析应用程序占用native内存
  3. 查看及修改当前数据库的所支持的数据库引擎以及默认数据库引擎
  4. Markdown语法(二)——链接代码块
  5. 优秀网络安全从业者的五项核心技能
  6. 到爱尔兰敲代码 / Come, Coding in Ireland
  7. kafka 0.8.2版本配置选项翻译
  8. Atitit 人工智能 统计学 机器学习的相似性 一些文摘收集 没有人工智能这门功课,人工智能的本质是统计学和数学,就是通过机器对数据的识别、计算、归纳和学习,然后做出下一步判断和决策的科学
  9. 2020 有哪些不容错过的前端技术趋势? | 凌云时刻
  10. 【JAVA面试题整理】框架之Shiro
  11. Dev-C++中, “\“反斜杠符号显示成人民币符号、中文斜躺 问题
  12. java修改mariadb数据_MariaDB更新数据
  13. 图像的区域选取(matlib)
  14. 猜数字游戏java课程设计报告
  15. python读写tif文件
  16. Table ‘数据库.数据库表‘ doesn‘t exist
  17. python数据字典ppt_[关系型数据库][MySQL]用python快速导出数据字典
  18. 如何对视频进行伪原创处理的方法
  19. php文件提示保存文件,php header函数文件下载时直接提示保存
  20. Lightweight Adversarial Network for Salient Object Detection

热门文章

  1. android studio开发工具介绍,Android应用开发之Android开发工具介绍、Android Studio配置...
  2. hdunbsp;相遇周期
  3. PC版微信登录的时候,手机上没有提示登录确认的窗口弹出
  4. 基于tornado实现web camera
  5. (C++)设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,包括某日期加上指定天数、某日期减去指定天数、两个日期相差的天数等。
  6. html 多层画布,HTML画布——canvas
  7. 使用IDM批量下载Sentinel(哨兵)卫星数据
  8. [国家集训队2012]tree(陈立杰)
  9. 【Unity3D基础2-13】Unity3D UI系统之UGUI
  10. Qomo OpenProject Field Test 3发布!