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

別の解決策は、最初にファイルをブロックに分割してから、ブロックごとにハッシュを実行することです

これにより、ファイルが 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

これで、好きな方法でハッシュを実行できます。

于 2014-02-12T18:20:46.190 に答える