VC++信息安全编程(9)基于24位bmp位图的信息隐藏
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是透明的。
传统的信息隐藏起源于古老的隐写术。如在古希腊战争中,为了安全地传送军事情报,奴隶主剃光奴隶 的头发,将情报文在奴隶的头皮上,待头发长起后再派出去传送消息。我国古代也早有以藏头诗、藏尾诗、漏格诗以及绘画等形式,将要表达的意思和“密语”隐藏在诗文或画卷中的特定位置,一般人只注意诗或画的表面意境,而不会去注意或破解隐藏其中的密语。 信息隐藏的发展历史可以一直追溯到"匿形术(Steganography)"的使用。"匿形术"一词来源于古希腊文中"隐藏的"和"图形"两个词语的组合。虽然"匿形术"与"密码术(Cryptography)"都是致力于信息的保密技术,但是,两者的设计思想却完全不同。"密码术"主要通过设计加密技术,使保密信息不可读,但是对于非授权者来讲,虽然他无法获知保密信息的具体内容,却能意识到保密信息的存在。而"匿形术"则致力于通过设计精妙的方法,使得非授权者根本无从得知保密信息的存在与否。相对于现代密码学来讲,信息隐藏的最大优势在于它并不限制对主信号的存取和访问,而是致力于签字信号的安全保密性。
我们进行信息交换的时候,需要保证数据的安全,所以需要进行适当的信息隐藏。
我们发送一个图片。但是图片里面隐含的加密信息,是就是信息隐藏,只有专属工具能够读出。
所以信息隐藏技术很重要。针对信息安全。
我们来实现一个案例代码。
BMP图信息隐藏头文件,请见代码分析
// BMPHider.h: inte易做图ce 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
{
&nb
补充:综合编程 , 安全编程 ,
- 更多VC++疑问解答:
- VC++ 算法。
- MFC CListCtrl获取列数出错了,怎么回事?
- 谁有VC++6.0企业版中文版的下载地址
- vc++,关于TextOut的一个小问题
- 定义一个三维的CStringArray//一定要使用CArray模板?那操作的时候,使用那个类的函数对数组进行操作呢?
- 关于mfc消息映射的问题
- MFC中用TextOut输出的问题
- 请问如何在VC6.0里MFC下对万年历进行编程
- iArray.Add(iValue);//Add函数的参数不可以用CArray模板???
- 'USES_CONVERSION' : undeclared identifier;'A2W' : undeclared identifier
- vc6.0能不能用CImage,能的话给个例子,以及atlimage.h,
- VC 对话框 标题栏 怎么变成这个样子????如图!
- spin控件的UDN_DELTAPOS消息//下面代码什么作用? [
- VC修改DNF
- vc 套接字 struct