一个信息隐藏的程序有异常`请求帮忙调试
一个信息隐藏的程序有错误`请求帮忙调试
首先,将隐蔽载体文件(位图文件)装载进一个缓冲区pbmfh中,将所要隐藏的信息文件以二进制读方式也装载进一个缓冲区buffer中。
其次,在嵌入信息时,将buffer中一个字节(8bit)的信息存入pbmfh中的8个字节中,并且保证这8个字节中的每个字节对2取模后与buffer中当前字节对应的位(8个字节对应8bit即对应一个字节)相同。具体实现是:将所要隐藏的文件的大小写入pbmfh缓冲区的0X0006地址处(以便提取信息时使用),从0X019A地址处开始读取位图文件的数据信息,如果pbmfh中的0X019A地址处的内容对2取模后与当前buffer中的内容的最高位不相同并且当前buffer中的内容也为0,则将pbmfh中的0X019A地址处的内容减1,否则pbmfh中的0X019A地址处的内容不变,接着从pbmfh中读取下一个字节,将该字节内容与当前buffer中的内容的次高位做上述判断,连续读取8个字节后,将指向buffer缓冲区的指针加1,将所要隐藏的文件的大小length减1,重复上述过程,直到length为0时嵌入信息过程完成。然后保存嵌入了信息后的位图文件。
最后,在提取信息时,把嵌有机密信息的位图文件装载进缓冲区pbmfh中,从pbmfh缓冲区的0X0006地址处读取隐藏了信息的文件的大小并存入length中,从0X0008地址处读取隐藏了信息的文件的格式,从该缓冲区中一次读取8个字节,将这8个字节对2取模后,乘以各自的权(即128,64,32,16,8,4,2,1)后相加,得到原始文件中的一个字节并存入DEbuffer缓冲区中,将指向DEbuffer缓冲区的指针加1,将length的大小减1,重复上述过程,直到length为0时提取信息过程完成。最后将DEbuffer 缓冲区的内容以二进制方式写入文件中,
注:编译前操作一下:工程-》设置-》c/c++-> 分类选code generation-> multithreaded 不然会出错`
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <afx.h>
bool HideInformation() //隐藏信息
{
FILE *fp1,*fp2;
struct stat ST1,ST2;
stat( "c:\\1.BMP ", &ST1);
stat( "c:\\2.txt ", &ST2);
fp1=fopen( "c:\\1.BMP ", "rb ");
if(fp1==NULL){
printf( "open file of carrier is false! \n ");
return false;
}
BYTE *pbmfh = new BYTE[ST1.st_size];
fread(pbmfh, 1, ST1.st_size, fp1);
fp2=fopen( "c:\\2.txt ", "rb ");
if(fp2==NULL){
printf( "open file of information is false! \n ");
return false;
}
BYTE *buffer = new BYTE [ST2.st_size];
fread(buffer, 1, ST2.st_size, fp2);
unsigned int OpAND[8]={128,64,32,16,8,4,2,1}; //按位与&操作
char tempbuffer=0;
int i;
unsigned int length=ST2.st_size;
if(length==0) //空文件
return FALSE;
BYTE* data=pbmfh+0x0006;
//隐藏length
BYTE *pl=(BYTE *)(&length);
for( int j= 0; j < sizeof(int); j++)
{
for(i=0;i <8;i++)
{
if((tempbuffer=(*pl)&OpAND[i])==0) //为0
{
if(abs(*data)%2!=0 && *data!=0)
*data=*data-1; //保证原位图信息取模后为0
else if(*data==0)
*data=*data; //不变
}
else //为1
{
if(*data%2!=1 && *data!=0)
*data=*data-1; //保证原位图信息取模后为1
else if(*data==0)
*data=*data+1; //对原数据为0 的处理,保证原位图信息取模后为1
}
data=data+1;
}
++pl;
}
/////////////////////////////////////////////
data=pbmfh+0x019A;
while(length!=0) //嵌入信息过程
{
for(i=0;i <8;i++)
{
if((tempbuffer=(*buffer)&OpAND[i])==0) //为0
{
if(abs(*data)%2!=0 && *data!=0)
*data=*data-1; //保证原位图信息取模后为0
else if(*data==0)
*data=*data; //不变
}
else //为1
{
if(*data%2!=1 && *data!=0)
*data=*data-1; //保证原位图信息取模后为1
else if(*data==0)
*data=*data+1; //对原数据为0 的处理,保证原位图信息取模后为1
}
data=data+1;
首先,将隐蔽载体文件(位图文件)装载进一个缓冲区pbmfh中,将所要隐藏的信息文件以二进制读方式也装载进一个缓冲区buffer中。
其次,在嵌入信息时,将buffer中一个字节(8bit)的信息存入pbmfh中的8个字节中,并且保证这8个字节中的每个字节对2取模后与buffer中当前字节对应的位(8个字节对应8bit即对应一个字节)相同。具体实现是:将所要隐藏的文件的大小写入pbmfh缓冲区的0X0006地址处(以便提取信息时使用),从0X019A地址处开始读取位图文件的数据信息,如果pbmfh中的0X019A地址处的内容对2取模后与当前buffer中的内容的最高位不相同并且当前buffer中的内容也为0,则将pbmfh中的0X019A地址处的内容减1,否则pbmfh中的0X019A地址处的内容不变,接着从pbmfh中读取下一个字节,将该字节内容与当前buffer中的内容的次高位做上述判断,连续读取8个字节后,将指向buffer缓冲区的指针加1,将所要隐藏的文件的大小length减1,重复上述过程,直到length为0时嵌入信息过程完成。然后保存嵌入了信息后的位图文件。
最后,在提取信息时,把嵌有机密信息的位图文件装载进缓冲区pbmfh中,从pbmfh缓冲区的0X0006地址处读取隐藏了信息的文件的大小并存入length中,从0X0008地址处读取隐藏了信息的文件的格式,从该缓冲区中一次读取8个字节,将这8个字节对2取模后,乘以各自的权(即128,64,32,16,8,4,2,1)后相加,得到原始文件中的一个字节并存入DEbuffer缓冲区中,将指向DEbuffer缓冲区的指针加1,将length的大小减1,重复上述过程,直到length为0时提取信息过程完成。最后将DEbuffer 缓冲区的内容以二进制方式写入文件中,
注:编译前操作一下:工程-》设置-》c/c++-> 分类选code generation-> multithreaded 不然会出错`
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <afx.h>
bool HideInformation() //隐藏信息
{
FILE *fp1,*fp2;
struct stat ST1,ST2;
stat( "c:\\1.BMP ", &ST1);
stat( "c:\\2.txt ", &ST2);
fp1=fopen( "c:\\1.BMP ", "rb ");
if(fp1==NULL){
printf( "open file of carrier is false! \n ");
return false;
}
BYTE *pbmfh = new BYTE[ST1.st_size];
fread(pbmfh, 1, ST1.st_size, fp1);
fp2=fopen( "c:\\2.txt ", "rb ");
if(fp2==NULL){
printf( "open file of information is false! \n ");
return false;
}
BYTE *buffer = new BYTE [ST2.st_size];
fread(buffer, 1, ST2.st_size, fp2);
unsigned int OpAND[8]={128,64,32,16,8,4,2,1}; //按位与&操作
char tempbuffer=0;
int i;
unsigned int length=ST2.st_size;
if(length==0) //空文件
return FALSE;
BYTE* data=pbmfh+0x0006;
//隐藏length
BYTE *pl=(BYTE *)(&length);
for( int j= 0; j < sizeof(int); j++)
{
for(i=0;i <8;i++)
{
if((tempbuffer=(*pl)&OpAND[i])==0) //为0
{
if(abs(*data)%2!=0 && *data!=0)
*data=*data-1; //保证原位图信息取模后为0
else if(*data==0)
*data=*data; //不变
}
else //为1
{
if(*data%2!=1 && *data!=0)
*data=*data-1; //保证原位图信息取模后为1
else if(*data==0)
*data=*data+1; //对原数据为0 的处理,保证原位图信息取模后为1
}
data=data+1;
}
++pl;
}
/////////////////////////////////////////////
data=pbmfh+0x019A;
while(length!=0) //嵌入信息过程
{
for(i=0;i <8;i++)
{
if((tempbuffer=(*buffer)&OpAND[i])==0) //为0
{
if(abs(*data)%2!=0 && *data!=0)
*data=*data-1; //保证原位图信息取模后为0
else if(*data==0)
*data=*data; //不变
}
else //为1
{
if(*data%2!=1 && *data!=0)
*data=*data-1; //保证原位图信息取模后为1
else if(*data==0)
*data=*data+1; //对原数据为0 的处理,保证原位图信息取模后为1
}
data=data+1;