2012-07-26 242 views
3

正在爲我正在進行的加密學習的自學課程進行作業(我沒有收到此課程的學分)。我需要在散列完成的大文件上逐塊計算散列值。目前我難以忍受的是如何將文件分解成這些塊?我正在使用python,我很新。將文件拆分爲塊

f = open('myfile', 'rb') 
BLOCK_SIZE = 1024 
m = Crypto.Hash.SHA256.new() 
thisHash = "" 
blocks = os.path.getsize('myfile')/BLOCK_SIZE #ignore partial last block for now 

for i in Range(blocks): 
    b = f.read(BLOCK_SIZE) 
    thisHash = m.update(b.encode()) 
    f.seek(block_size, os.SEEK_CUR) 

我是否正確接近?代碼似乎運行直到m.update(b.encode())行執行。我不知道我是否離開基地或做些什麼來完成這項工作。任何建議表示讚賞。謝謝!

(注:如你可能會注意到,這段代碼並沒有真正的時刻產生任何東西 - 我只是得到一些設立了腳手架的)

+0

block_size在哪裏定義? – ThirdOne 2012-07-26 05:20:01

回答

5

你必須做一些事情使這個例子正確工作。這裏有幾點:

  • Crypto.Hash.SHA256.SHA256Hash.update()(你調用它爲m.update())沒有返回值。爲了將可讀的哈希拉出對象,.update()它很多次,然後調用.hexdigest()
  • 在將它提供給.update()函數之前,您不需要對二進制數據進行編碼。只需傳遞包含數據塊的字符串即可。
  • 文件指針由file.read()提前。您不需要單獨的.seek()操作。
  • .read()將返回一個空字符串,如果你已經擊中了EOF。這很好。自由只要拉入該部分塊。
  • 變量名稱區分大小寫。 block_sizeBLOCK_SIZE不同。

進行這些小的調整,並假設你有所有正確的進口,你將走在正確的軌道上。

0

替代解決方案將首先打破了文件轉換成塊,然後塊

進行散列塊這將打破文件爲1024個字節的塊

with open(file,'rb') as f: 
    while True: 
     chunk = f.read(1024) 
     if chunk: 
      fList.append(chunk) 
     else: 
      numBlocks = len(fList) 
      break 

Note: last block size may be less than 1024 bytes

現在你可以根據你的需要做散列。