初识LSB信息隐藏算法
关于BMP图像的结构网上资料很多,这里不再骜述。
算法是将一个文件以二进制打开,将每一位存放到图片数据区的像素的每个字节的最低位。
以达到信息隐藏的目的。
//
---------------------------------------------2
//
基于LSB的信息隐藏3
//
---------------------------------------------
4
int FTDib::LSBCoder(
const
char* textFileName)
5
{6
ifstream textFile;7
textFile.open(textFileName,ios::in | ios::binary);8
textFile.seekg(0,textFile.end);9
DWORD textFileLength = textFile.tellg();10
//判断位图是否够存储隐藏的信息11
DWORD colorTableSize = m_numberOfColors * sizeof(RGB_Element);12
if((size - colorTableSize)<textFileLength*8)13
{14
return -1; //不够隐藏15
}16

17

18
BYTE* pTextFile = new BYTE[textFileLength+1];19
cout<<"隐藏时文件长度:"<<textFileLength<<endl;20
textFile.seekg(0,textFile.beg);21
textFile.read((char*)pTextFile,textFileLength);22
textFile.close();23

24
BYTE textData;25
for(int i=0,k=0; i< textFileLength; ++i)26
{27
for(int j=0; j<8; ++j)28
{29
textData = pTextFile[i]>>j;30
textData = textData&0x01;31
if(textData==0)32
{33
pDib[k+32] = pDib[k+32]&0xfe;34
}35
else36
{37
pDib[k+32] = pDib[k+32]|0x01;38
}39
++k;40
}41
}42
cout<<"信息隐藏完毕"<<endl;43
//在前四个字节中写入text文件数据长度44
DWORD length;45
for(int i=0; i<32; ++i)46
{47
length = textFileLength>>i;48
length = length&0x00000001;49
if(length==0)50
{51
pDib[i] = pDib[i]&0x1e;52
}53
else54
{55
pDib[i] = pDib[i]|0x01;56
}57
}58

59
return 0;60

61
62
}
63
64
//
---------------------------------------------65
//
解码基于LSB的信息隐藏66
//
---------------------------------------------
67
void FTDib::LSBDecoder(
const
char* textFileName)
68
{69
DWORD length = 0x00000000;70
BYTE bit;71
//获取txt文件长度72
for(int i=0; i<32; ++i)73
{74
bit = pDib[i]&0x01;75
if(bit==0)76
{77
length = length&0x7fffffff;78
}79
else80
{81
length = length|0x80000000;82
}83
if (i<31) length = length>>1;84
}85

86
cout<<"解码时文件长度:"<<length<<endl;87
//开始解码88
BYTE* pTextFile = new BYTE[length];89
BYTE textData;90
for(int i=0,k=0; i<length*8; ++i)91
{92
if(i && i%8==0){++k;}93
textData = pDib[i+32]&0x01;94
if(textData==0)95
{96
pTextFile[k] = pTextFile[k]&0x7f;97
}98
else99
{100
pTextFile[k] = pTextFile[k]|0x80;101
}102
if (i%8 != 7) pTextFile[k] = pTextFile[k]>>1;103
}104

105
cout<<"解码完毕"<<endl;106

107
ofstream textFile;108
textFile.open(textFileName,ios::out | ios::binary);109
textFile.write((char*)pTextFile,length);110
textFile.close();111
delete pTextFile;112
}
113
411



被折叠的 条评论
为什么被折叠?



