中国科学技术大学


继续教育学院课程设计


论文报告










论文题目:图像的信息隐藏检测算法和实现
学员姓名:黄琳
学    号:TB04202130
专    业:计算机科学与技术
指导教师: 
日    期:2007年1月20日











图像的信息隐藏检测算法和实现



[摘要] Information hiding analysis is the art of detecting the message's existence or destroying the steganographic cover in order to blockade the secret communication. And information Information hiding includes steganography and digital watermark. The application of steganography can be traced to ancient time, and it is also an n hiding detection is the very first step in information hiding analysis. Firstlly, architectonic analysis about information hiding detection is proposed, including the analysis of digital image characteristics, image based detecting algorithms and some problems in its realization. Secondly, many detecting algorithms are introduced with theoretical analyses and experimental results in details. Thirdly, two applications of detecting technology are put forward. Finally, a detecting model used in Internet is discussed

[关键词] 安全 信息 隐藏 检测




1. 引言
    数字图像的信息隐藏技术是数字图像处理领域中最具挑战性、最为活跃的研究课题之一。本文概述了数字图像的信息隐藏技术,并给出了一个新的基于彩色静止数字图像的信息隐藏算法。
    数字图像可分为静止图像和动态图像两种,后者一般称为视频图像。视频图像的每一帧均可看作是一幅静止图像,但是这些静止图像之间并不是相互孤立的,而是存在时间轴上的相关性。静止图像是像素(Pixel)的集合,相邻像素点所对应的实际距离称为图像的空间分辨率。根据像素颜色信息的不同,数字图像可分为二值图像、灰度图像以及彩色图像。数字图像的最终感受者是人的眼睛,人眼感受到的两幅质量非常相同的数字图像的像素值可能存在很大的差别。这样,依赖于人的视觉系统(Human Visual System,HVS)的不完善性,就为数字图像的失真压缩和信息隐藏提供了非常巨大的施展空间。
    信息隐藏与信息加密是不尽相同的,信息加密是隐藏信息的内容,而信息隐藏是隐藏信息的存在性,信息隐藏比信息加密更为安全,因为它不容易引起攻击者的注意。
2. 信息隐藏技术综述
2.1信息隐藏简介
    信息隐藏(Information Hiding),也称作数据隐藏(Data Hiding),或称作数字水印(Digital Watermarking)。简单来讲,信息隐藏是指将某一信号(一般称之为签字信号,Signature Signal)嵌入(embedding)另一信号(一般称之为主信号,Host Signal,或称之为掩护媒体,cover-media)的过程,掩护媒体经嵌入信息后变成一个伪装媒体(stegano-media)。这一嵌入过程需要满足下列条件:
    ·签字信号的不可感知性(Imperceptibility)。换句话讲,签字信号嵌入后,主信号的感知特性没有明显的改变,签字信号被主信号"隐藏"了起来。
    ·签字信号的鲁棒性(Robustness)。签字信号对主信号的各种失真变换,如失真信号压缩、仿射变换、加噪、A/D或D/A转换等,以及各种恶意性攻击(Malicious Attack),都应体现出一定的鲁棒性。除非主信号的感知特性被明显的破坏,签字信号将很难被去除。
    ·一般来讲,签字信号的嵌入不增加主信号的存储空间和传输带宽。也就是说,签字信号嵌入后,"表面"上很难觉察到信息的改变。
    信息隐藏的发展历史可以一直追溯到"匿形术(Steganography)"的使用。"匿形术"一词来源于古希腊文中"隐藏的"和"图形"两个词语的组合。虽然"匿形术"与"密码术(Cryptography)"都是致力于信息的保密技术,但是,两者的设计思想却完全不同。"密码术"主要通过设计加密技术,使保密信息不可读,但是对于非授权者来讲,虽然他无法获知保密信息的具体内容,却能意识到保密信息的存在。而"匿形术"则致力于通过设计精妙的方法,使得非授权者根本无从得知保密信息的存在与否。相对于现代密码学来讲,信息隐藏的最大优势在于它并不限制对主信号的存取和访问,而是致力于签字信号的安全保密性。
