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())行执行为止。我不知道我是否离基地很远,或者该怎么做才能完成这项工作。任何建议表示赞赏。谢谢!

(注意:正如您可能注意到的那样,这段代码目前并没有真正产生任何东西——我只是设置了一些脚手架)

4

2 回答 2

5

您必须做一些事情才能使此示例正常工作。这里有几点:

  • Crypto.Hash.SHA256.SHA256Hash.update()(你调用它m.update())没有返回值。要从对象中提取人类可读的散列,.update()它会多次调用,然后调用.hexdigest()
  • .update()在将二进制数据提供给函数之前,您不需要对其进行编码。只需传递包含数据块的字符串。
  • 文件指针前移file.read(). 您不需要单独的.seek()操作。
  • .read()如果您已经点击 EOF,将返回一个空字符串。这完全没问题。随意拉入那个部分块。
  • 变量名区分大小写。block_size不是同一个变量BLOCK_SIZE

进行这些小的调整,并假设您拥有所有正确的导入,您将走在正确的轨道上。

于 2012-07-26T05:47:30.307 回答
0

替代解决方案是先将文件分成块,然后逐块执行散列

This will break the file into chunks of 1024 bytes

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

Now you can do the hash in whichever you want to.

于 2014-02-12T18:20:46.190 回答