BitcoinがDouble Hashを利用している真意を突き止められない
TL;DR
Preimage attack対策ではない(はず)
length extension attack対策ではない(はず)
サトシ・ナカモトは心配性?
Bitcoin
ビットコインはもはや誰でも知っている存在になりましたね。
そんなBitcoinは全世界のマイナー達によるPoWによって成り立っています。
Double Hash
PoWのhash値計算のときに必要なhash関数はDouble Hashと呼ばれているSHA256dです。
SHA256の関数を2度呼んでいます。
SHA256(SHA256(m))
ここで疑問に思ったのが、なぜBitcoinでDouble Hashを利用する必要があるのか。ということです。
色々調べてみたのでここに書いていこうと思います。
Preimage attackの対策
これはないと思います。
Preimage attackは、hash(m) = hとなるようなメッセージmを求める攻撃方法です。
マイニングはそもそも、hash(hash(m))のメッセージmを求めるものなので・・・
length extension attackの対策
色々なところでこの件について議論されていますが、ほとんどの結論はlenght extension attackの対策だとしています。
length extension attackは以下のようなものです。
不明な値Unknownとメッセージmによるハッシュ値H(Unknown||m)とUnknownの長さが分かると、mに適当な文字列を追加した文字列m||m2について、Unknownを知ることなくH(Unknown||m||m2)を求めることができる攻撃
参考:CTF/Toolkit/HashPump - 電気通信大学MMA
しかし、これが目的であることが考えづらいです。
認証に対する対策であればわかりますが、nonceを求めるのがマイニングなので特に関係ないように見られます。
ちなみにこの攻撃は、下記のツールで試すことができます。
結局何なのか
検索しているうちに以下の本を見つけました
この部分に書かれている、
I don't think Bitcoin ever uses hashes in a way that would suffer from length extensions, but I guess Satoshi went with the safe choice of preventing in everywhere.
サトシ・ナカモトは全ての場所の予防で安全を選択した。
🤔🤔🤔
そういうことなのか・・・
とにかく理由はなさそうです。
Merkle-Damgård construction
余談ですが先程のlength extension attackはMerkle-Damgård constructionで構築されているhash関数すべてで可能です。
違う構造で作られているSHA-3はこの攻撃が無効なようです。
Unlike SHA-1 and SHA-2, Keccak does not have the length-extension weakness, hence does not need the HMAC nested construction. Instead, MAC computation can be performed by simply prepending the message with the key.
EthereumやNEMではSHA-3を利用しています。
結論
備えあれば憂いなしって感じでしょうか。
もうちょっと探ってみたいと思います🙇