1 #-*-coding:utf-8-*-
2
3 #该脚本实现将文件隐藏到一张24位位图里面
4
5 import urllib
6
7 def _getFileSize(fileHandle):
8 fileHandle.seek(0, 2)
9 size = fileHandle.tell()
10 fileHandle.seek(0,0)
11 return size
12
13 def _sizeToSixLetters(size):
14 sizeString = str(size)
15 length = len(sizeString)
16 return '0' * (6 - length) + sizeString
17
18 def _writeTo(img, nf, threeCharacter):
19 nf.write(threeCharacter)
20 img.read(3)
21 nf.write(img.read(3))
22
23 def hide(img, secretFile):
24 newImg = img.split(".")[0] + "_hide.bmp"
25 with open(img, "rb") as img, open(secretFile, "r") as f, open(newImg, "wb") as nf:
26 imgSize = _getFileSize(img)
27 fSize = _getFileSize(f)
28 # print fSize
29 residue = fSize % 3
30 formatSize = fSize - residue
31 #image head info write to new image and pointer move to the first pixel
32 nf.write(img.read(54))
33 #transfer secret file size to six digital characters
34 #and write them to new image
35 fSizeString = _sizeToSixLetters(fSize)
36 _writeTo(img, nf, fSizeString[:3])
37 _writeTo(img, nf, fSizeString[3:])
38 #write the secret file content to new image
39 while (f.tell() < formatSize) and (img.tell() < imgSize):
40 tmp = f.read(3)
41 _writeTo(img, nf, tmp)
42 nf.write(f.read(residue))
43 img.read(residue)
44 nf.write(img.read())
45
46 def _getSecretFileSizeFromImage(img):
47 s = img.read(12)
48 size = int((s[:3] + s[6:9]).strip('0'))
49 return size
50
51 def recovery(img):
52 with open(img, "rb") as img:
53 img.read(54)
54 size = _getSecretFileSizeFromImage(img)
55 # print size
56 result = ''
57 for i in range(size):
58 result += img.read(1)
59 if not (i+1)%3 :
60 img.read(3)
61 print urllib.unquote(str(result)).decode('utf8')
62
63 if __name__ == "__main__":
64 basePath = ""
65 hide(basePath+"24bit.bmp", basePath + "test.txt")
66 recovery(basePath + "24bit_hide.bmp")