RSA暗号

RSA暗号（RSAあんごう、Rivest-Shamir-Adleman）とは、桁数が大きい合成数の素因数分解が現実的な時間内で困難であると信じられていることを安全性の根拠とした公開鍵暗号の一つである。暗号とデジタル署名を実現できる方式として最初に公開されたものである。

**概要**
RSA暗号方式は、1977年に発明され、発明者であるロナルド・リベスト、アディ・シャミア、レオナルド・エーデルマンの原語表記の頭文字をつなげてこのように呼ばれるpage=63。前年（1976年）にディフィーとヘルマンによって発表されたばかりの公開鍵暗号という新しい概念に対し、秘匿や認証を実現できる具体的なアルゴリズムを与えた。発明者3氏は、この功績によって2002年のチューリング賞を受賞した。この暗号はフェルマーの小定理に基づいているdate=2023年10月。
RSA暗号のアルゴリズムは、1983年9月20日にアメリカ合衆国で特許（4,405,829号）を取得し、RSA Security 社がライセンスを独占していたが、特許期間満了に伴って2000年9月6日からは誰でも自由に使用できるようになった。
暗号の用語については暗号#用語、暗号理論#用語を参照。
なお、RSA暗号を最初に考案したのはGCHQに所属するJames H. EllisとClifford Cocksであるという説がある。エリスは1969年に公開鍵暗号に相当する理論を考案したが、エリスは専門の数学者ではなく、GCHQの数学者たちも公開鍵暗号の具体的な方法を提示することはできなかった。1973年にコックスはエリスが考案した暗号の理論を聞かされ、わずか30分程度でリベストの計算式と同様の方法を考案した。しかし、エリスとコックスの業績は機密事項とされたため、1997年までは世間に知られることはなかったpage=66。また、当時はRSA暗号を使用するには高価なコンピュータが必要であり、公に知られている限り、実用に供されることは無かった。

**暗号方式**
鍵生成、暗号化、復号の3つのアルゴリズムで定義される。

**鍵生成**
を異なる2つの素数とし 1=n = pq とし  とする。e を λ(n) と素な正整数とすると  となる2整数 α, β が存在する。α として1つの正整数 d を選択してそのときの β を −x とすると  となる。ここで d を秘密鍵とし、n と e を公開鍵とする。
ここで、 のとき i を整数とすると  であるから α に λ(n) の整数倍を加えたものも改めて α とできるため、α として正整数 d を選択できるとした。　
以下  を 0 以上 n 未満の整数の集合とする。

**暗号化**
とし a を暗号化対象の平文とする。 を計算し、b を 平文 a の暗号文とする。

**復号**
を計算する。すると  となり a′ は 平文 a の暗号文 b の復号文となる。

**完全性の証明**
定義により以下が成立する。

これにより以下も成立する。

が n と互いに素な整数のときは a が2つの素数 p, q のそれぞれと互いに素であるから
フェルマーの小定理 により  かつ  であり

よって  は p, q で割り切れるから  となり

となるが、 であるから

となる。
であり、 のときは、a は q − 1 個の整数からなる集合  の元であって、a が p で割り切れるから  であり、a, q が素であるからフェルマーの小定理により  であり

よって

よって

よって a − a は p, q で割り切れるから

となるが、 であるから

となる。
であり  のときについても同様に 1=a = a となる。
のときは  であるから 1=b = 0 であり、 であるから 1=a = 0 である。つまり 1=a′ = a = 0 である。
以上何れにしても 1=a = a が成り立ち、平文 a の 暗号文 b は 秘密鍵 d と公開鍵の一つ n を用いて平文 a に復号できることが分かる。

**性能**

**n を法とする冪剰余の計算**
セキュリティパラメータが1024の場合、n は1024ビットという大きな桁数の数となり、d も n とほぼ同じ桁数の数となる。 を計算するには、バイナリ法というアルゴリズムを用いると、剰余乗算 () を、1500回程繰り返すことで実現できる。これには相当の計算時間を要するため、中国の剰余定理を用いて、

として求めることがある。

**素数生成**
桁数が大きい場合、確実に素数であると保証できる整数を見つけることは容易ではない。このため実際には、素数であるとは断言できないものの、素数である可能性が非常に高い自然数を用いる。こういった自然数の生成はMiller–Rabinテストなどの確率的素数判定法によって高速に行える。確率的素数判定法をパスした自然数を確率的素数 (probable prime) という。確率的素数には、素数の他に擬素数が含まれるが、その確率は判定回数を増やすことで極めて低くすることができる（なお、拡張リーマン予想が正しければ、Miller–Rabinテストは素数かどうかを正しく判定する、という事実が知られているdate=2023年10月）。
2002年8月、インド工科大学 のアグラワルらが素数判定を多項式時間で行うAKS素数判定法を発表したdate=2023年10月が、これは多項式の次数が高すぎて遅いので未だRSAの鍵生成に実用するには足らない。

