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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113