2.2信息隐藏算法的基本框架
    以下部分给出了基于正交变换的信息隐藏算法的基本框架,包括嵌入过程和检测过程两部分,分别如图2.1和图2.2所示。
    算法2.1(基于变化域的信息隐藏嵌入算法)
    对原始主信号作正交变换;
    对原始主信号作感知分析;
    在步骤(2)的基础上,基于事先给定的关键字,在变换域上将签字信号嵌入主信号,得到带有隐藏信息的主信号。


图1 信息隐藏算法的嵌入过程
    算法2.2(基于变化域的信息隐藏检测算法)
      1. 对原始主信号作感知分析;
      2. 在步骤(1)的基础上,基于事先给定的关键字,在变换域上将原始主信号和可能带有隐藏信息的主信号作对比,判断是否存在签字信号。

图2 信息隐藏算法的检测过程
2.3 信息隐藏的关键技术
    信息隐藏技术的关键在于如何处理签字信号的鲁棒性、不可感知性、以及所嵌入的数据量这三者之间的关系。判断信息隐藏算法优劣的一般衡量准则为:
    1). 对于主信号发生的部分失真,签字信号是否具备一定的鲁棒性。
    2). 对于有意或无意的窃取、干扰或去除操作,签字信号是否具备一定的"抵抗"能力,从而保证隐藏信息的安全可靠和完整性。
    3). 签字信号的嵌入是否严重降低了主信号的感知效果。
    4). 数据嵌入量的大小。
    对于某一特定的信息隐藏算法来讲,它不可能在上述的衡量准则下同时达到最优。显然,数据的嵌入量越大,签字信号对原始主信号感知效果的影响也会越大;而签字信号的鲁棒性越好,其不可感知性也会就随之降低,反之亦然。由于信息隐藏的应用领域十分宽广,不同的应用背景对其技术要求也不尽相同。因此,有必要从不同的应用背景出发对信息隐藏技术进行分类,进而分别研究它们的技术需求。根据应用背景的不同,信息隐藏技术大致可分为三类:
    (1) 版权保护(Copyright Protection)
    到目前为止,信息隐藏技术的绝大部分研究成果都是在这一应用领域中取得的。信息隐藏技术在应用于版权保护时,所嵌入的签字信号通常被称作"数字水印(Digital Watermark)"。版权保护所需嵌入的数据量最小,但对签字信号的安全性和鲁棒性要求也最高,甚至是十分苛刻的。为明确起见,应用于版权保护的信息隐藏技术一般称作"鲁棒型水印技术",而所嵌入的签字信号则相应的称作"鲁棒型水印(Robust Watermark)",从而与下文将要提到的"脆弱型水印"区别开来。而一般所提到的"数字水印"则多指鲁棒型水印。
    由于鲁棒型数字水印用于确认主信号的原作者或版权的合法拥有者,它必须保证对原始版权的准确无误的标识。因为数字水印时刻面临着用户或侵权者有意或恶意的破坏,因此,鲁棒型水印技术必须保证在主信号可能发生的各种失真变换下,以及各种恶意攻击下都具备很高的抵抗能力。与此同时,由于要求保证原始信号的感知效果尽可能不被破坏,因此对鲁棒型水印的不可见性也有很高的要求。如何设计一套完美的数字水印算法,并伴随以制订相应的安全体系结构和标准,从而实现真正实用的版权保护方案,是信息隐藏技术最具挑战性也最具吸引力的一个课题。
    (2) 数据完整性鉴定(Integrity Authentication)
    数据完整性鉴定,又称作数据篡改验证(Tamper Proof),是指对某一信号的真伪或完整性的判别,并进一步需要指出该信号与原始真实信号的差别,即提供有关证据指明真实信号可能经历的篡改操作[7]。更形式化的讲,假定接收到一多媒体信号g(图像、音频或视频信号),初步判断它很可能是某一原始真实信号f的修改版本。数据篡改验证的任务就是在对原始信号f的具体内容不可知的情况下,以最大的可能判断是否g=f。一般的数据篡改验证过程如图3所示。

