web-dev-qa-db-ja.com

ドキュメント全体をRSA暗号化しないのはなぜですか?

私は最近、人Bが人Aから送信されたドキュメントが確かに人Aからのものであることを確認する方法を学びました。

  1. 人物Aは、人物Bに公開RSAキーを与えます。これは確実に行う必要があります。
  2. 人物AはSHA1を使用して、ドキュメントを160ビットのハッシュにハッシュします。
  3. 人物Aは自分の秘密RSAキーを使用して、ドキュメントの160ビットSHA1ハッシュに署名します。
  4. ユーザーAは、RSA署名付きSHA1ハッシュとドキュメントの両方をユーザーBに送信します。
  5. 人物Bは、人物Aの公開RSAキーを使用してハッシュを検証します。
  6. 人物BがSHA1を生成して、人物Aが送信したドキュメントを比較します。
  7. 2つのSHA1ハッシュが一致する場合、ドキュメントは実際に人物Aのものです。

このプロセスは信頼できるようですが、私にとっても面倒です。なぜ、人物Aが自分のRSA秘密鍵でドキュメントを直接暗号化して、それを人物Bに送信できないのですか。代わりに、ドキュメントのハッシュを暗号化して、ドキュメントと一緒に送信するのはなぜですか。

15
David Faux

複数の理由があります。

1)実際には、RSAアルゴリズムは低速です。 たとえば

比較すると、DES(セクション3.2を参照)およびその他のブロック暗号は、RSAアルゴリズムよりもはるかに高速です。DESは、通常、ソフトウェアでは少なくとも100倍高速です。ハードウェアでは、実装によって異なりますが、1,000〜10,000倍の速さです。RSAアルゴリズムの実装により、需要が高まるため、今後数年間でギャップが少し狭くなるでしょうが、ブロック暗号も同様に高速になります。

次に ここを見る とすると、DESが1バイトあたり54.7サイクル、SHA-1が1バイトあたり11.4サイクルであることがわかります。

したがって、ドキュメントのSHA-1ハッシュを計算して署名することは、パフォーマンスの最適化ではなく、ドキュメント全体を秘密鍵で暗号化することです。

2)署名からドキュメントを分割することにより、より柔軟なシステムが得られます。それらを個別に送信したり、別の場所に保存したりできます。これは、誰もがすでにドキュメントのコピーを持っている場合であり、ユーザーAがユーザーBに対して同じドキュメント(またはそのハッシュ)を持っていることを確認するだけです。

3)それについて考えると、誰かが偽の秘密鍵でドキュメントを暗号化し、実際の公開鍵でそれを復号化した場合、アルゴリズムは実際に結果(署名されているかどうかにかかわらず)を伝えることができません。プログラムが結果のドキュメントの意味を解釈できない限り(おそらく、XMLであることがわかっているなど)、確実にそれを言うことはできません。署名された'。あなたは正しいメッセージを受け取ったか、間違ったメッセージを受け取った。おそらく人間は知ることができますが、機械はできません。ハッシュ方式を使用すると、私はすでにプレーンテキストを持っていると想定しており、Aが署名したことを確認したいだけです。

核兵器を発射するプログラムがあるとしましょう。メソッドを使用して暗号化されたコマンドファイルを取得するため、公開鍵で復号化して、その結果をコマンドプロセッサに送信します。その後、コマンドプロセッサを使用して、それが有効なコマンドであるかどうかを確認します。それが怖いです。コマンドのプロトコルが、ミサイルをターゲットとする場所の緯度と経度であり、バイナリにエンコードされている場合はどうなりますか?間違ったターゲットで簡単に起動する可能性があります。

ハッシュを使用すると、プレーンテキストチャネルでコマンドと署名付きハッシュを取得できます。コマンドをハッシュし、署名を確認します。一致しない場合は、コマンドプロセッサに何も送信しません。それらが一致する場合、コマンドを送信します。

コマンドの内容を非表示にする場合は、コマンドと署名を取得し、それらを一緒に圧縮して、送信する前に受信側の公開鍵で全体を暗号化します。

24
Scott Whitlock

時には、全世界にメッセージを読ませることを特に気にせずに(または、メッセージを読ませたい)、メッセージを書いたことを証明するメカニズムを提供したい場合があります。署名はこれだけです。

RSAは低速ですが、RSAを使用するほとんどの暗号化ソフトウェアは、実際にはAESのような対称暗号でドキュメントを暗号化し、RSAで使用されるキー(「セッション」キーと呼ばれることもあります)を暗号化するため、ドキュメント全体の暗号化による速度低下はそれほど大きくありません。

3
peejaybee

これにより、ドキュメントのすべてのバイトが取得され、40バイトに変換されます。ドキュメントは、以前のものと比較すると、今では巨大なファイルになります。データの暗号化、送信、復号化には多くのリソースを必要とします。送信するドキュメント全体を暗号化してから、他の人がそれを解読するのは、あなたが説明した方法よりもはるかに面倒です。

1
DFord

1つの単語-否認防止-文書の暗号化が重要であるかどうかは、実際には重要ではなく、暗号化とハッシュにかかる時間はそれほど重要ではありません-これは、大規模な電子発注書、電子契約などの重要な問題です。

否認防止のみが必要な場合、秘密鍵への>>>> DIRECT <<<<<アクセス/制御を署名者に提供する必要はありません-キーの物理的な所有が必要な場合> CONTAINER <ピンとともに、これは多くの場合、信頼できる電子署名を生成するための満足のいく手段です。 http://en.wikipedia.org/wiki/Common_Access_Card

1
Mark Mullin

1つの理由は、すべての受信者に対してドキュメント全体を「暗号化」する必要があるため、ファイルサイズが非常に大きくなる可能性があるためです。

また、暗号化している場合(説明したように署名していない場合)は、ドキュメント全体を対称暗号で暗号化し、結果のキーは受信者の公開キーでのみ暗号化します。対称暗号化ははるかに高速であり、受信者に対する柔軟性がはるかに高くなります。

1
Fabian Zeindl