当前位置:编程学习 > VC++ >>

VC++信息安全编程(9)基于24位bmp位图的信息隐藏

 


 

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是透明的。

 

传统的信息隐藏起源于古老的隐写术。如在古希腊战争中,为了安全地传送军事情报,奴隶主剃光奴隶 的头发,将情报文在奴隶的头皮上,待头发长起后再派出去传送消息。我国古代也早有以藏头诗、藏尾诗、漏格诗以及绘画等形式,将要表达的意思和“密语”隐藏在诗文或画卷中的特定位置,一般人只注意诗或画的表面意境,而不会去注意或破解隐藏其中的密语。   信息隐藏的发展历史可以一直追溯到"匿形术(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

       {

    &nb

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,