图3 数据篡改验证一般过程
    实用的数据篡改验证方法应致力于满足以下要求:
    · 以最大的可能指出是否有某种形式的篡改操作发生;
    · 提供对篡改后信号失真程度的度量方法;
    · 在无从得知原始真实信号的内容或其他与真实信号内容相关的信息的条件下,判断可能发生的篡改操作的具体类别,如判别是滤波、压缩,还是替代操作等;与此同时,应根据具体的应用背景,对经篡改后的信号给出相应的可信度;
    · 无需维护和同步操作任何与原始信号相分离的其它附加数据,即可恢复重建原始真实信号。
    "脆弱型水印(Fragile Watermark)"技术为数据篡改验证提供了一种新的解决途径。该水印技术在原始真实信号中嵌入某种标记信息,通过鉴别这些标记信息的改动,达到对原始数据完整性检验的目的。因此,与鲁棒型水印不同的是,脆弱型水印应随着主信号的变动而做出相应的改变,即体现出脆弱性。但是,脆弱型水印的脆弱性并不是绝对的。对主信号的某些必要性操作,如修剪或压缩,脆弱型水印也应体现出一定的鲁棒性,从而将这些不影响主信号最终可信度的操作与那些蓄意破坏操作区分开来。另一方面,对脆弱型水印的不可见性和所嵌入数据量的要求与鲁棒型水印是近似的。
    (3) 扩充数据的嵌入(Augmentation Data Embedding)
    扩充数据包括对主信号的描述或参考信息、控制信息以及其它媒体信号等等。描述信息可以是特征定位信息、标题或内容注释信息等,而控制信息的嵌入则可实现对主信号的存取控制和监测。例如,一方面针对不同所有权级别的用户,可以分别授予不同的存取权限。另一方面,也可通过嵌入一类通常被称作"时间印章(Time Stamp)"的信息,以跟踪某一特定内容对象的创建、行为以及被修改的历史。这样,利用信息隐藏技术可实现对这一对象历史使用操作信息的记录,而无需在原信号上附加头文件或历史文件,因为使用附加文件,一来容易被改动或丢失,二来需要更多的传输带宽和存储空间。与此同时,在给定的主信号中还可嵌入其它完整而有意义的媒体信号,例如在给定视频序列中嵌入另一视频序列。因此,信息隐藏技术提供了这样一种非常有意义而且极具魅力的应用前景,它允许用户将多媒体信息剪裁成他们所需要的形式和内容[8]。例如,在某一频道内收看电视,可以通过信息隐藏方法在所播放的同一个电视节目中嵌入更多的镜头以及多种语言跟踪,使用户能够按照个人的喜好和指定的语言方式播放。这在一定意义上实现了视频点播(Video on Demand,VOD)的功能,而其最大的优点在于它减少了一般VOD服务所需的传输带宽和存储空间。
    显然,相对于数字水印来讲,扩充数据的嵌入所需隐藏的数据量较大,大量数据的嵌入对签字信号的不可见性提出了挑战。另一方面,由于扩充数据本身的可利用价值,签字信号一般不会受到蓄意攻击的困扰。但是,对于主信号的尺度变换、剪切或对比度增强等操作,特别是失真编码,扩充数据嵌入技术也要具备一定的鲁棒性。
    基于上述讨论,信息隐藏技术不同的应用背景及相应的技术需求归纳如表1所示。
表1 信息隐藏技术的不同应用背景及相应的技术需求
技术需求 鲁棒型水印
(版权保护)
脆弱型水印
(篡改验证)
扩充数据
的嵌入
鲁棒性要
求的强弱
蓄意攻击不要求
非几何失真变换
(滤波、压缩等)
较弱较强
几何失真变换
(仿射变换、剪切等)
较强较强
无失真变换
所需嵌入的数据量较小较小
签字信号的不可见效果 较好
    除基于不同的应用背景外,信息隐藏技术还有其它的一些分类方法。根据隐藏数据的嵌入方法不同,信息隐藏技术可分为以下两类:
    (1) 在变换域(Transformation Domain),如傅立叶变换(FFT)域、离散余弦变换(DCT)域、离散小波变换(DWT)域等上实现信息的嵌入。这类技术主要是通过修改主信号某些指定的频域系数来嵌入数据。考虑到对低频区域系数的改动可能会影响到主信号的感知效果,而高频系数有易被破坏,因此,信息隐藏技术一般选取信号中频区域上的系数来嵌入签字信号,从而使之既满足不可感知性,又满足对诸如失真压缩等操作的鲁棒性。
    (2) 直接在空域(Spatial Domain)上实现信息的嵌入。这类方法的优点是快捷,并且对于主信号的几何变换、压缩等操作具备一定的抵抗能力,但对于信号滤波、加噪等操作的鲁棒性较差。
    根据检测过程中是否需要无隐藏数据的原始主信号,信息隐藏技术可分为盲提取(Blind Retrieval)和非盲提取(Non-Blind Retrieval)两类。由于信息隐藏技术中数据的嵌入与数据的检测或提取之间存在着天然的依赖关系,因此在设计嵌入算法时必须考虑到数据恢复的可能性。显然,若数据检测时未嵌有签字信号的原始主信号可知,那么只要所设计的嵌入算法可逆,并同时依赖一定的信号检测技术,在理论上即可以保证检测算法的成功性。但若原始主信号未知,信息隐藏的检测或提取算法设计起来就会更加复杂,在利用信号检测技术的同时,还依赖于信号估计和预测技术,以及巧妙的算法设计策略。由于盲提取信息隐藏技术更具有实用价值,它也越来越受到更多的关注。
