初识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 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