目录
实验环境
MATLAB
系统设计
BMP文件格式
BMP(Bitmap file)
文件是Windows采用的一种标准的文件格式,Windows系统下各种图像处理软件都支持这种文件格式。BMP文件也是信息隐藏常用的携带秘密信息的载体之一。
BMP图像文件是一种位图文件,也就是将图像划分为一个个的栅格,其中每个栅格称为像素。所以每幅图像都可以看作是由一些像素点组成的矩阵。对于一幅灰度图像,一般使用多个比特表示像素点的灰度值,而比特数据中的每一位都表示了一个0或1的二值平面,此平面称为位面。假设使用1比特数据表示像素点的灰度值,那么此图像为8个位面,其中最低位面用位面0表示,最高位面用位面7表示。BMP图像文件大致可分为两个部分,包括头文件与位图数据,而更详细的可分为四个部分:
- 头文件数据。包含文件的数据类型,显示设置等内容。
- 位图的构造信息。包含位图的边长,压缩的方式,还有颜色信息。
- 色板。很多图像文件没有此部分,如24位的真彩色BMP图像就不含有调色板这个部分。
位图数据
。此部分是由BMP图像文件的位数所决定的,真彩色图像中使用RGB此外,其余图像使用第三部分中的颜色索引。
LSB空域信息隐藏算法
LSB(Least Significant Bit)算法
将隐藏的信息比特按位(bit)顺序嵌入原始图像像素的最低位面(Least Significant Bit)
。
嵌入算法
LSB算法嵌入流程如下:
(1)对原始图像中每个像素点的灰度值进行变换,由十进制转换为二进制;
(2)将秘密信息转换为二进制序列,并将原始图像中像素点的最低比特位替换为二进制序列中的每一比特信息;
(3)在替换过程结束后,将像素点的二进制数据转换回十进制数据,保存为载密图像。
提取算法
与嵌入算法对应,LSB算法提取流程如下:
(1)对载密图像中每个像素点的灰度值进行变换,由十进制转换为二进制;
(2)提取图像像素点中最低有效位的数据,根据嵌入顺序进行组合得到原秘密序列。
LSB空域信息隐藏算法分析
优点
LSB算法的优点如下:
- 可嵌入的信息量大;
- 算法简单,易于实现;
- 载密图像失真小;
- 可以避免由于文件格式改变导致的秘密信息损坏。
缺点
LSB算法的缺陷也很明显:
- 鲁棒性差;
- 抗隐写分析的能力弱。
系统实现
HidenMsg.txt
存储所需隐藏的秘密信息
。
信息隐藏:HideMsg.m
LSB算法嵌入过程的关键步骤就是将原始图像最低的一个位平面替换为要隐藏的秘密信息。
先将原始图像像素的最低位面设置为0。(可以判断像素点的灰度值是否可以被二整除,如果不可以被整除,则将最低位取反。)
此后,就可以一位位地根据秘密信息改变像素的最低有效位,实现秘密信息的嵌入。
%打开图片
picture=imread('Pic.bmp');
%将图片转化为double类型
Double_picture=double(picture);
%读取所需隐藏的信息文件
file=fopen('HidenMsg.txt','r');
[HidenMsg,MsgLen]=fread(file,'ubit1');
%获取图片分辨率
[Length,Width]=size(Double_picture);
p=1;
for j=1:Width
for i=1:Length
%最低位面替换成隐藏信息
Double_picture(i,j)=Double_picture(i,j)-bitand(Double_picture(i,j),1)+HidenMsg(p,1);
if p==MsgLen
break
end
p=p+1;
end
if p==MsgLen
break
end
end
%保存包含隐藏信息的bmp文件
Double_picture=uint8(Double_picture);
imwrite(Double_picture,'PicWithHidenMsg.bmp');
%显示未嵌入信息的图像
subplot(121);
imshow(picture);
title('未嵌入信息的图像');
%显示嵌入信息的图像
subplot(122);
imshow(Double_picture);
title('嵌入信息的图像');
%关闭文件
fclose(file);
信息提取:ShowHidenMsg.m
通过LSB算法嵌入过程的关键步骤可以看出:载密图像的最低比特位就是秘密信息的比特流。
所以只需要对载密图像中每个像素点的灰度值进行变换,由十进制转换为二进制,再提取图像像素点中最低有效位的数据,根据嵌入顺序进行组合就可以得到秘密信息。
%打开隐藏信息的图片
picture=imread('PicWithHidenMsg.bmp');
%将图片转化为double类型
Double_picture=double(picture);
%获取图片分辨率
[Length,Width]=size(Double_picture);
%打开文件
file=fopen('ShowHidenMsg.txt','wb+');
%设置隐藏信息长度
%隐藏的字符数*8 bit
MsgLen=10*8;
p=1;
for j=1:Width
for i=1:Length
%最低位面是隐藏信息
fwrite(file,bitand(Double_picture(i,j),1),'ubit1');
if p==MsgLen
break
end
p=p+1;
end
if p==MsgLen
break
end
end
%关闭文件
fclose(file);
参考文献
[1] 孔祥维等.多媒体信息安全实践教程.科学出版社