将文件分成块

时间:2012-07-26 05:15:09

标签: python sha256

参加我正在参加密码学的自学课程的作业(我没有得到这门课程的学分)。我需要在大型文件上计算哈希值,其中哈希是逐块完成的。我现在难以理解的是如何将文件分解为这些块?我正在使用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())行执行。我不知道我是否会离开基地或做些什么来完成这项工作。任何建议表示赞赏。谢谢!

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

2 个答案:

答案 0 :(得分:5)

您必须做一些事情才能使此示例正常工作。以下是一些观点:

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

进行这些微小的调整,并假设您拥有所有正确的进口产品,您将走上正确的道路。

答案 1 :(得分: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

现在你可以按照你想要的方式进行哈希。