3

背景: Python スクリプトと Java Web アプリケーションから計算する必要がある反復ハッシュ アルゴリズムがあります。

疑似コード:

hash = sha256(raw)
for x=1 to 64000 hash = sha256(hash)

ここで、hash は長さ 32 のバイト配列であり、長さ 64 の 16 進文字列ではありません。

バイト単位で保持したい理由は、Python は各反復の間に 16 進文字列に変換して処理時間を 1 秒未満に抑えることができますが、Java では文字列のオーバーヘッドに 3 秒かかるためです。

したがって、Java コードは次のようになります。

// hash one time...
byte[] result = sha256(raw.getBytes("UTF-8"));

// then hash 64k-1 more times
for (int x = 0; x < 64000-1; x++) {
  result = sha256(result);
}

// hex encode and print result
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
for (int i=0; i<buf.length; i++) {
  formatter.format("%02x", buf[i]);
}
System.out.println(sb.toString());

Python コードは次のようになります。

import hashlib

# hash 1 time...
hasher = hashlib.sha256()
hasher.update(raw)
digest = hasher.digest()

# then hash 64k-1 times
for x in range (0, 64000-1):
  # expect digest is bytes and not hex string
  hasher.update(digest) 
  digest = hasher.digest()
print digest.encode("hex")

Python の結果は、生のダイジェスト バイトではなく、最初のダイジェスト (文字列) の 16 進表現でハッシュを計算しました。そのため、さまざまな出力が得られます。

4

1 に答える 1

5

hasher のメソッド .update は、前のテキストに引数を追加します ( Python docs )。代わりに、ダイジェストを計算するたびに新しいハッシュを作成する必要があります。

import hashlib

# hash 1 time...
digest = hashlib.sha256(raw).digest()

# then hash 64k-1 times
for x in range(0, 64000-1):
  digest = hashlib.sha256(digest).digest()
print digest.encode("hex")
于 2012-04-19T19:24:46.640 に答える