web-dev-qa-db-ja.com

暗号化するRSA最大バイト、セキュリティの点でAESと比較?

RSAを使用してプレーンテキストメッセージを暗号化する場合の最大バイト数はいくらですか。これは、適度に安全で効率的であり、AESは同じサイズのバイトでより良いでしょうか?ちなみに暗号化は公開である必要はありません。AESが短いメッセージでも大きなドキュメントと同じくらい優れているのかと疑問に思っています。基本的に、メッセージまたはドキュメントは暗号化されて送信されますが、キーは公開されません。これもRSAの目的に反することになると思いますが、RSAは短いメッセージに適し、AESは長いメッセージに適していることをオンラインで何度か読みました。

30
pandoragami

PKCS#1 で定義されるRSAは、制限されたサイズの「メッセージ」を暗号化します。一般的に使用される「v1.5パディング」と2048ビットのRSAキーを使用すると、RSAで暗号化できるデータの最大サイズは245バイトです。 。もういや。

「RSAでデータを暗号化」する場合、実際には、ランダム対称鍵をRSAで暗号化してから、サイズに制限のない対称暗号化アルゴリズムでデータを暗号化します。これは [〜#〜] ssl [〜#〜]S/MIMEOpenPGP ...でどのように機能するかです。入力メッセージを245バイトのチャンクに分割し、それぞれを多かれ少なかれ個別に暗号化することによって、「RSAのみ」を実行することをお勧めします。これは悪い考えです:

  • データを分割して再構築する方法には、かなりの弱点がある可能性があります。十分に研究された標準はありません。
  • 各チャンクは、暗号化されるとビットが大きくなります(2048ビットのキーでは、245バイトのデータが256バイトになります)。大量のデータを処理する場合、サイズのオーバーヘッドが大きくなります。
  • 大きなメッセージの解読は、耐えられないほど高価になる可能性があります。

nビットのブロックを使用する対称ブロック暗号でデータを暗号化する場合、単一のキーで暗号化されたデータの量が2に近づくと、セキュリティ上の懸念が生じ始めます。n/2ブロック、つまりn * 2n/2ビット。 AESでは、n = 128(AES-128、AES-192、およびAES-256はすべて128ビットブロックを使用します)。これは、2億5000万テラバイトを超える制限であることを意味します。これは、問題にならないように十分な大きさです。 AESがより一般的な(当時は)64ビットブロックではなく128ビットブロックで定義されたのはそのためです。これにより、データサイズが実質的に無制限になります。

61
Thomas Pornin

2つを直接比較することは、トラクターを列車と比較することに少し似ています。両方とも車両ですが、機能と構造がまったく異なります。

RSAは非対称暗号です。公開鍵は誰でも知っているため、信頼されていないネットワークを介したメッセージの安全な交換に最適です。公開鍵で暗号化されたメッセージは、秘密鍵でのみ復号化できます。そのため、2人の当事者が互いの公開鍵を知っている場合は、安全にメッセージを交換できます。これは、秘密情報を送信する必要がないことを意味します-authenticityおよびintegrityが維持されている限り、安全です。ありがたいことに、RSAはsignaturesをデータに生成する方法を提供し、それが本物であることを証明するのに役立ちます。秘密鍵で署名されたメッセージが与えられると、対応する公開鍵を使用してその署名を検証することが可能です。

経験則として、RSAキー長と同じ大きさのデータのみを暗号化できます。したがって、4096ビットのRSA鍵がある場合、最大4096ビット長のメッセージしか暗号化できません。それだけでなく、それは信じられないほど遅いです。 RSAは、フルスピードのデータ転送暗号として設計されていません。

AESは対称ブロック暗号であり、信じられないほど高速です。平文はブロックと呼ばれるチャンクに分割され、各ブロックはチェーンで暗号化されます。これを行うにはさまざまな方法がありますが、一般的な方法は、Cipher Block Chaining(略してCBC)と呼ばれます。これにより、理論的には無限のメッセージサイズが可能になります。ただし、AESなどの対称暗号では、最初に秘密鍵を交換する必要があります。 RSAとは異なり、共有キーは攻撃者に知られていない必要があるため、信頼性、整合性、および機密性を提供する必要があります。それを直接行うことは困難です。

あなたが見つける傾向があるのは、RSAがAESのようなブロック暗号のキーを交換するために使用されるように、両方スキームが一緒に実装されるということです:

  1. アリスとボブはお互いのRSA公開鍵を知っています。一般に、これらは帯域外で交換されます。オペレーティングシステムの一部として展開されている証明書を介して。
  2. アリスはAESにランダムな256ビットの鍵を選び、その鍵をボブの公開鍵で暗号化します。彼女は自分の秘密鍵でこのメッセージに署名し、それをボブに送信します。
  3. ボブはアリスの公開鍵を使用して署名を検証します。次に、自分の秘密鍵を使用してメッセージを復号化します。
  4. Eve(盗聴者)は暗号化されたメッセージを見ましたが、Bobの秘密鍵を知らなければそれを復号化できません。また、署名が正しくなくなるため、メッセージを変更することもできません。彼女はアリスの秘密鍵を知らなければ、有効な署名を再生成できません。
  5. AliceとBobは256ビットの秘密鍵を共有し、それを使用して、AESなどの対称暗号を使用してメッセージを暗号化します。

これはいくつかの要件を満たします。

  • 会話は、攻撃者がメッセージを読み取ることができなくても、信頼できないネットワークを介して発生する可能性があります。
  • セッションキーの交換は安全な方法で行うことができます。つまり、キーの信頼性と整合性が維持されます。
  • 実際の会話データの暗号化と復号化のパフォーマンスは非常に優れています。

セキュリティのlevelに関しては、RSAとAESを比較してもあまり意味がありません。彼らは異なる仕事をします。 現在 128ビットのAESキーは安全であり、2048ビットのRSAキーは安全であると想定していますが、これは個々のセキュリティ要件に完全に依存しています。 256ビットのAESおよび4096ビットのRSAキーを使用することは、実装が適切であると想定すれば、次の10年間は​​十分以上のはずです。

多くの注意点と詳細が含まれているため、これらすべてが単純化されていることに注意してください。また、「暗号化」としてのRSA交換の説明は厳密には正しくありませんが、これらすべては、 2種類の暗号化作業。

41
Polynomial

通常、RSAが大量のデータに使用されない理由の1つは、パフォーマンスが原因です。RSAとAESはどちらも(正しく実装されている場合)大量および少量のデータに対して安全ですが、RSAははるかに低速です。

公開鍵暗号は理にかなっているが、より高いパフォーマンスが必要な場合は、両方を活用する hybrid システムを実装できます。

3
Adam Caudill

GoLang暗号パッケージによると、「メッセージは、パブリックモジュラスから11バイトを引いた長さ以下でなければなりません」。 http://golang.org/pkg/crypto/rsa/#EncryptPKCS1v15

2
Andrew Watson

AESは対称鍵アルゴリズムです。 RSAは非対称です。どちらも暗号化用ですが、さまざまな方法で使用されることが多いため、効率または強度の点で比較することは困難です。暗号化が使用されます。

あなたはこの他の質問から始めたいかもしれません: 暗号化-私はRSAまたはAESを使用する必要がありますか?

2
Eric G