**安全性**

**RSA暗号と素因数分解問題の関係**
RSA暗号は、安全性が素因数分解問題と同値であると期待されている暗号方式であるが、本当に両者が同値であるかどうかについては分かっていない。
素因数分解を解けるオラクルを用いれば、n から p および q が計算できるので、鍵生成と同様にして秘密鍵 d を知ることができる。即ち、RSA暗号が解読できる。従って、RSA仮定が証明できれば素因数分解問題の困難性が示せる。しかし、逆が成立するかどうかはよく分かっていない。ある条件下では否定的な結果もでている。
RSA暗号が選択平文攻撃に対して完全解読できない、ということとRSA仮定とは同値である。
RSA問題を解く方法として、現在知られている有力な方法は、素因数分解問題を解くことに使える方法だけである。素因数分解問題を解く方法として、楕円曲線法や数体篩法などのアルゴリズムが知られているが、これらの方法はどれも準指数関数時間アルゴリズムであり、多項式時間で素因数分解問題を解く方法は知られていない。
暗号理論の世界では、多項式時間で解読することができない暗号方式を安全であると定義することがある（計算量的安全性）。この意味で、RSA暗号の安全性について、現在知られている範囲では安全であると期待されていて、その反証がないと言える。
RSA問題や素因数分解問題はNP問題であるので、これらの問題が（決定性のある）多項式時間では解けないことが証明できれば、P≠NP予想が肯定的に解決することになる。ただし、ハミルトン閉路問題など他のNP問題（NPかつNP困難なNP完全問題を含む）が多項式時間で解けることが証明されればP=NPとなってしまう。

**素因数分解可能な範囲**
2004年の時点では、インターネットで公募した数多くのPCを用いると512ビット程度の数なら素因数分解できるので、RSA暗号に使用する法 n は1024-4096ビット（10進数で300-1000桁程度）にすることが推奨されている。
しかしシャミアは、RSA問題を解くための専用装置 (TWIRL) を作成すれば、1024ビットの n に関するRSA問題ですら解くことができると主張している。また、実用的な量子コンピュータが登場した場合には、素因数分解の桁数増に対する計算時間の増加が緩やかなショアのアルゴリズムと呼ばれる高速な量子コンピュータアルゴリズムが実行可能となるため、たとえ鍵のビット数を増やしてもRSA暗号の安全性が保証されなくなる可能性が指摘されている。

