参加我正在参加密码学的自学课程的作业(我没有得到这门课程的学分)。我需要在大型文件上计算哈希值,其中哈希是逐块完成的。我现在难以理解的是如何将文件分解为这些块?我正在使用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 :(得分:5)
您必须做一些事情才能使此示例正常工作。以下是一些观点:
Crypto.Hash.SHA256.SHA256Hash.update()
(您将其作为m.update()
调用)没有返回值。要从对象中提取人类可读的哈希,.update()
多次,然后调用.hexdigest()
.update()
函数之前,您无需对其进行编码。只需传递包含数据块的字符串。file.read()
提前。您不需要单独的.seek()
操作。.read()
将返回一个空字符串。这完全没问题。请随意拉出那个部分区块。block_size
与BLOCK_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
现在你可以按照你想要的方式进行哈希。