2.4彩色图像的BMP文件格式
    BMP图像文件格式,是微软公司为其WINDOWS环境设置的标准图像格式,并且内含了一套图像处理的API函数。随着WINDOWS在世界范围内的普及, BMP文件格式越来越多地被各种应用软件所支持。BMP图像文件是位图文件,位图表示的是将一幅图像分割成栅格,栅格的每一点称为像素,每一个像素具有自己的RGB值,即一幅图像是由一系列像素点构成的点阵。位图文件格式支持4位RLE(行程长度编码)以及8位和24位编码。
    在本文中我们只处理 24 位格式。24位BMP图像文件的结构特点为: ① 每个文件只能非压缩地存放一幅彩色图像;② 文件头由54个字节的数据段组成,其中包含有该位图文件的类型、大小、图像尺寸及打印格式等; ③从第55个字节开始,是该文件的图像数据部分,数据的排列顺序以图像的左下角为起点,从左到右、从下到上,每连续3个字节便描述图像一个像素点的颜色信息,这三个字节分别代表蓝、绿、红三基色在此像素中的亮度,若某连续三个字节为:00H,00H,FFH,则表示该像素的颜色为纯红色。
    以下我们详细讨论位图文件的具体结构。BR> 2.4.1位图文件的标头
    标头包含位图文件的类型大小信息和版面信息。结构如下[2]:
typedef struct tagBITMAPFILEHEADER {
  UINT bfType;
  DWORD bfSize;
  UINT bfReserved1;
  UINT bfReserved2;
  DWORD bfOffBits;
}BITMAPFILEHEADER;
    下面是对这个清单中的代码元素的说明:
        bfType:指定文件类型,其值始终为"BM"。
        bfSize:指定整个文件的大小(以字节为单位)。
        bfReserved1:保留 -- 一般为0。
        bfReserved2:保留 -- 一般为0。
        bfOffBits:指定从 BitmapFileHeader 到图像首部的字节偏移量。
    现在我们已经知道位图标头的用途就是标识位图文件。读取位图文件的每个程序都使用位图标头来进行文件验证。

2.4.2位图信息标头
    随后的标头称为信息标头,其中包含图像本身的属性。下面说明如何指定 Windows 3.0(或更高版本)设备独立位图 (DIB) 的大小和颜色格式:
typedef struct tagBITMAPINFOHEADER {
  DWORD biSize; //BITMAPINFOHEADER 结构所需的字节数
  LONG biWidth; //位图的宽度(以象素为单位)
  LONG biHeight; //位图的高度(以象素为单位)
  WORD biPlanes; //目标设备的位面数。这个成员变量的值必须为1
  WORD biBitCount; //每个象素的位数。其值必须为1、4、8或24
  DWORD biCompression; //压缩位图的压缩类型。在24位格式中,该变量被设置为0
  DWORD biSizeImage; //图像字节大小。如果位图的格式是BI_RGB,则将此成员变量设置为0是有效的
  LONG biXPelsPerMeter;
  //为位图指定目标设备水平分辨率(以"象素/米"为单位)。程序可用该值从最符合当前设备特征的资源群组中选择一个位图

  LONG biYPelsPerMeter; //为位图指定目标设备的垂直分辨率(以"象素/米"为单位)
  DWORD biClrUsed;
  //指定位图实际所用的颜色表中的颜色索引数。如果biBitCount设为24,则biClrUsed指定用来优化Windows调色板性能的参考颜色表

  DWORD biClrImportant; //指定对位图的显示有重要影响的颜色索引数。如果此值为0,则所有颜色都很重要
} BITMAPINFOHEADER;
    现在已定义了创建图像所需的全部信息。