**RSA暗号解読コンテスト**
RSA社は「RSA Factoring Challenge」を1991年から2007年まで実施し、最新の計算機環境でどの程度のビット数の整数が素因数分解可能かを調べた。- 1991年4月1日 RSA-100 (330ビット)- 1992年4月14日 RSA-110 (364ビット)- 1993年6月9日 RSA-120 (397ビット)- 1994年4月26日 RSA-129 (426ビット)- 1996年4月10日 RSA-130 (430ビット)- 1999年2月2日 RSA-140 (463ビット)- 2004年4月16日 RSA-150 (496ビット)- 1999年8月22日 RSA-155 (512ビット)- 2003年4月1日 RSA-160 (530ビット)- 2009年12月29日 RSA-170 (563ビット)- 2003年12月3日 RSA-576 (576ビット、10進174桁）- 2010年5月8日 RSA-180 (596ビット)- 2010年11月8日 RSA-190 (629ビット)- 2005年11月2日 RSA-640 (640ビット)- 2005年5月9日 RSA-200 (663ビット、10進200桁)- 2013年9月26日 RSA-210 (696ビット、10進210桁)- 2012年7月2日 RSA-704 (704ビット)- 2016年5月13日 RSA-220 (729ビット）- 2018年8月15日 RSA-230 (762ビット）- 2020年2月17日 RSA-232 (768ビット）- 2009年12月12日 RSA-768 (768ビット)- 2019年12月2日 RSA-240 (795ビット）- 2020年2月28日 RSA-250 (829ビット）
以下は未踏- RSA-896- RSA-1024- RSA-1536- RSA-2048

**RSA暗号の性質**
RSA暗号は選択暗号文攻撃を行なえば完全解読できる。また、RSA暗号は選択平文攻撃に対してすらindistinguishable（識別不能）ではない。よってRSA暗号は選択平文攻撃に対してnon-malleable（頑強性）でも semantic secure（強秘匿性）でもない。non-malleable と semantic secure の定義は公開鍵暗号に記されている。

**RSA暗号の誤用**

**特殊な（誤った）応用**
 共通の法 n
 ユーザー管理等の利便性や素数探索の労を避けるため、法である n を共通として各々に個別の e と d を与えるのは誤りである。もしも法 n とそれに対応する e と d の組を一つでも知ることができれば、法 n の素因数分解が容易となり安全ではなくなるからである。
 同報通信
 全く同一の平文を複数の送信先へ各々の公開鍵で暗号化して同報通信するには適していない。同じ e を持つ公開鍵（ハミング重み 1=HW = 2 である 3 や 65537 が好んで用いられる）で暗号化された e 個以上の暗号文を手に入れたなら各々の公開鍵の法に関して中国の剰余定理を用いることで、通常の冪根によって平文を復元できるからである。詳しくは下記の同一平文を参照のこと。
 このため、現在規格化されている暗号への応用においては、パディングとして毎回乱数を生成して挿入するなどの対策がされている。

**脆弱な平文**
RSA暗号の安全性は素因数分解の困難さ（より正確には素因数が不明な法 n での冪根を求めることの難しさ）に基づいている。
しかし、平文の内容によっては、素因数分解をせずとも暗号文から平文を入手できる。

**決まりきった平文**
公開鍵暗号全般に言えることであるが、確定的暗号（例えば平文が「はい」か「いいえ」のどちらかしか有り得ない）であれば、それぞれを暗号化したものと暗号文とを比較すれば容易に平文を知ることができる。
実用上は、m の一部に毎回生成する乱数を挿入することで、この攻撃を回避できる（復号側で乱数部分を無視するよう処理すればよい）。

**小さなm**
平文 m が、n の e 乗根よりも小さいと、暗号文  となるから、通常の冪根演算によって c の e 乗根を計算するだけで平文 m が復元できてしまう。
実用上は、m の比較的高位のビットに1を挿入することでこの攻撃を回避できる。

**同報通信の誤用**
法 n における e乗根が計算できれば、暗号文を復号できる。当然これは（法 n の素因数が分からない限り）非常に難しいと考えられていて、RSA暗号の安全性の重要な根拠の一つになっている。
しかし、全く同一の平文を、異なる法において同一の e を用いて暗号化した暗号文を e 個以上集めることで、各々の法に関して中国の剰余定理を用いれば通常の冪根演算によって平文を復元できる。これを同報通信の誤用と呼ぶ。

ここから中国の剰余定理によって上記式を満たす、

を求めることができる。このとき  であり、また m はどの法 n よりも小さいため  であることから、

この c の e 乗根を求めることで平文 m が求められる。
として 3 や 65537 は、2進数表示したときに 1 の個数が少なく暗号化処理を高速化できるという理由から好んで用いられるが、上記の問題がある。
実用上は、m の一部に毎回生成する乱数を挿入することでこの攻撃を回避できる。

**その他**
RSA暗号の入力は、公開鍵の法を n とすると 0 から n − 1 の範囲の整数である。n 以上の値の平文を暗号化する際には、平文を分割して処理することになる。
この時に留意しなければならない点として、例えば、n が1024ビット（1== 128バイト）であるとき、平文を同じ 1024ビット毎に分割処理するのでは十分ではないという点がある。これは、n と m が共に 1024ビットであったとしても、math2|n 15年）は必要だろうと予測されていたGardner.1977。掲載から16年後に、オックスフォード大学Paul Leyland、アイオワ州立大学マイケル・グラフ、マサチューセッツ工科大学デレク・アトキンス、Arjen Lenstraらが、インターネット上で（南極大陸を除くすべての大陸から20か国以上の）約600名のボランティアの協力を得て、二次ふるい法によってRSA-129に対する大規模攻撃を開始した。8か月で800万以上の下位問題が解かれ、得られた50万行50万列以上の疎行列から188614行188160列の行列による連立方程式を作った。これをスーパーコンピュータMP-1で45時間をかけて構造的ガウスの消去法によって解き、解読に成功した（1994年4月）。答えは“The magic words are squeamish ossifrage”［ossifrage（ヒゲワシ）はラテン語で「骨を折る者」の意。ロナルド・リベストによると暗号の答えはランダムで決められた。

**実装ライブラリ**
RSA暗号をサポートしているライブラリは以下の通り。- Botan- Bouncy Castle- cryptlib- Crypto++- Libgcrypt- Nettle- OpenSSL- wolfCrypt- GnuTLS

**脚注**

**参考文献**

**原論文**
 accessdate=2015-07-10：CocksがCESG（GCHQの一部局）に提出したメモ- accessdate=2015-07-10：「日経エレクトロニクス」に全訳があるとされる。

**関連項目**
 暗号- 暗号理論- Optimal Asymmetric Encryption Padding (RSA-OAEP)- 素因数分解- ElGamal暗号- 楕円曲線暗号- :en:RSA numbers - :en:RSA Factoring Challenge

**外部リンク**
 RSA暗号の仕組みと安全性・具体例