信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是透明的。
传统的信息隐藏起源于古老的隐写术。如在古希腊战争中,为了安全地传送军事情报,奴隶主剃光奴隶 的头发,将情报文在奴隶的头皮上,待头发长起后再派出去传送消息。我国古代也早有以藏头诗、藏尾诗、漏格诗以及绘画等形式,将要表达的意思和“密语”隐藏在诗文或画卷中的特定位置,一般人只注意诗或画的表面意境,而不会去注意或破解隐藏其中的密语。 信息隐藏的发展历史可以一直追溯到"匿形术(Steganography)"的使用。"匿形术"一词来源于古希腊文中"隐藏的"和"图形"两个词语的组合。虽然"匿形术"与"密码术(Cryptography)"都是致力于信息的保密技术,但是,两者的设计思想却完全不同。"密码术"主要通过设计加密技术,使保密信息不可读,但是对于非授权者来讲,虽然他无法获知保密信息的具体内容,却能意识到保密信息的存在。而"匿形术"则致力于通过设计精妙的方法,使得非授权者根本无从得知保密信息的存在与否。相对于现代密码学来讲,信息隐藏的最大优势在于它并不限制对主信号的存取和访问,而是致力于签字信号的安全保密性。
我们进行信息交换的时候,需要保证数据的安全,所以需要进行适当的信息隐藏。
我们发送一个图片。但是图片里面隐含的加密信息,是就是信息隐藏,只有专属工具能够读出。
所以信息隐藏技术很重要。针对信息安全。
我们来实现一个案例代码。
BMP图信息隐藏头文件,请见代码分析
// BMPHider.h: interface for the CBMPHider class.
//
//
#if !defined(AFX_BMPHIDER_H__6287D87F_F0AA_4D0C_9502_4674B639CBB5__INCLUDED_)
#define AFX_BMPHIDER_H__6287D87F_F0AA_4D0C_9502_4674B639CBB5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <complex>
using namespace std;
class CBMPHider
{
public:
CBMPHider();
virtual ~CBMPHider();
public:
int m_BitCount; //位图的图像位数
WORD * m_pWordData;
CPalette m_Palette;
unsigned char *m_pDib, *m_pDibBits;
unsigned char *m_pOldDibShow;
DWORD m_dwDibSize;
BITMAPINFOHEADER *m_pBIH;
RGBQUAD *m_pPalette;
int m_nPaletteEntries;
UINT bitmap_size;
UINT embfile_size;
unsigned char *p; //指向宿主图像数据
int tag; //此tag用以标记打开的图像中是否含有隐藏信息0:无 else:有
unsigned char *q; //指向隐藏文件数据
unsigned char *m_pFile;
public:
BOOL Draw( CDC *pDC, int nX = -1, int nY = -1, int nWidth = -1, int nHeight = -1, int Style = 1);
BOOL Save( const char *pszFilename );
BOOL Load( const char * );
void BackUpDib(); //备份图像
void Pick(); //提取图像
void Embed(); //嵌入图像
BOOL LoadEmbFile(const char *);
BOOL DrawContrast(CDC *pDC,int rect_width, int rect_height);
void SavePicked( const char *pszFilename );
};
#endif // !defined(AFX_BMPHIDER_H__6287D87F_F0AA_4D0C_9502_4674B639CBB5__INCLUDED_)
请见详细代码实现
#include "stdafx.h"
#include "BMPHider.h"
//
// Construction/Destruction
//
CBMPHider::CBMPHider()
{
m_pDib = NULL;
m_pWordData = NULL;
m_pFile = NULL;
m_pOldDibShow = NULL;
}
CBMPHider::~CBMPHider()
{
if( m_pDib != NULL )
delete [] m_pDib;
if( m_pWordData != NULL )
delete [] m_pWordData;
if (m_pFile != NULL)
delete [] m_pFile;
if (m_pOldDibShow != NULL)
delete [] m_pOldDibShow;
}
BOOL CBMPHider::Load( const char *pszFilename )
{
CFile cf;
if( !cf.Open( pszFilename, CFile::modeRead ) )
return( FALSE );
DWORD dwDibSize;
dwDibSize =
cf.GetLength() - sizeof( BITMAPFILEHEADER );
unsigned char *pDib;
pDib = new unsigned char [dwDibSize];
if( pDib == NULL )
return( FALSE );
BITMAPFILEHEADER BFH;
try
{
if( cf.Read( &BFH, sizeof( BITMAPFILEHEADER ) )
!= sizeof( BITMAPFILEHEADER ) ||
BFH.bfType != 'MB' ||
cf.Read( pDib, dwDibSize ) != dwDibSize )
{
delete []