web-dev-qa-db-ja.com

非対称暗号化は対称暗号化よりも効率が悪いのはなぜですか?

一般に、非対称暗号化は対称暗号化よりも計算にはるかにコストがかかるため、非対称暗号化を使用してバルクデータ交換の対称鍵を確立するのが一般的です。正確にはどれほど遅いかについての情報は見つけられません。

したがって、いくつかの小さなデータX(たとえば256ビットのハッシュ値)があり、合理的な最新の暗号アルゴリズムを選択すると仮定すると、計算するための大まかな相対コストは

  • Xは公開鍵で暗号化されています
  • 対称鍵で暗号化されたX
  • H(X)、Hは暗号化ハッシュ関数
13
Izz

これはアルゴリズムに依存します。特に非対称暗号では、速度はwildlyによって異なります。さまざまな暗号プリミティブのより詳細でマシンに依存しないベンチマークについては、 eBACS をチェックアウトすることをお勧めします。いつものように、選択した条件下で本番システムに何が期待できるかを正確に把握するには、独自のシステムで独自のベンチマークを実行する必要があります。

非対称暗号を使用して直接何かを暗号化することはできません。キー以外のものを暗号化すると、暗号解読を可能にするリスクに遭遇する可能性があります。たとえば、RSAは非ランダムデータの暗号化を好みません。これは、キーを暗号化する場合(結局のところランダム)に問題ありませんが、ASCIIを暗号化する場合には問題です。 別の答え (私の強調)から引用:

RSAには運用上の制約があります。最もよく使用されるバリアント(PKCS#1 v1.5として知られているもの)で、RSA鍵のサイズが「1024ビット」の場合(つまり、鍵ペアの中央の数学コンポーネントが1024ビット整数であること)、 RSAは最大117バイトの長さのメッセージを暗号化でき、128バイトの長さの暗号化されたメッセージを生成します。この制限されたサイズ、および暗号化時にサイズが増加することは、RSA暗号化プロセスの数学的構造の避けられない結果です。 これらの制約により、通常、RSAを使用してデータを直接暗号化することはありません。代わりに、ランダムなバイトの小さなシーケンスを選択します。これをセッションキーと呼びます。セッションキーをRSAで暗号化します。次に、対称暗号化アルゴリズムを使用してセッションキーを使用し、メッセージ全体を処理します。これはハイブリッド暗号化と呼ばれます。

対称暗号を使用して少量のデータを暗号化しても、高速のメリットはそれほど得られません。ほとんどの対称暗号には、 キースケジュール と呼ばれる1回限りの設定コストがあります。この場合、キーが処理され、暗号のコンポーネントごとに個別のサブキーに分割されるか、暗号の内部状態に分散されます。これらのサブキーは通常キャッシュされるため、暗号が呼び出されるたびに直接使用できます。新しいキーが使用されるたびに、キースケジュールが実行され、暗号化する前に完了する必要があります。一部の暗号は Blowfish などの非常に高価なキースケジュールを持っています。そのキースケジュールは、4つのKiB RAMを必要とする521 Blowfish暗号化に相当し、低速の基本です bcrypt 関数。他の人は [〜#〜] tea [〜#〜] のように非常に単純なキースケジュールを持っています。これは単にキーを分割して定数と混合するだけです。単一のキーで大量のデータを暗号化すると、小さなチャンクデータを個別に暗号化する場合よりも、高速暗号の速度から多くのメリットを得ることができます。


中負荷でのローエンドシステム(Pentium III、1 GHz)のクイックベンチマークは以下のとおりです。これらのベンチマークは、これらのアルゴリズムがこの特定のマシンでどれだけ速いかだけを示していることに注意してください。それは桁違いに正確かもしれませんが、異なる機能を備えたより高速なマシンはより高速であるだけでなく、個々のアルゴリズムの相対速度も異なるかもしれません!しかし、アイデアを得るために...

RSA、さまざまなサイズ:

 OpenSSL> speed rsa 
 ... 
 sign verify sign/s verify/s*
 rsa 512ビット0.001305s 0.000113s 766.2 8881.1 
 rsa 1024ビット0.007685s 0.000372s 130.1 2687.5 
 rsa 2048ビット0.050615s 0.001355s 19.8 738.1 
 rsa 4096ビット0.353636s 0.005201s 2.8 192.3 

AES、異なる鍵サイズと入力長さ:

 OpenSSL> speed aes 
 ... 
「数値」は、処理される1秒あたり1000バイトのバイト数です。
タイプ16バイト64バイト256バイト1024バイト8192バイト
 aes-128 cbc 21174.71k 23656.67k 24212.96k 39798.65k 40800.k 
 aes-192 cbc 18706.23k 20713.58k 21222.25k 34669.23k 35059.k 
 aes-256 cbc 16153.38k 17569.97k 18004.69k 30170.76k 30020.k 

SHA-256、さまざまな入力長:

 OpenSSL> speed sha256 
 ... 
「数値」は、処理される1秒あたりのバイト数が1000です。
タイプ16バイト64バイト256バイト1024バイト8192バイト
 sha256 6537.11k 14781.14k 26256.93k 32630.49k 34562.k

*教科書RSAでは、署名の検証は暗号化と同じであり、署名は復号化と同じです。検証には、sかどうかの決定が含まれますe ≡m(mod n)、暗号化は実行中c≡me (mod n)。現実の世界では、RSAが簡単に壊れないようにするために必要な特別なパディング操作を含む 重要な違い があります。


whyこのパフォーマンスの違いがあるのではないかと思います。その理由は、これらの暗号プリミティブがどのように機能するかに関係しています。非対称暗号、対称暗号、およびハッシュ関数の基本的な説明と、それらのパフォーマンスに影響を与えるものを以下に示します。

非対称暗号は、いわゆる 硬度の問題 を伴います。これらは、演算が一方向に実行するのは簡単ですが、秘密の値なしに逆に操作することが難しいという事実を利用する数学の未解決の問題です。 RSAは、2つの巨大な素数を掛け合わせるのは取るに足らないことですが、結果の合成数を元の素数の少なくとも1つなしで元の素数に戻すことは非常に困難です。 textbook RSA の場合、メッセージの暗号化mの計算にはc≡mが必要ですe (mod n)cを復号化するには、m≡cを計算しますd (mod n)。ここで、nは2つの秘密の素数の積、pおよびです/ q、およびdは、eのモジュラーインバースであり、しばしば Fermat素数 )として選択され、ここでdd calculating eを計算することによって得られます-1 mod(p-1)(q-1)

非対称暗号は、すべてが異なる数学的概念を含んでいるため、速度が大きく異なる場合があります。同じ概念を使用する個別の暗号(RSAや Rabin cryptosystem など)でも、速度が異なる場合があります。これらのアルゴリズムは、非常に大きな数を一度に操作する必要があるため、しばしば非常に遅くなります。これは、64ビット数(または数倍以上)しか処理できない最近のCPUでは困難です 最大512ビット 特別な最適化が使用されている場合の最新のCPUの場合)。特にモジュラー演算は、64ビットプロセッサで64ビット整数を使用する場合は簡単ですが、2048ビットの大量の数値を使用する場合は非常に非効率的です。

