python实现隐藏文件到24位位图

 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")

 

posted @ 2016-01-16 11:34  海林夕  阅读(79)  评论(0)    收藏  举报