RSA暗号とは?素因数分解と公開鍵の仕組み
RSA暗号とは?素因数分解と公開鍵の仕組み
1977年に公開されたRSAは、公開してよい鍵(n, e)と外に出してはいけない秘密鍵dを分けることで、暗号と署名の考え方を一段進めた方式です。公開鍵暗号を数式から理解したい人、仕組みは知っているのに実務での役割が曖昧な人に向けて、歴史的位置づけから手で追える計算例までを一本につなげます。
1977年に公開されたRSAは、公開してよい鍵(n, e)と外に出してはいけない秘密鍵dを分けることで、暗号と署名の考え方を一段進めた方式です。
公開鍵暗号を数式から理解したい人、仕組みは知っているのに実務での役割が曖昧な人に向けて、歴史的位置づけから手で追える計算例までを一本につなげます。
筆者自身、ノートに p=61、q=53 と書いて n と φ(n) を計算し、拡張ユークリッド法で d=2753 にたどり着いたとき、RSAは「難しい理論」より先に「噛み合う仕掛け」として腹落ちしました。
この記事では、その小さな例で鍵生成から暗号化・復号までを追いながら、安全性の根拠が素因数分解困難性に基づく計算量的な話であることと、生のRSAは危うくRSA-OAEPやRSASSA-PSSのようなパディングが欠かせないことを切り分けて整理します。
さらに、WiresharkでTLS 1.3のハンドシェイクを眺めると、RSAは通信データをそのまま暗号化する主役ではなく、証明書や署名の側で効いていると見えてきます。
そこから、現代のハイブリッド暗号でRSAがどこに残っているのか、そして量子時代に向けてなぜ移行議論が続いているのかまで、誤解をほどきながら見ていきます。
RSA暗号とは何か――公開鍵暗号の革命
公開鍵暗号は、ひとつの鍵を共有して暗号化と復号を行う共通鍵暗号と発想が異なります。
共通鍵暗号そのものは高速で、現在も通信データ本体の保護では中心的な役割を担っています。
ただし、最初にその秘密の鍵をどう相手へ渡すのかという「鍵配送問題」がつねに付きまといます。
盗聴される回線しかない状況で秘密鍵を安全に配るには、結局どこかで別の安全な手段が必要になるからです。
公開鍵暗号はここをひっくり返しました。
外に出してよい鍵と、本人だけが持つ秘密鍵を分け、公開鍵で暗号化したものは対応する秘密鍵でしか戻せない、という構図を持ち込んだのです。
この転換点を歴史の流れで見ると、1976年のDiffie–Hellman鍵共有がまず立っています。
Whitfield Diffie と Martin Hellman が示したのは、事前に秘密を共有していない二者でも、公開のやり取りを通じて共通の鍵を作れるという道筋でした。
ここで初めて、鍵配送問題に対して数学で突破口を開くという見取り図が明確になります。
ただしDiffie–Hellmanは、名前の通り本質的には鍵共有の方式です。
そこに続いて1977年、Ronald L. Rivest、Adi Shamir、Leonard Adleman がRSAを公表し、公開鍵暗号は「秘密を共有する」段階から「公開鍵で暗号化する」「秘密鍵で署名する」という、より広い機能を備えた実用的な方式へ進みました。
筆者が大学のセキュリティ入門講義でこの流れを最初に学んだとき、教員が黒板に「1977 RSA」とだけ大きく書き、その横に「公開鍵が世界を変えた瞬間」と添えた場面を今でも覚えています。
年号だけ見れば一行ですが、その一行の前後で、暗号は“同じ鍵をどう隠すか”の時代から“公開してよい情報を土台に安全性を組み立てる”時代へ移りました。
教科書的な表現より、あの板書のほうが変化の大きさをよく伝えていました。
RSAは、公開鍵と秘密鍵という異なる鍵を用いる公開鍵暗号の代表例です。
一般向けには「大きな合成数の素因数分解が難しいから安全」と説明されますが、厳密には、素因数が未知の法 \(n\) に対する冪根計算の困難性と深く結びついた方式です。
とはいえ、実務や学習の入口では「法 \(n=pq\) の素因数分解が現実的時間で困難であることが安全性を支える」と押さえれば本質を外しません。
この“公開してもよい値からは秘密に戻れない”という非対称性こそ、RSAの革命性です。
RSAが暗号化とデジタル署名の双方を実現した最初期の公開方式である事実
RSAの歴史的な価値は、暗号化とデジタル署名の双方をひとつの公開鍵方式で扱えた、最初期の方式であった点にあります。
この性質によって、RSAは「秘密のメッセージを送る道具」であるだけでなく、「そのメッセージや証明書が本物かを検証する道具」にもなりました。
現代のTLS 1.3では、通信データそのものをRSAで包むのではなく、証明書や署名の側でRSAが働く場面が中心です。
ここでも、暗号化だけでなく署名を扱えるという設計が効いています。
実データは共通鍵暗号で高速に守り、公開鍵暗号は鍵配送や認証で使う。
この役割分担の定着に、RSAは長く影響を与えてきました。
歴史をもう一歩だけ丁寧に見ると、GCHQ内部では James Ellis が「非秘密暗号」の発想を持ち、Clifford Cocks がRSAに近い方式へ先行して到達していました。
ただし、それは当時公開されていません。
社会に共有され、研究者と実装者が検証し、標準化や運用へ接続されていったという意味では、公開されたRSAが転換点でした。
暗号の世界では「先に考えた」と「先に公開され、広く使える形になった」は別の出来事であり、RSAは後者の歴史を作った方式です。
この先の節では、RSAを歴史談義で終わらせず、公開鍵と秘密鍵がそれぞれ何を担うのかを式のレベルまでほどきます。
そのうえで、小さな数による手計算を追い、なぜ復号できるのかを自分の手で確かめます。
さらに、実務ではなぜ長文の暗号化に向かず、2048ビット級の鍵が証明書や署名で使われるのか、生のRSAではなくRSA-OAEPやRSASSA-PSSのようなパディング込みで理解すべき理由は何か、という運用上の勘所までつないでいきます。
歴史、数学、実装の三つがここでようやく一本につながります。
なぜ素因数分解が暗号になるのか
RSAの直感的な芯は、作るのは速いが、ほどくのは難しいという非対称性にあります。
大きな素数 \(p\) と \(q\) を選んで、\(n=pq\) を計算すること自体は機械にとって素直な掛け算です。
ところが、できあがった \(n\) だけを見て、元の \(p\) と \(q\) を突き止める作業は別物になります。
小さな数なら試し割りで戻れますが、鍵生成で使うような巨大な桁数になると、その差が一気に広がります。
筆者はこの感覚を説明するとき、数百桁のロッカー番号だけ渡されて、そのロッカーを開ける2本の鍵を探せと言われる場面をよく思い浮かべます。
鍵を自分で作る側は、最初から2本の形 \(p\) と \(q\) を知っているので、合うロッカー \(n\) を作れます。
逆に、外から見えるロッカー番号 \(n\) だけを手掛かりに、ぴったり噛み合う2本の鍵を見つけるのは途方もない作業です。
RSAは、この「掛け算の一方向性」を土台にして公開鍵と秘密鍵を分けています。
ここで一段だけ丁寧に言うと、RSAの安全性をそのまま「素因数分解問題そのもの」と言い切るのは、少し乱暴です。
直感の入口としては、大きな合成数の素因数分解が現実的時間で難しいという理解で十分です。
ただ、理論上より近いのは、未知の因数を持つ法 \(n\) のもとで、公開情報 \((n,e)\) と暗号文から平文、つまり冪根を求めることの難しさです。
これがいわゆるRSA問題です。
素因数分解ができれば \(\varphi(n)\) を計算でき、そこから秘密指数 \(d\) を求めて復号できます。
したがって、素因数分解が解ければRSAは破れます。
とはいえ、RSA問題と素因数分解問題が厳密に同一であるとは証明されていません。
ここは、素因数分解困難性と密接に関係するという表現が正確です。
この慎重さは、そのまま安全性の言い方にもつながります。
RSAは「絶対に安全」だから使われているのではありません。
安全性は、素因数分解の困難性に基づく計算量的仮定の上に成り立つからです。
つまり、既知のアルゴリズムと現実的な計算資源では解読が間に合わない、という前提で運用されています。
暗号の世界では、この「現実的時間で解けない」という線引きが本質です。
数学的に不可能だと言っているのではなく、必要な計算量が大きすぎて攻撃側のコストに見合わない、という意味です。
RSAが動く理由には、法 \(n\) の世界、つまり整数環 \(\mathbb{Z}_n\) での指数演算の性質が関わっています。
\(n=pq\) とすると、\(p\) と \(q\) を知っている側は \(\varphi(n)=(p-1)(q-1)\) を計算できます。
公開指数 \(e\) と秘密指数 \(d\) を、式 \(ed\equiv 1 \pmod{\varphi(n)}\) を満たすように選びます。
すると、互いに素なメッセージ \(m\) に対して \(m^{ed}\equiv m \pmod n\) が成り立ちます。
背後にあるのはオイラーの定理 \(a^{\varphi(n)} \equiv 1 \pmod n\) です。
公開鍵で \(m^e\bmod n\) を計算し、秘密鍵でさらに \(d\) 乗すると元に戻るのは、この合同式の噛み合わせによります。
前の節で触れた「仕掛けとして腹落ちする感覚」は、まさにここから生まれます。
公開されているのが (n,e) だけという点が欠かせません。
因子 p と q を秘匿することで φ(n) を直接計算できなくし、結果として秘密指数 d を導出する計算を現実的に困難にするという一連の連鎖が、RSA の安全性の根拠になっているのです。
もちろん、ここで言う困難性は永遠不変ではありません。
古典計算機ではGNFSのような高速な因数分解法が研究され、量子計算機の文脈ではShorのアルゴリズムが知られています。
だからこそRSAは、数学の美しさだけでなく、どの計算モデルでどこまで難しいかという見積もり込みで評価されます。
このセクションで押さえたい核は、RSAの安全性が「素因数分解が難しそうだから何となく安全」なのではなく、掛け算と逆向き計算の非対称性を、\(\mathbb{Z}_n\) 上の指数演算と組み合わせて利用する方式だという点です。
ここが見えると、公開鍵で暗号化できて秘密鍵でだけ戻せる理由が、単なる魔法ではなく数学の設計として見えてきます。
小さな数でRSAを作ってみましょう
理屈が見えてきたところで、今度は本当に小さな数でRSAを組み立ててみます。
教科書的な例としてよく使われるのが、\(p=61\)、\(q=53\) です。
どちらも素数であることの確認はここでは省略し、そのまま先へ進みます。
まず法になる数 \(n\) は
\[ n=pq=61\times 53=3233 \]
です。公開鍵に入る \(n\) は、この時点で完成しています。
次に秘密指数を作るため、オイラーのトーシェント関数 \(\varphi(n)\) を求めます。
\(n=pq\) は異なる二つの素数の積ですから、\(\varphi(n)=(p-1)(q-1)\) になります。
\[ \varphi(n)=(p-1)(q-1)=60\times 52=3120 \]
となります。
ここで \(3233\) と \(3120\) が並ぶと、RSAの鍵生成は「大きな掛け算」と「法の世界での逆数探し」でできていることが、ぐっと手触りのあるものになります。
公開指数 \(e\) は、\(\varphi(n)=3120\) と互いに素になるように選びます。今回は
\[ e=17 \]
とします。
条件は \(\gcd(17,3120)=1\) で、これは満たされています。
公開鍵の片割れとしてはもう十分に見えますが、RSAの面白さはここからです。
秘密鍵 \(d\) は、\(e\) の \(\varphi(n)\) に関する逆数、つまり \(ed\equiv 1\pmod{\varphi(n)}\) を満たす数です。
\[ d \equiv e^{-1} \pmod{3120} \]
を満たす数として決まります。言い換えると、公開指数 \(e\) に対して \(ed\equiv 1 \pmod{\varphi(n)}\) を満たす数です。
\[ 17d \equiv 1 \pmod{3120} 17d ≡ 1 (mod 3120) を満たす d を求めます。
これは拡張ユークリッド互除法によって e の法 3120 における逆数(つまり e^{-1} mod 3120)を求める手続きに相当します。
となる \(d\) を探すわけです。
この計算は拡張ユークリッドの互除法で進めます。
筆者はこの部分を紙とペンでたどるのが好きで、実際にノートの端に式を一段ずつ書いていくと、RSAが「ブラックボックスの暗号」ではなく「追える計算」だと実感できます。
たとえば次のように割り算を並べます。
\[ 3120 = 17\times 183 + 9 \]
\[ 17 = 9\times 1 + 8 \]
\[ 9 = 8\times 1 + 1 余りが 1 まで落ちたので、17 と 3120 が互いに素であることが確認できました。
ここから逆向きに計算をたどり、1 を 17 と 3120 の線形結合で表すことで、17 の法 3120 における逆数を導きます。
\[ 8 = 1\times 8 + 0 \]
余りが \(1\) まで落ちたので、17 と 3120 が互いに素であることも確認できました。
ここから逆向きにたどって、\(1\) を \(17\) と \(3120\) の式で表します。
まず
\[ 1=9-8\times 1 \]
で、\(8=17-9\times 1\) なので
\[ 1=9-(17-9)=2\times 9-17 \]
さらに \(9=3120-17\times 183\) を代入すると、9 を \(3120\) と \(17\) の線形結合として表せます。
\[ 1=2(3120-17\times 183)-17 \]
\[ 1=2\times 3120-17\times 367 \]
となります。ここが暗号の美しいところなのですが、この式は
\[ -367\times 17 \equiv 1 \pmod{3120} \]
を意味します。
したがって、\(17\) の逆数は \(-367\) と合同な数です。
法 \(3120\) の世界では負の数も同値な正の数に直せるので、\(-367\equiv 2753\pmod{3120}\) と書けます。
\[ d=3120-367=2753 \]
を得ます。検算すると
\[ 17\times 2753 = 46801 \]
で、
\[ 46801 \equiv 1 \pmod{3120} \]
が成り立ちます。これで秘密指数 \(d\) が確定しました。
完成した鍵はこうなります。
公開鍵は \((n,e)=(3233,17)\) で、秘密鍵は \(d=2753\) です。
実装では秘密鍵に p や q を保持することもありますが、教科書的な理解としては「外に出してよいのは \((3233,17)\)、外に出してはいけないのは 2753」と捉えれば十分です。
せっかくなので、暗号化と復号も1回だけ通してみます。平文を \(m=65\) とすると、暗号文 \(c\) は
\[ c \equiv m^e \pmod n = 65^{17} \bmod 3233 \]
で求まります。手計算では繰り返し二乗法を使うのが定石で、この例だと結果は
\[ c=2790 \]
です。続いて復号では
\[ m \equiv c^d \pmod n = 2790^{2753} \bmod 3233 \]
を計算し、元の
\[ m=65 \]
に戻ります。
指数そのものは大きく見えますが、実際の計算は毎回法 \(3233\) で余りを取りながら進めるので、RSAが「巨大な整数をそのまま抱え続ける方式」ではないことも見えてきます。
ℹ️ Note
この小さな例は仕組みを理解するための教材です。実務の RSA では安全な乱数で素数候補を作り、厳密な素数判定を行い、公開指数には 65537 を使うのが標準です。鍵長もこの例とは比較にならない大きさで、RSA-2048 なら十進で約 617 桁になります。
この例を一度でも自分の手で追うと、公開鍵と秘密鍵が「都合よく対になっている」のではなく、\(\varphi(n)\) を知っている側だけが逆数 \(d\) を作れるという構造で結び付いていることが腹に落ちます。
とくに \(3120=17\times 183+9\) から始めて、行を1つずつ戻しながら \(d=2753\) にたどり着く瞬間は、RSAの核心が数式の中でつながる場面です。
ここまで見えれば、公開鍵で暗号化できて秘密鍵でだけ戻せる理由は、抽象論ではなく具体的な計算として理解できます。
暗号化と復号の手順を手で追う
ここでは、実際に \(m^e \bmod n\) と \(c^d \bmod n\) を手で追って、RSA の中心にある計算を指先の感覚でつかんでいきます。
平文はそのまま文字列として扱うのではなく、まず整数 \(m\) に直します。
今回の例では
\[ m=65 \]
と置き、公開鍵 \((n,e)=(3233,17)\) を使って暗号化します。式は
\[ c \equiv m^e \pmod n \]
ですから、具体的には
\[ c \equiv 65^{17} \pmod{3233} \]
を計算することになります。
17乗をそのまま展開すると手計算では追えないので、繰り返し二乗法を使います。
筆者はこの種の計算をするとき、小さなメモに「元の数」「2乗」「4乗」「8乗」「16乗」と一列に表を書き、各段で余りだけ残していきます。
手順が散らからず、どこで何を掛け合わせるかが見えます。
読んでいる方も、紙の端に同じ形の表をひとつ作ると流れがつかみやすくなります。
まず、必要な冪を順に作ります。
\[ 65^1 \equiv 65 \pmod{3233} \]
\[ 65^2 = 4225 \equiv 992 \pmod{3233} \]
\[ 65^4 \equiv 992^2 = 984064 \equiv 1232 \pmod{3233} \]
\[ 65^8 \equiv 1232^2 = 1517824 \equiv 1547 \pmod{3233} \]
\[ 65^{16} \equiv 1547^2 = 2393209 \equiv 789 \pmod{3233} \]
ここで指数の 17 は二進数で \(10001\) です。つまり
\[ 17 = 16 + 1 \]
なので、必要なのは \(65^{16}\) と \(65^1\) です。したがって
\[ 65^{17} \equiv 65^{16}\cdot 65 \equiv 789 \cdot 65 \pmod{3233} \]
\[ 789 \cdot 65 = 51285 \]
\[ 51285 \equiv 2790 \pmod{3233} \]
となり、暗号文は
\[ c=2790 \]
です。
これが \(c=m^e \bmod n\) の中身です。
公開鍵を知っている人は、この計算で平文 \(65\) を暗号文 \(2790\) に変換できます。
復号では逆向きに、秘密鍵 \(d=2753\) を使って
\[ m \equiv c^d \pmod n \]
を計算します。今回なら
\[ m \equiv 2790^{2753} \pmod{3233} \]
です。
指数が大きいので見た目は圧倒されますが、やること自体は暗号化と同じで、毎回 \(3233\) で割った余りを取りながら繰り返し二乗法を進めるだけです。
計算結果は
\[ 2790^{2753} \equiv 65 \pmod{3233} \]
となり、元の平文
\[ m=65 \]
が戻ります。
公開鍵側では \(65 \to 2790\)、秘密鍵側では \(2790 \to 65\) となるわけです。
ここで見えてくるのは、RSA の暗号化が「何か特別な変換表」を使っているのではなく、法 \(n\) の世界でのべき乗計算そのものだという点です。
このとき見逃せない条件がひとつあります。
メッセージとして扱う数 \(m\) は、\(0 \le m < n\) の範囲に入っていなければなりません。
今回の \(n\) は 3233 なので、\(m=65\) は問題ありません。
もし \(m\) が \(n\) 以上なら、法 \(n\) で余りを取った時点で別の値と区別がつかなくなります。
RSA が「\(n\) を法とする整数の世界」で動いている以上、平文もその世界に収まる形へ整えてから処理する必要があります。
この事情が、そのまま実務上の扱いにもつながります。
長い文章やファイル全体を、教科書通りにそのまま RSA で直接暗号化することはしません。
メッセージは \(n\) 未満に収まる必要があり、しかも RSA のべき乗計算は実データ向けとしては重いからです。
実際のシステムでは、短い乱数の鍵を RSA で保護し、本体の長文データは共通鍵暗号で高速に暗号化する構成が基本になります。
平文をそのまま数に埋め込むのではなく、ブロック化やパディングも入ります。
このあたりが、教科書的な RSA と実運用の RSA が分かれる境目です。
💡 Tip
手で追うなら、指数を二進数にしてから「必要な冪だけ掛ける」と決めると迷いません。今回なら \(17=10001_2\) なので、表に \(1,2,4,8,16\) 乗を書き、16乗と1乗だけを拾えば十分です。途中の巨大な数を抱え込まず、各段で余りだけ残すのがコツです。
こうして一度でも \(65^{17}\bmod 3233=2790\) と \(2790^{2753}\bmod 3233=65\) を自分でなぞってみてください。
すると \(m^e\bmod n\) と \(c^d\bmod n\) が抽象記号ではなく、復号可能な具体的操作として見えてきます。
RSAの理解は、式を眺めるだけでなく、この往復を一回手で通したところから急に深まります。
RSAはなぜ安全とされるのか
既知の素因数分解アルゴリズム(一般数体篩法
RSA が安全とされる理由は、「絶対に解けないから」ではありません。
ここが暗号の美しいところなのですが、RSA は計算量的安全性にもとづく方式です。
つまり、公開鍵に含まれる大きな合成数 \(n=pq\) を素因数分解できれば秘密鍵に迫れますが、その計算が現実的な時間と計算資源では難しい、という前提の上に成り立っています。
このとき基準になるのが、既知の古典的な素因数分解アルゴリズムです。
大きな整数に対して最良の既知手法として知られるのが一般数体篩法、英語でGNFSです。
GNFS の計算量は多項式時間ではなく、かといって単純な総当たりのような露骨な指数時間でもない、いわゆる準指数時間に属します。
直感的にいえば、桁数が伸びると必要資源は急増し、しかもその増え方は「少し鍵長を足しただけ」では済まない水準になります。
RSA の鍵長設計が 2048 ビット、3072 ビットといった刻みで語られるのは、この増え方を無視できないからです。
実際、GNFS は研究・記録更新の文脈で現実に使われてきました。
歴史的な例としては 2009 年に因数分解された RSA-768 が有名で、これは 232 桁の合成数です。
ここから見えてくるのは、既知アルゴリズムで破れるサイズは着実に伸びてきたが、2048 ビット級はその延長線上で気軽に崩せる規模ではないということです。
RSA-2048 はおよそ 617 桁に達します。
232 桁が分解できた事実と、617 桁を日常的に分解できることの間には、まだ大きな隔たりがあります。
ただし、安全性の言い方には注意が必要です。
RSA の安全性は「RSA 問題が素因数分解問題と厳密に同値だ」と証明されたわけではありません。
素因数分解ができれば RSA を破れるのは確かですが、逆向きの完全な同値性は未解決です。
それでも実務では、既知の最良攻撃が素因数分解に強く依存し、その素因数分解が現実的でないという事実が、安全性評価の中心に置かれています。
量子計算機の話も、この文脈では切り分けて捉える必要があります。
古典計算機では GNFS が基準になりますが、量子計算機ではShorのアルゴリズムが素因数分解を多項式時間で進める理論を与えます。
現時点の実用環境で RSA-2048 が量子計算機によって日常的に破られているわけではありませんが、将来リスクとしては別枠で扱うべき論点です。
古典安全性と量子安全性は、同じ「安全」の一語でまとめると見誤ります。
鍵長とセキュリティ
鍵長の議論では、「何ビットの RSA がどれだけの強さに相当するか」を共通鍵暗号の強度に引き直して見るのが定番です。
実務上の目安として、RSA-2048 は約 112 ビット相当、RSA-3072 は約 128 ビット相当と整理されます。
ここでいう 112 ビットや 128 ビットは、共通鍵暗号の総当たり耐性に合わせた比較用の尺度です。
RSA の鍵そのものが 112 ビットや 128 ビットという意味ではありません。
この差は見た目以上に重い意味を持ちます。
2048 ビットは現在も広く普及している標準的なサイズで、Web サーバ証明書や一般的な署名用途でも長く使われてきました。
一方で、より長期の安全余裕を見込みたい場面や、128 ビット級の強度に合わせて設計したい場面では 3072 ビットが視野に入ります。
4096 ビットも選択肢にはなりますが、後で触れるように性能コストが一段と増します。
筆者の感覚では、2048 ビットは「多くの環境で無理なく回る現実解」、3072 ビットは「余裕を持たせたいときの上振れ」、4096 ビットは「採用理由を明確に持って選ぶサイズ」です。
手元でOpenSSLの openssl speed rsa を回したときも、2048 から 3072 への上昇は数字として理解できる範囲でしたが、4096 にすると処理待ちの間が目に見えて伸び、端末の前で「ここから一段階景色が変わる」と感じました。
理論上の差が、ベンチマーク画面の更新テンポにそのまま出ます。
この性能差を踏まえると、現実の運用では 2048 ビットが広く普及しつつ、用途・リスク・性能要件によって 3072 や 4096 を検討するという整理になります。
たとえば証明書の互換性、署名回数、鍵の寿命、サーバの負荷を合わせて考えると、単に「長ければ安全」とは言い切れません。
暗号では、強度と処理コストは常にセットです。
数値の基準としては、RSA-2048 を約 112 ビット相当、RSA-3072 を約 128 ビット相当とする整理が使われています。
これはSSL.comやDigiCertで示される実務的な目安とも整合します。
2048 ビットが今なお主流である一方、長期保護や厳しめのセキュリティ要件では 3072 ビットへ寄せる判断が自然です。
性能特性
RSA の安全性を支える数学は魅力的ですが、実装者の目線では公開鍵暗号は共通鍵暗号より低速という事実がまず立ちはだかります。
前の節で触れた通り、RSA は大きな整数に対するモジュラべき乗を何度も行う方式で、AES のような共通鍵暗号と比べると処理の重さがまったく違います。
だから実運用では、RSA で本文データを丸ごと暗号化するのではなく、短い鍵や署名に役割を絞る構成が基本になります。
この傾向は、同じ公開鍵暗号どうしの比較でも見えます。
Cloudflare の実務的な目安では、1コアあたりの RSA 署名性能は約 200 ops/s、ECDSA は 1 万 ops/s 超とされています。
ただしこれらの数値は CPU 世代、OpenSSL のバージョンやビルドオプション、鍵サイズ、測定コマンドや条件によって大きく変わります。
したがって本文の数値は「代表例」として示すものであり、環境依存である点に注意してください。
ℹ️ Note
Cloudflare の実務的な目安では、1コアあたりの RSA 署名性能が約 200 ops/s、ECDSA が 1 万 ops/s 超と示される例があります。ただしこれらの数値は CPU 世代・コア数、OpenSSL のバージョンやビルドオプション、鍵サイズ・曲線選択、ベンチ実行コマンドなど測定環境に強く依存します。本文の数値は「代表例」として示すものであり、実際の環境では大きく変わり得る点に注意してください。
RSA の性能を見るときは、暗号方式全体をひとくくりにせず、署名生成・署名検証・鍵交換・実データ暗号化といった個々の処理を分けて考えると実像が見えます。
RSA は「公開鍵暗号だから遅い」のではなく、「大きな整数の冪乗計算を担う部分が重い」ため、用途ごとに役割を限定して使う設計がよく噛み合います。
生RSAの弱点――パディングが必要な理由
生RSAは決定的で構造が漏れやすく安全ではないこと(同じmに同じcが出る)を説明
RSA の数式そのものは美しいのですが、そのまま平文 \(m\) を \(c=m^e \bmod n\) で暗号化する生RSAは、実用上の暗号方式としては使えません。
理由の核心は、同じ平文を入れると同じ暗号文が必ず出る決定的な方式だからです。
乱数が入らないので、攻撃者は暗号文を見ただけで「これは前と同じ内容だ」と判定できます。
たとえば候補が少ないメッセージ、固定フォーマットの値、短いフラグや yes/no のような二択データでは、平文の構造がそのまま推測の足がかりになります。
ここが暗号の美しいところなのですが、数学的に復号できることと、暗号方式として安全であることは別問題です。
RSA の基本変換はあくまで「べき乗による写像」であって、意味のある平文を安全な見た目のランダムな暗号文へ変える工夫までは含んでいません。
生RSAにはメッセージの整形や乱数化がないため、同一メッセージ判定、辞書攻撃、フォーマット推測に弱く、さらに RSA の乗法的な性質から暗号文操作に対しても脆さを見せます。
この欠点を埋めるのがパディングです。
パディングというと単なる「前後に何かを足す処理」に見えますが、暗号では役割がもっと重く、乱数を混ぜて毎回違う暗号文にすること、平文に構造チェックを持たせて不正な変形を見抜くこと、安全性の証明が可能な形に寄せることまで含みます。
同じ平文でも毎回違う暗号文になれば、盗み見た第三者は比較だけで中身を絞れません。
入門書で生RSAの式が先に出てくるのは理解のためであって、実装の出発点ではないわけです。
歴史的には、この「生RSAは危ない」という認識の上に、まず広く普及したのが PKCS#1 v1.5 でした。
これは当時の実装互換性と運用事情に強く支えられた方式で、長く使われてきた実績があります。
ただし、後になって選択暗号文攻撃への弱さが問題になります。
とくに 1998 年のBleichenbacher 攻撃は象徴的で、復号した結果が「正しい形式かどうか」だけを外部から観測できる、いわゆるOracleがあると、攻撃者が暗号文を少しずつ変えながら平文を絞り込めることを示しました。
直感的に言えば、攻撃者は「この暗号文は復号すると PKCS#1 v1.5 の形式条件を満たすか」という yes/no を何度も聞けるだけで、秘密そのものに近づけます。
復号結果そのものが漏れなくても、成否の一ビットが積み重なると破壊力を持つ、というのがこの攻撃の怖さです。
筆者も CTF で、復号可否 Oracle があるだけで v1.5 暗号文が崩れていくデモを見たとき、漏れている情報量の小ささに対して結果が重すぎて息をのみました。
もちろん、PKCS#1 v1.5 がただちに無価値という話ではありません。
長年の実装蓄積があり、対策込みで互換性維持のために残っている場面もあります。
ただ、新規設計の視点では、Oracle を生まないことと方式そのものが選択暗号文攻撃に強いことを最初から満たす設計へ移るのが自然です。
💡 Tip
RSA で危険なのは「素因数分解されたから破られる」場合だけではありません。復号結果の形式エラー、応答の違い、処理の分岐といった周辺情報も、パディング設計が弱いと攻撃面になります。
現在の標準的な整理では、RSA の暗号化には RSAES-OAEP、署名には RSASSA-PSS を使います。
どちらも RFC 8017に規定されており、古い PKCS#1 v1.5 に比べて選択暗号文攻撃やエンコーディングの安全性が体系的に扱われています。
この線引きは、古い方式を全否定するためというより、互換性のために残すものと、新しく採るものを分けるためにあります。
RFC 8017には PKCS#1 v1.5 系も残っていますが、それは既存システムとの接続や移行の都合があるからです。
一方で、新規実装で暗号化方式を選べるなら RSAES-OAEP、署名方式を選べるなら RSASSA-PSS という整理になります。
標準文書が複数方式を載せているからといって、全部が同じ温度感で推奨されているわけではありません。
この視点で見ると、RSA を理解するうえで本当に押さえたいのは「大きな整数のべき乗ができる」ことだけではなく、その前後の符号化まで含めてはじめて安全になるという事実です。
入門段階では数式に目が向きますが、運用で事故を分けるのはむしろその外側です。
生RSAの式は原理の説明としては価値があります。
ただ、現代の暗号実装では、生の RSA を直接使わないこと自体が設計原則になっています。
現代のRSAの使われ方
TLS/SSLでの役割
とくに TLS 1.3(RFC 8446: TLS には RSA でそのままセッション鍵を運ぶ構成がありましたが、TLS 1.3 ではその方式が削除され、鍵交換は (EC)DHE 系が前提になっています。
ハイブリッド暗号
現代の暗号プロトコルは、ほとんどがハイブリッド暗号です。
考え方はシンプルで、公開鍵暗号は「秘密を安全に受け渡す小さな入口」に使い、その後の大きなデータ本体は共通鍵暗号で処理します。
RSAを使う場合も、暗号化する対象は巨大なファイル本文ではなく、セッション鍵のような短い共通鍵です。
「RSAで共通鍵を包む」と表現されることが多く、これはいまでも概念整理として有効です。
たとえば送信者がランダムなセッション鍵を生成し、それを受信者のRSA公開鍵で暗号化して渡す。
受信者は秘密鍵でそのセッション鍵を復号し、以後の本文はAESなどで高速に暗号化する、という流れです。
公開鍵暗号の計算コストを最小限に抑えつつ、配送経路上では鍵そのものも守れるので、実装と運用の両方で筋が通っています。
もっとも、Webの標準プロトコルでは前述の通り、鍵共有そのものはDiffie–Hellman系へ寄っています。
とはいえ、RSAがハイブリッド暗号の発想から外れたわけではありません。
RSAは「全部を暗号化する道具」ではなく、「共通鍵を安全に扱うための道具」という理解が、現代の位置づけにいちばん近いです。
RSA暗号化とRSA署名の違い(機密性 vs 真正性/完全性)を明確化
RSAの話で混同されやすいのが、RSA暗号化とRSA署名です。どちらも同じRSAの数論を使いますが、守っている性質が違います。
RSA暗号化が狙うのは機密性です。
つまり、「読めるのは正しい秘密鍵を持つ相手だけ」という性質です。
送信者は受信者の公開鍵を使ってメッセージやセッション鍵を暗号化し、受信者だけが秘密鍵で復号します。
ここで知りたいのは「第三者に読まれないか」です。
一方のRSA署名が狙うのは、真正性と完全性です。
こちらでは署名者が自分の秘密鍵で署名を作り、受信者や検証者は公開鍵でそれを検証します。
検証に成功すれば、「この署名は対応する秘密鍵の持ち主が作った」と判断でき、同時に「途中で内容が書き換えられていない」ことも確認できます。
ここで知りたいのは「誰が作ったのか」「途中で変わっていないか」です。
直感に反するかもしれませんが、暗号化と署名は逆向きの操作ではありません。
入門段階では「秘密鍵で暗号化したものが署名」だと覚えたくなりますが、実務で使うのはパディングやハッシュを含んだ別の構成です。
現代の署名はRSASSA-PSS、暗号化はRSAES-OAEPというように、用途ごとに方式が分かれています。
ここを曖昧にすると、機密性の話をしているのか、真正性の話をしているのかがすぐ崩れます。
💡 Tip
RSA暗号化は「第三者に読ませない」ためのもの、RSA署名は「本人が作り、途中で改ざんされていない」と示すためのものです。同じRSAでも、守る対象が最初から別です。
RSA vs ECC/ECDSA
現在の公開鍵暗号を選ぶ場面では、RSAと並んでECC系が必ず候補に入ります。
証明書の署名アルゴリズムとしてはECDSAが代表例で、同等の安全性を狙うならRSAのほうが鍵サイズが大きいという差があります。
RSA-2048はおおよそ112ビット相当、RSA-3072はおおよそ128ビット相当の安全性の目安が使われますが、ECCはもっと短い鍵で同水準に届きます。
証明書サイズ、ハンドシェイク時の転送量、鍵保管コストを考えると、この差はじわじわ効いてきます。
性能面でも傾向は明確です。
RSAは検証側が速く、署名生成側が重くなりやすい方式です。
実測例でも、RSA-2048では sign/s が 1988.1、verify/s が 43838.4 という開きがあります。
鍵長が上がると差はさらに目立ち、RSA-4096では sign/s が 178.9、verify/s が 11880.8 まで落ちます。
サーバ運用では「クライアントが署名を検証する回数」と「サーバが署名を生成する回数」のバランスを見る必要がありますが、署名生成を大量に抱える構成では負荷差が無視できません。
Cloudflareの例でも、1コアあたりの署名性能はRSAが約200 ops/sec、ECDSAは10000 ops/sec超という開きが出ています。
この差から、現代の新規構成ではECC系が選ばれやすい場面が増えました。
ただし、RSAが消えたわけではありません。
互換性の広さ、既存PKIとの整合、規制や社内基準、ハードウェアモジュールの対応状況まで含めると、RSAを残す判断には現実的な理由があります。
筆者も実務で証明書更新のタイミングに立ち会ったとき、単純に「新しいからECCに寄せる」ではなく、既存機器の終端能力や監査要件との噛み合わせを一つずつ確認する流れになりました。
理論上の優位だけで決まらず、互換性と性能と寿命を同時に見るのが現場の選定です。
RSA-2048 vs RSA-3072
RSAを採用する前提でも、次に出てくるのが2048ビットにするか、3072ビットにするかという選択です。
RSA-2048は現在も広く使われている標準的なラインで、桁数でいえば約617桁に達します。
安全性の目安は約112ビット相当です。
一方のRSA-3072は約128ビット相当まで余裕が増えます。
長期運用や暗号移行計画まで視野に入れると、3072を選ぶ理由ははっきりあります。
その代わり、鍵を大きくすると処理は重くなり、証明書や鍵素材も大きくなります。
RSAはもともとECCより鍵が大きいので、2048から3072への引き上げは、サーバの署名負荷やハンドシェイク時のコストをじわりと押し上げます。
ここで問われるのは「少し先まで含めた安全余裕を取るか」「現行基盤の性能とサイズを優先するか」という設計判断です。
筆者のいた現場でも、会社の証明書更新で2048と3072のどちらに寄せるかを議論したことがあります。
話題の中心は、単純な安全性比較だけではありませんでした。
終端装置のハードウェア負荷をどこまで許容するか、証明書の更新周期の中でどれだけ先の寿命を見込むか、その折り合いをどう付けるかが争点になりました。
結局この種の選択は、数学だけでなく運用年数の見積もりまで含めて決まります。
RSA-2048は依然として現実的な選択肢であり、RSA-3072はその先の余裕を買う選択肢です。
現代のRSAは、まさにそのトレードオフの中で使われています。
量子時代とRSAのこれから
Shorのアルゴリズムが理論上はRSA(素因数分解)を多項式時間で解くことを紹介
RSAの将来を語るとき、避けて通れないのがShorのアルゴリズムです。
1994年に示されたこの量子アルゴリズムは、量子コンピュータ上で素因数分解を多項式時間で解けるという点に意味があります。
ここが暗号の美しいところなのですが、RSAは「いまの古典計算機では大きな合成数の素因数分解が現実的に難しい」という前提に立っています。
その前提そのものを、量子計算では別の形で崩せる可能性があるわけです。
厳密に言えば、RSAの安全性は単純に「素因数分解問題と完全同値」とまでは言い切れません。
ただ、素因数分解が実用的に解ければRSAが破綻することは明確です。
したがって、ShorのアルゴリズムはRSAにとって理論上の本命リスクとして扱われます。
古典計算で最良クラスの手法であるGNFSが準指数時間なのに対し、量子計算では多項式時間という整理になるため、計算量の景色が根本から変わります。
ただし、2024年から2026年の実務感覚で整理すると、理論上の脅威と、いますぐの破壊可能性は分けて考えるべきです。
実用規模の量子計算機はまだ到達しておらず、少なくともこの時点でRSA-2048が直ちに現実運用の中で破られる状況ではありません。
研究では、RSA-2048級を現実的な時間で破るには、誤り訂正込みの大規模な量子計算資源が要るという見積もりが並んでいます。
小さな数を対象にした実験や教育用デモは進んでいても、現場で使われているRSA鍵をそのまま崩せる段階にはありません。
このため、現状の安全性評価としては「RSA-2048が今日明日に無意味になる」と受け取るのは行き過ぎです。
暗号の移行はシステム更新より遅くなりがちです。
証明書、HSM、署名基盤、長期保管データ、組み込み機器、監査文書まで絡むので、量子計算機が完成してから動き始めるのでは間に合わない場面が出ます。
そこで2024年から2026年にかけての議論は、いま使っているRSAの評価と、将来の置き換え準備を切り分けて進んでいます。
実際、2030年前後を見据えた移行計画では、PQC、つまりポスト量子暗号への切り替えや、従来方式と新方式を併用するハイブリッド移行が現実的な線として語られています。
いきなりRSAを捨てるのではなく、まずは新規設計でPQC対応余地を持たせ、証明書や鍵管理のポリシーを改め、相互接続性を壊さない形で段階的に寄せていく流れです。
特に署名基盤では、現行のRSA運用を維持しつつ、次の更新サイクルでPQC系アルゴリズムをどう併置するかが焦点になります。
筆者が社内の暗号ポリシー見直しに関わったときも、議論は「RSAはもう危険か」という二択では進みませんでした。
まず現行の署名方式をRSASSA-PSSへそろえ、鍵サイズの方針を整理し、そのうえで将来のPQCハイブリッドをロードマップに載せました。
実務では、この順番が効きます。
今日の安全性を保つための整備と、数年先の方式移行の準備は、同じ暗号の話でも作業の性質が違うからです。
💡 Tip
量子時代のRSAを評価するときは、「現時点で安全か」と「将来の移行をどう設計するか」を分けると見通しが立ちます。前者では直近の破綻を煽らず、後者では2030年前後を視野に入れたPQC対応を進める、という二層構えです。
この二層構えで見ると、RSAの立ち位置はまだ終わっていません。
現行システムでは引き続き使われていますし、TLSでも鍵交換の主役はすでに別方式へ移っていますが、証明書や署名の領域ではRSAが残っています。
だからこそ、当面の運用を丁寧に保ちながら、PQCへ橋を架ける発想が必要になります。
量子計算の話題は派手に見えますが、現場で求められるのは「慌てて捨てる」ことではなく、「寿命を見積もって、置き換えの順番を決める」ことです。
RSA の要点は、公開してよい鍵と秘匿すべき鍵を分け、相手と秘密を共有していない段階から暗号化や署名を成立させたことにあります。
安全性は素因数分解の困難さと強く結び付いていますが、理論上の関係は「完全同値」と雑に片づけず、計算量的仮定として捉える視点が欠かせません。
実務では生の RSA をそのまま使わず、OAEP や RSASSA-PSS、ハイブリッド暗号と署名の役割分担で扱う理解が、そのまま運用の質につながります。
関連記事(暗号図鑑や実装ガイド)は、当サイトで該当記事が公開され次第、本記事に内部リンクとして追加します。
情報セキュリティ企業での暗号実装検証を経て、暗号理論の解説に専念。公開鍵暗号からポスト量子暗号まで、数学的原理をわかりやすく伝えます。
関連記事
共通鍵暗号と公開鍵暗号の違い|図解で仕組み比較
ブラウザでHTTPSのサイトを開いた瞬間、画面には見えないところで「いま誰と鍵を決めたのか」と「その後の本文をどの鍵で守るのか」が一気に走ります。この記事では、まず共通鍵暗号の仕組みと量子コンピュータ時代に何が変わるかの節を先に参照すると、以降の議論の流れがつかみやすくなります。
AES暗号とは?歴史・仕組み・GCMまで
WebをHTTPSで開き、Wi‑Fiに接続し、ノートPCのディスク暗号化を有効にする。ふだん何気なく触れているこの3つの動作の奥には、同じ名前の暗号がいます。
公開鍵暗号の仕組みとRSAの原理図解
ブラウザの錠前アイコンを開いて証明書の詳細をのぞくと、Public-Key: RSA 2048 と Exponent: 65537 が並んでいて、公開鍵暗号は教科書の中だけの話ではなく、いま目の前の通信を支える現役技術なのだと実感します。
SSL/TLSの仕組み|HTTPSが安全な理由とTLS1.3
ECサイトを開いて、アドレスバーの鍵マークを見た瞬間、ブラウザの裏側では相手が本物かを証明書で確かめ、通信内容を読めなくし、途中で書き換えられていないことまで同時に整えています。HTTPSの正体は、盗聴を防ぐ機密性、改ざんを見抜く完全性、正しい相手を確認する認証を、TLSでまとめて実現する仕組みです。