週休七日

趣味のこととか、技術のこととか、読書感想文とか

BitcoinがDouble Hashを利用している真意を突き止められない

TL;DR

Preimage attack対策ではない(はず)
length extension attack対策ではない(はず)
サトシ・ナカモトは心配性?

Bitcoin

f:id:luca3104:20180331215952p:plain ビットコインはもはや誰でも知っている存在になりましたね。
そんな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の対策だとしています。

bitmessage.org

crypto.stackexchange.com

length extension attackは以下のようなものです。
不明な値Unknownとメッセージmによるハッシュ値H(Unknown||m)Unknownの長さが分かると、mに適当な文字列を追加した文字列m||m2について、Unknownを知ることなくH(Unknown||m||m2)を求めることができる攻撃

参考:CTF/Toolkit/HashPump - 電気通信大学MMA

しかし、これが目的であることが考えづらいです。
認証に対する対策であればわかりますが、nonceを求めるのがマイニングなので特に関係ないように見られます。

ちなみにこの攻撃は、下記のツールで試すことができます。

github.com

結局何なのか

検索しているうちに以下の本を見つけました

books.google.co.jp

この部分に書かれている、

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はこの攻撃が無効なようです。

Keccak Team

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を利用しています。

結論

備えあれば憂いなしって感じでしょうか。
もうちょっと探ってみたいと思います🙇