2.4.3图像数据
    在24位格式中,图像中的每个象素都由存储为三字节的RGB序列表示。每个扫描行都被补足到4位。图像是自底而上存储的,即第一个扫描行是图像中的最后一个扫描行。下图显示了位图文件的标头(BITMAPHEADER)和位图信息标头(BITMAPINFOHEADER)以及部分图像数据:

图4 位图文件局部示例
2.5基于彩色静止数字图像的信息隐藏算法
    在分析了信息隐藏算法的基本框架和彩色图像的BMP文件格式后,本文提出一种基于彩色静止数字图像的信息隐藏算法,分别如图5和图6所示。
    算法4.1(基于彩色静止数字图像的信息隐藏嵌入算法)
    1) 将待隐藏信息(以下称签字信号)的字节长度写入BMP文件标头部分的保留字节中;
    2) 将签字信号转化为二进制数据码流;
    3) 将BMP文件图像数据部分的每个字节的高7位依次异或后再与上述二进制数码流异或后的结果写入最低位;

图5 基于彩色静止数字图像的信息隐藏嵌入过程
    算法4.2(基于彩色静止数字图像的信息隐藏提取算法)
    1) 读BMP文件标头部分的保留字节值,设为L,若为0则没有隐藏信息,终止算法;若不为0则其值为隐藏信息的字节长度;
    2) 将BMP文件图像数据部分的每个字节8位依次异或,并保存其结果;
    3) 重复第(2)步,使每8个BMP文件图像数据部分字节经过运算后组成一个隐藏信息字节;
    4) 重复(2)、(3)直到隐藏信息字节长度为L。

图6 基于彩色静止数字图像的信息隐藏提取过程
    可以证明,提取后的信息就是嵌入的签字信号。以签字信号的一个位S为例,设对应的一个位图数据字节为X7X6X5X4X3X2X1X0,嵌入签字信号后的位图数据字节为X7X6X5X4X3X2X1X0',其中:
X0' = X7⊕X6⊕X5⊕X4⊕X3⊕X2⊕X1⊕S
    设提取后的签字信号为S',则,
S' =X7⊕X6⊕X5⊕X4⊕X3⊕X2⊕X1⊕X0'
=(X7⊕X6⊕X5⊕X4⊕X3⊕X2⊕X1⊕X7)⊕(X6⊕X5⊕X4⊕X3⊕X2⊕X1⊕S)
=(X7⊕X6⊕X5⊕X4⊕X3⊕X2⊕X1⊕X7)⊕(X6⊕X5⊕X4⊕X3⊕X2⊕X1)⊕S
=S
    证毕。

3. 算法实现
1、HideInfo.cpp:
/*1. BMP文件头
BMP文件头数据结构含有BMP文件的类型、
文件大小和位图起始位置等信息。其结构定义如下: */


typedef struct tagBitMapFileHeader
{
byte bfType[2]; // 位图文件的类型,必须为"BM"
byte bfSize[4]; // 位图文件的大小,以字节为单位
byte bfReserved1[2]; // 位图文件保留字,必须为0
byte bfReserved2[2]; // 位图文件保留字,必须为0
byte bfOffBits[4]; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} *BitMap; //该结构占据14个字节。

/*功能:返回图像的长度*/
int getValue(byte*A,int num)
{
int result = 0;
for(int i = num-1;i>0;i--)
{
  result+=A[i];
  result = result<<8;
  }
 result+=A[0];
 return result;
}

