コインの窃盗
Red、先に非公開で教えてくれてありがとう!投稿してくれ(そして皆のサスペンスを解消してくれ!)
彼のポイントは、ビットコインアドレスに支払われたトランザクションはハッシュ関数と同程度の安全性しかないということだ。ビットコインアドレスを短くするために、公開鍵そのものではなく公開鍵のハッシュになっている。攻撃者はECDSAではなくハッシュ関数を破るだけで済む。
Quote from: knightmb on July 25, 2010, 07:44:02 PM公開鍵123456がハッシュABCDを生成し、 かつ 公開鍵654321もハッシュABCDを生成するとわかったとしても、 秘密鍵は依然としてわからない。
しかしあなたの言うことでは、公開鍵654321さえあれば、公開鍵123456のふりをしてコインを使えるということですね。 それでも公開鍵654321で署名する必要がある。秘密鍵を知っている公開鍵を使って衝突を見つける必要がある。
ビットコインアドレスのトランザクションを要求する際、ハッシュに一致する公開鍵を提示し、その鍵で署名する必要がある。
Redのポイントは、安全でない公開鍵を素早く大量に生成することは簡単で、衝突を見つけた後にそれを破って秘密鍵を見つけることができるということだ。
彼は、公開鍵が安全なものである必要がある場合、つまり素数を見つけるために相当な作業が必要なものである場合、ハッシュ関数単独よりも強度が増すと指摘している。ブルートフォースを試みる人は、各試行ごとに鍵を生成するのに時間をかける必要がある。
引用「SHA-1の衝突を2^52回の暗号操作で見つけられると主張する論文があります。最適に安全なハッシュでは2^80回の操作が必要です。2^52回の時間はまだ大きいですが、クラスターやボットネットの範囲に入ってきています。」 2^80は誕生日攻撃を使える場合だ。この場合は誕生日攻撃を使えないため、難易度は完全な2^160ビットだ。ただし、100万件(2^20件)のトランザクションのうちどれか1つを破ろうとしている場合、部分的な誕生日攻撃で2^160/2^20 = 2^140にできる。
ビットコインアドレスは160ビットハッシュが使用される唯一の場所だ。その他すべてはSHA-256だ。計算方法は以下の通りだ:
bitcoinaddress = RIPEMD-160(SHA-256(publickey))
間違っていたら訂正してほしい(喜んで謝るので)が、この場合RIPEMD-160に対する解析的攻撃を使うのは難しいと思う。解析的攻撃は、衝突を見つける確率を大幅に高める特定の範囲やパターンの入力を試すように規定している。ここでは、RIPEMD-160への入力はSHA-256の出力であるため、そのような制御ができない。解析的攻撃によってRIPEMD-160の衝突を生み出す入力を見つけたとして、それで何をするのか?SHA-256にその値を出力させる必要があるため、SHA-256も破る必要がある。
ブルートフォースの場合、RIPEMD-160(SHA-256(x))はRIPEMD-160単独と比べて強くはない。しかし解析的攻撃の場合、RIPEMD-160とSHA-256の両方を解析的に攻撃する必要があるようだ。もし間違っていれば、強度はRIPEMD-160と同じであり、SHA-256は1回分の鍵強化として機能するだけだ。