私はRSAを暗号化に使用することの欠点を調査してきましたが、RSAの復号化が遅いということを繰り返し発見しましたが、これがなぜかについての説明は見ていません。なぜこれが起こるのか誰かが説明できますか?
プライベート指数は必然的に大きいため、RSA復号化は暗号化と比較して遅いですが、RSAを適切に使用すると、パブリック指数を65537(または3)のように小さく選択できない理由はありません。
RSA暗号化は_m^e mod N
_によって暗号文を生成します。ここで(N、e)は公開鍵であり、復号化は_c^d mod N
_を介して機能します。ここで(N、d)はpがわかっているときに効率的に計算される秘密鍵ですq大きな素数。
これが私が生成したばかりのキーの例です。例を簡単にするために、私は256ビットのRSA(弱い)のみを使用しましたが、実際には最近2048ビットのRSAを使用する必要があります。この場合、p、q、N、dはそれぞれ8倍の数になります桁の。 (その間、eは2048ビットRSAでも65537のままです。)
_p = 255972651020913583852708738755558492779
q = 315961372360286283221530569994994089667
N = 80877470103268491690225776687889776985485516372419877405296906209811698014593
e = 65537
d = 62101042930507606982857645825838676738862341745400679479964616076341592694761
_
RSA条件が満たされていることを確認できます。 p および q は、プライム、 _N == p*q
_ 、および e*d % ((p-1)*(q-1)) == 1
(この最後の条件は、RSA復号化が Eulerの定理 を介して機能することを可能にするものです)。暗号化が機能することをテストすることもできます-メッセージm = 12345678901234567890の場合、 _c = m^e mod N
_ は_c = 37526865766319703630750491158429044860161927049301804846356525193422406944367
_であり、次に_c^d mod N
_は_12345678901234567890
_になります(wolframalphaリンクなし-入力が無料版には長すぎます)。これは、すべてのステップを示す ipythonノートブックです -python pow(x, y, N)
の注記は構文です_x^y mod N
_の場合。
このことから、_m^e mod N
_を計算する時間は、_c^d mod N
_よりもはるかに速く計算されることが明らかです。暗号化の場合、二乗を繰り返すことによる65537によるべき乗には、二乗を行い、係数を1倍してmを16倍する必要があります65537 = m * m216 (xとして16の2乗2ん =(x2)2n-1)。 RSA-256を使用した復号化の場合、dによる指数化には256回の二乗と約128(dの最初の1を除いた2の1の数)の乗算が必要であり、RSA-256を使用した他の乗算では、二乗ごとに次の係数も計算する必要があります。 N.大きな数のこれらのモジュロ乗算は、一定の時間演算ではなく、数のビット長に依存することに注意してください。 d
をe
のように小さくすることを選択した場合、秘密鍵がブルートフォースされる可能性があります(公開鍵を使用してメッセージを暗号化し、適切に復号化されるまでdのすべての小さな値を試行します)。 。この簡単な方法では、dがブルートフォースには大きすぎても、小さいd(d <N1/4/ 3)、その後、攻撃者がプライベート指数を発見できるようにする より高度な攻撃 があります。
(そして、はい、私はいくつかの現実のRSAの事実を無視しました。復号化を高速化するために秘密鍵の一部としてpとqを使用することにより、中国の剰余定理を使用できます。また、実際のメッセージではRSAを使用しないので、セキュアパディング(OAEP)を使用し、ランダム対称キーのみを暗号化します。これは、実際のメッセージの暗号化に使用されます)。
RSAは、非常に大きな数で計算を行うことを含みます。特に、解読は、大きな数を非常に強力に計算します。秘密鍵の要素を知っている場合、いくつかのショートカットがありますが、それでも遅いです。
古典的な(つまり、対称的な)暗号システムは、非常に単純なビット操作(適切に並列化できる)を繰り返すことによってほとんど機能しますが、結局、実行する作業ははるかに少なくなります。
RSAの推奨される使用方法は、対称鍵をランダムに選択し、RSAで暗号化し、そのランダム鍵でメッセージを暗号化し、暗号化して添付し、両方を陽気に送信することです。明らかに、それは暗号的に強力な乱数発生器を持つことが重要です...
まず、「RSA復号化が遅い」とはどういう意味かを考える必要があります。何に比べて遅い?結局のところ、RSA暗号化は代案を探す価値があるという意味で遅いです。
RSA復号化は、暗号化を使用しない場合よりも時間がかかります。明らかに、暗号化を使用することの利点は、データを機密に保つことができることです。そのため、速度が遅いことは、代償として支払う価値があります。
RSA復号化は、AES復号化よりも低速です。より一般的には、同等レベルのセキュリティ(つまり、ブルートフォースで暗号化を解読するのがどれほど難しいか)の場合、非対称暗号化は対称暗号化よりも大幅に遅くなります。私の知る限り、これがそうである根本的な数学的な理由はありません。それは、既知のアルゴリズムがこの特性を持っているということだけです。非対称暗号は対称的に(秘密キーを共有することにより)使用できるため、非対称暗号は対称暗号と同じくらい高速です。
RSAの暗号化と復号化は低速であるため、通常は hybrid cryptosystems の一部として使用されます。メッセージを暗号化するには、RSAキーペアを使用してメッセージを暗号化および復号化するのではなく、一意の対称キー(通常はAESキー)を生成し、RSAで対称キーを暗号化し、AESでメッセージを暗号化します。このように、RSAは数百ビットの単一ブロックを暗号化するためにのみ使用されます。
RSA暗号化は通常、同等のセキュリティレベル(ECCを備えたより小さなキーを必要とする)の 楕円曲線に基づく暗号化スキーム よりも低速です。 ECCはRSAよりも新しく、徐々に採用されつつあります。
補足:RSA復号化は、通常使用されるように、暗号化よりも低速です。 RSA復号化の負荷の高い操作はべき乗です:C = P ^ d(mod n)。対応する暗号化操作は非常によく似ています— P = C ^ e(mod n)。速度の違いは、公開指数eを選択して計算を高速化できるという事実から来ています。指数には、指数のビットごとに1つの乗算と、1に設定されたビットごとに別の乗算が必要です。プライベート指数dは、eが小さくても(3と216+1が最も一般的な選択肢です)。