/*功能:将信息隐藏到图片中*/
void hideInFo()
{
 FILE* fp;
 char data[MAX];
 char path[MAX];
 BitOperate operate;
 string path1 = "请输入图片路径(如:c:\\pics\\1.bmp)";
 cout << path1 << endl;
 char temp3[100];
 cin.getline(temp3, 100, '\n');
 cin.getline(path, sizeof(path), '\n');
 if((fp = fopen(path, "r+"))==NULL)
 {
  cout<<"打开文件的时候出现错误!"<   return;
 }
 BitMap map = //存放文件头信息;
  (BitMap)malloc(sizeof(struct tagBitMapFileHeader ));

 fread(map,sizeof(struct tagBitMapFileHeader ),1,fp);

 printf("请输入您要隐藏的信息:\n");
 cin.getline(data, MAX, '\n');
 int datalength = strlen(data);
 int maplength = getValue(map->bfSize,4);
 int databegin = getValue(map->bfOffBits,4);
 if((datalength*8)>(maplength-databegin))
 {
  printf("隐藏信息太长!请选择一个更大的图片或者将信息分块隐藏\n");
  return;
 }

 //首先将文件的长度隐藏起来;
 byte temp[32];
 fseek(fp,databegin,SEEK_SET);//定位到数据块的起点;
 fread(temp,sizeof(char)*32,1,fp);

 int copy = datalength;
 for(int i = 31;i>=0;i--)
 {
  bool v = (bool)(copy%2);
  temp[i] = operate.bitSet(temp[i],1,v);
  copy = copy/2;
 }
 fseek(fp,databegin,SEEK_SET); //定位到数据块的起点;
 fwrite(temp,sizeof(byte)*32,1,fp);

 //以下将数据信息隐藏到图像中;
 int times = 0;
 byte ch[8];
 while(times//加上隐藏的文件长度信息;
 {
  fseek(fp,databegin+32+times*8,SEEK_SET);//定位到数据块的起点;
  fread(ch,sizeof(byte),8,fp); //读出8个字节;
  for(int i = 7;i>=0;i--)
   ch[i] = operate.bitSet(ch[i],1,operate.bitAt(data[times],8-i));
  fseek(fp,databegin+32+times*8,SEEK_SET);//定位到数据块的起点;
  fwrite(ch,sizeof(byte),8,fp); //写入8个字节;
  times++;
 }
 fclose(fp);
 cout << "隐藏成功,按任意键退出" << endl;
}
/*将图片中隐藏的信息提取出来*/
void getInFo()
{
 FILE* fp;
 byte data[MAX];
 BitOperate operate;
 char path[MAX];
 cout << "请输入图片路径(如:c:\\pics\\1.bmp)" << endl;
 char temp3[100];
 cin.getline(temp3, 100, '\n');
 cin.getline(path, sizeof(path), '\n');
 if((fp = fopen(path, "r+"))==NULL)  {
  cout<<"打开文件的时候出现错误!"<   return;
 }
 BitMap map = //存放文件头信息;
  (BitMap)malloc(sizeof(struct tagBitMapFileHeader ));

 fread(map,sizeof(struct tagBitMapFileHeader ),1,fp);

 int databegin = getValue(map->bfOffBits,4); //得到数据块开始的偏移地址;

 //获取文件的长度;
 int datalength = 0;

 //首先将隐藏文件的长度读出来;
 byte temp[32];
 fseek(fp,databegin,SEEK_SET); //定位到数据块的起点;
 fread(temp,sizeof(char)*32,1,fp);
 for(int i = 0;i<31;i++)
 {
  datalength += (int)operate.bitAt(temp[i],1);
  datalength = datalength<<1;
 }
 datalength += (int)operate.bitAt(temp[31],1);
 //printf("\n\nDatalength = %d\n",datalength);

 int times = 0;
 byte ch[8];
 while(times//加上隐藏的文件长度信息;
 {
  fseek(fp,databegin+32+times*8,SEEK_SET);
  fread(ch,sizeof(byte),8,fp); //读出8个字节;
  //printf("\nch = %s\n",ch);
  data[times] = 0;
  for(int i = 0;i<7;i++)
  {
   data[times]+= (int)operate.bitAt(ch[i],1);
   data[times] = data[times]*2;
  }
  data[times]+= (int)operate.bitAt(ch[7],1);
  printf("%c",data[times]);
  times++;
 }
 fclose(fp);
}

2、BitOperate.cpp
/* 功能:把ch从右数的第position位设置为value;*/
byte BitOperate::bitSet(byte ch, short position, bool value)
{
 byte temp = ch;
 if(position>8||position<1)
 {
  cout<<"Out of Bound! Position must be a number between 1 --- 8 "<   return ch;
 }
 bool bit = bitAt(temp,position);
 if(bit^value)//如果不相同的话
 {
  if(bit == 0)
  {
   byte m = (byte)value;
   for(int i = 1;i     m = m<<1;
   ch+=m;
   return ch;
  }
  else
  {
   byte m = (byte)bit;
   for(int i = 1;i     m = m<<1;
   ch-=m;
   return ch;
  }
 }
 else return ch;
}
/* 功能:返回ch从右数第i位的值;*/
bool BitOperate::bitAt(byte ch, short position)
 byte temp = ch;
 if(position>8||position<1)
 {
  cout<<"Out of Bound! Position must be a number between 1 --- 8 "<   return false;
 }
 for(int j = 1;j   temp = temp>>1;
 if(temp%2==0)return 0;
 else return 1;
}

4. 程序运行
    我用MFC编写了一个实现上述算法的简单应用程序,使用方法十分简单。我们先准备好一幅24位的BMP格式图片,这一点要注意,不要误用了其他格式的图片。然后点击界面工具栏上那个“打开”按钮找到那幅准备好的BMP图片,该BMP图片会被加载到带有菜单和工具栏的程序主界面中,其功能一目了然。因为工具栏集成了该软件的主要功能,所以我们在加、解密文件时,只要使用工具栏就可以了。图7是一张没有嵌入隐藏信息的原始的图像,字节数215154字节。

图7 原始图像
    如果你想隐藏文件,只需点击工具栏上的“隐藏”按钮。文件加密完成后,就会出现一个“另存为”窗口,让你选择文件保存路径。别忘记将加密后的图片保存在自己指定的文件夹里。注意,在对文件进行加密时,如果你要加密的文件体积太大了,BMP图片承受不了,需要更换一幅体积更大的BMP图片。软件运行时的界面见图8所示。嵌入了一段文字的图片,图形效几乎没有改变,见图9。但字节书增大为286865B。

图8 信息隐藏程序运行截图

图9 隐藏了一段文字后的图像,你能分辨出与图7的不同吗?

    从图片中提取隐藏的信息也很方便,只要在运行程序,选择隐藏有文字信息的图片,然后点击“提取”按钮,可以将隐藏于图形的文字提取出来。效果见图8。

结论:
    1) 由于原始24位BMP图像文件隐藏信息后,其数据部分字节数值最多变化为1,该字节代表的像素最多只变化了1/256,所以,已隐藏信息的BMP图像与未隐藏信息的BMP图像,用肉眼是看不出差别的;
    2) 将信息直接嵌入像素RGB值的优点是嵌入信息的容量与所选取的掩护图像的大小成正比;
    3) 使用这种方法,一个大小为32 k的24位BMP图像文件,可以隐藏约32 k/8=4k的信息(忽略文件头不能隐藏数据的54个字节),该方法具有较高的信息隐藏率.

5. 软件下载演示
点击下载"信息隐藏"软件

6. 参考文献
1. 季梁. 数字图像处理. 清华大学自动化系,1998.
2. 林福宗. 图像文件格式--WINDOWS编程(上). 清华大学出版社,1996.
3. W.Bender, D.Gruhl, and N.Morimoto. Techniques for data hiding. Technical Report, MIT Media Lab, 1994.
4. R. G. Schyndel, A. Z. Tirkel, and C. F. Osborne. A digital watermark. In: Proceedings of IEEE International Conference of Image Processing, Austin, Texas. Nov. 1994,2:86~90.
5. Tutorial of JPEG 2000 Standard. URL: http://www.jpeg.org/JPEG2000.htm.
6. J. Ruanaidh, T. Pun. Rotation, scale and translation invaiant digital image watermarking. In: Proceedings of IEEE International Conference on Image Processing, 1997.
7. D. Kundur, D. Hatzinakos. Digital watermarking for telltale tamper proofing and authentication. In: Proceedings of the IEEE, Jul. 1999.
8. M. D. Swanson, M. Kobayashi, and A. H. Tewfik. Multimedia data-embedding and watermarking technologies. In: Proceedings of IEEE, Jun. 1998.

注:此文是我《计算机网络安全》课程学习时的课程设计论文。
 

中国科学技术大学继续教育学院 © 版权所有, 联系我们
School of Distance Learning and Continuing Education of USTC © Copyright 2006, All Rights Reserved