初识LSB信息隐藏算法
关于BMP图像的结构网上资料很多,这里不再骜述。
算法是将一个文件以二进制打开,将每一位存放到图片数据区的像素的每个字节的最低位。
以达到信息隐藏的目的。
1
//
---------------------------------------------
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
else
36
{
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
else
54
{
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
else
80
{
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
else
99
{
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
//
---------------------------------------------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
本文介绍了一种基于LSB(Least Significant Bit)的信息隐藏技术,该技术通过修改图像像素的最低有效位来隐藏数据,实现了数据的安全存储。文章详细展示了信息隐藏及提取的过程,并提供了具体的实现代码。
2万+

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



