正在为我正在进行密码学的自学课程工作(我没有得到这门课程的学分).我需要在大型文件上计算哈希值,其中哈希是逐块完成的.我现在难以理解的是如何将文件分解为这些块?我正在使用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())行.我不知道我是否会离开基地或做些什么来完成这项工作.任何建议表示赞赏.谢谢!
(注意:你可能会注意到,这段代码目前并没有真正产生任何东西 – 我只是设置了一些脚手架)
解决方法:
您必须做一些事情才能使此示例正常工作.以下是一些观点:
> Crypto.Hash.SHA256.SHA256Hash.update()(您将其作为m.update()调用)没有返回值.要从对象中提取一个人类可读的哈希,.update()多次,然后调用.hexdigest()
>在将二进制数据提供给.update()函数之前,您不需要对其进行编码.只需传递包含数据块的字符串.
>文件指针由file.read()提前.您不需要单独的.seek()操作.
如果你已经击中了EOF,> .read()将返回一个空字符串.这完全没问题.随意拉入那个局部块.
>变量名称区分大小写. block_size与BLOCK_SIZE不是同一个变量.
进行这些微小的调整,并假设您拥有所有正确的进口,您将走上正确的轨道.