対称暗号には、ストリーム暗号とブロック暗号の2種類があります。*。ストリーム暗号はキーを使用して、疑似ランダムバイトの無限の確定的ストリーム(キーストリーム)を生成します。このストリームはプレーンテキストと組み合わされて暗号文を形成します。復号には同じ操作が含まれ、キーストリームを暗号文と組み合わせて平文を取得します。一方、ブロック暗号はキーを受け取り、それを使用して固定ブロックの入力を並べ替え、同じサイズの暗号テキストブロックを出力します。同じ鍵を使用してブロック暗号を逆に実行し、暗号文を復号化できます。キーを使用して複数のデータブロックを安全に暗号化するには、ブロック暗号を 操作モード で実行する必要があります。一部のモードでは、並列実装が可能です。他のものはシリアル化する必要がありますが、暗号化のために並列化することはできますが、復号化することはできません。

対称暗号は、混乱(出力から入力またはキーについてのヒントが得られない)と拡散(入力またはキーのわずかな変化によって出力が大幅に変化する)のみを伴うため、非常に高速です。通常、大量の数値に作用する非対称暗号とは異なり、対称暗号には、非常に単純な鍵に依存する多数の操作が何度も繰り返されます。各操作は、CPUによって効率的に計算されるのに十分小さいです。特に、 ARXスキーム (Salsa20など)を使用する暗号化では、追加、ローテーション、およびXOR演算のみを実行でき、非常に小さなWordサイズのデータ​​チャンクで操作できます。プロセッサに非常に効率的に実装できます。扱いにくい数値に対する算術演算はありません。

ハッシュ関数は対称暗号に非常によく似ており、混乱と拡散の同じ概念が関係しています。実際、ハッシュ関数は暗号を作成するために使用されることがあり、その逆も同様です。これは、コアでハッシュを使用するストリーム暗号であるSalsa20と、AESの変更バージョンを使用するハッシュ関数であるWhirlpoolで見られます。ハッシュ関数は、事実上無制限のサイズの入力を受け取り、固定サイズのダイジェストを出力します。暗号と同様に、混乱は攻撃者が出力からの入力について 何かを学習 することを防ぎ、拡散は入力への小さな変更を増幅します。

より厳密な要件があるため、ハッシュは対称暗号よりも遅いことがよくあります。特に、ハッシュは、攻撃者が操作を元に戻し(プリイメージ攻撃)、ハッシュを変更せずに入力を変更する(2番目のプリイメージ攻撃)のを防ぐだけでなく、同じものを作成する入力のペアを生成することも困難にする必要があります。ハッシュ(衝突攻撃)。衝突に強いことは難しく、かなり遅く複雑なハッシュが必要になる傾向があります。見方を変えると、攻撃者は 衝突する可能性があります 関数を2回呼び出すよりも少ない労力で、ひどく壊れたMD4ハッシュを作成します。それでも、それに対する best preimage attack は純粋に理論上のものです。

*ストリーム暗号の暗号化はC = P⊕EKおよび復号化はP = C⊕EKここで[〜#〜] p [〜#〜]は平文、[〜#〜] c [ 〜#〜]は暗号文で、EK キー[〜#〜] k [〜#〜]で生成されたキーストリームです。ブロック暗号の場合、暗号化はC = EK(P)および復号化はP = DK(C)[〜#〜] p [〜#〜]および[〜の単一ブロックの場合#〜] c [〜#〜]。複数の[〜#〜] p [〜#〜]または[〜#を処理するには、操作モードが必要です〜] c [〜#〜][〜#〜] k [〜#〜]を1つ指定します。

 ハッシュ関数を使用して暗号を構築する場合、またはその逆の場合、ハッシュから要求されるセキュリティプロパティは異なります。たとえば、Salsa20は 衝突抵抗がない のハッシュ関数で構築されているにもかかわらず、安全なストリーム暗号です。同様に、暗号から構築されたハッシュ requires 暗号は関連キー攻撃に対して安全です。これは、それ自体で安全な暗号に必ずしも必要ではありません。

14
forest