web-dev-qa-db-ja.com

ECDSA署名を偽造することは可能ですか?

最近、ビットコインの署名を変更してメッセージと署名のペアを生成するのは簡単だと主張するredditの投稿に遭遇しました。

https://www.reddit.com/r/btc/comments/9xpivk/satoshi_i_do_not_want_to_be_public_but_there_is/e9u4m5

POC Gistさえあります

https://Gist.github.com/chjj/4fe8f5b2b489e89e6ed4

私は通常のソフトウェア開発者であり、私よりも複雑なものは私より賢い人に任せていますが、自分が何に自信があるかを知る必要があります。

私がパブリックブロックチェーントランザクションを備えた通常のキーと、かなり類似したデータの多く(100の?1000の?)の利用可能な署名を扱っていると仮定します。

1)署名されたメッセージから新しいメッセージを生成することは可能ですか?たとえば、「12.50ドルを支払う」というメッセージがある場合、「1250ドルを支払う」に変更できますか?リンクの投稿は、任意のデータに署名することは不可能であると主張していますが、それが真実である場合、私は議論されているメッセージに署名することがどのように可能であるか理解していません。

2)偽造されたsigを常に非合法であると識別する特徴はありますか?コメントは0のモジュロが必要であることを示唆していますが、自尊心のある暗号ライブラリがこれをチェックすることを期待するのは妥当ですか?

3)暗号化を効果的に使用するには、暗号化の背後にある数学を学ぶ必要がありますか?何かを使用する方法を知ることで十分であり、それがどのように機能するかを知ることは素晴らしいですが、必要ではない多くの分野があります(実際の数学を学ぶ傾向がほとんどなく、10年間Quaternionsをかなり効果的に使用してきました)。

4)(1&2)メッセージの長さと複雑さは、偽造のしやすさに関係していますか?つまり、メッセージ「12.50ドル」は、「12.50ドルを支払うことを約束します」を「9995ドルから受け取る」よりも「9,500円」に変更する方が簡単です。セキュリティの観点から、多くの短い(ただし一意の)メッセージに署名することの弱点はありますか?長さがより長くてもエントロピーが同じである場合、それは何かを変更しますか(つまり、文字を追加するとCPU時間以外の何かが追加されますか?)

3の答えが「はい」の場合、実装の詳細を知らないと重大なミスを引き起こす可能性がある例を含めてください。

3
FrozenKiwi

そのredditスレッドのコメントは実際にかなりよく説明しています。

ある意味では、「ECDSA署名を偽造する」ことは可能であると言えるかもしれませんが、それは全体の話ではありません。

メッセージ、メッセージのハッシュ、およびそのハッシュの署名の3つがあります。投稿をredditしたツイートでは、ハッシュに署名が投稿されましたが、元のメッセージは明らかにされませんでした。これは簡単です。ハッシュと有効な署名が与えられた場合、ハッシュと署名の両方を調整して新しい「有効な」ペアを作成できます。しかし、この時点では、そのハッシュは賢明なメッセージには対応していません。偽造者がメッセージをブルートフォースでハッシュに対応させることができたとしても(ハッシュスキームが安全である場合、私たちが知る限りそれは不可能です)、賢明なテキストである可能性はほとんどありません。だからあなたの質問に答えるには:

  1. これは不可能です。可能であれば、署名は完全に壊れて役に立たなくなります。

  2. 暗号ライブラリはこれをチェックできません。ハッシュと署名とキーだけを指定すると、署名がそのキーとハッシュに対して有効であることを確認できます。ただし、 hashは実際には署名されているテキストの有効なハッシュです

  3. はい、暗号化を効果的に使用するには、暗号化の背後にある数学を知る必要があります。暗号は本当に難しいであり、数学を知っている暗号学者にとっても同様です。有効なスキームとそれらのスキーム(つまりソフトウェア)の実装は、実際の使用と専門家によるテスト/研究への長期的な暴露によってのみ生成されます。この分野での有名なモットーは「自分の暗号をロールバックしないでください」です。真剣に、あなたは暗号ライブラリをいじくることができますが、それを学習/趣味以外の何かのために決して使用しないでください。

有名な例は教科書RSAです。暗号化の教科書でRSAについて読んでいるときにRSAを実装すると、そのスキームは深刻な脆弱性を抱えることになります。 1つの理由は、それが確定的スキームであること、つまり、同じメッセージが常に同じ暗号文に暗号化されることです。おそらく、それが悪いことである理由を理解できるでしょう。 RSAを安全にするには、パディング方式も必要です。

  1. 多くの小さいメッセージまたは長いメッセージに多くの署名を生成しても問題はありません。
3