【この記事から読み始めた方へ】
この記事は「公開鍵暗号」を解説する3部作の完結編(第3部)だよ🐾
現実のインターネットで、公開鍵暗号(RSA)が共通鍵暗号(AES)とどう組み合わせて使われているか、また「デジタル署名」としての役割について解説するね。
・公開鍵暗号の基礎や計算の仕組みから知りたい人は第1部(概念編)・第2部(実践編)へ
・「そもそもAES(共通鍵暗号)って何?」という人は、先に【共通鍵暗号】の完全解説記事を読んでみてね🐾
RSAは、あなたの通信データを一切暗号化していない
あなたが今日開いたすべてのHTTPSサイト。そのデータを暗号化したのはAESです。RSAではありません。
では、RSAは何をしているのでしょうか。
1. RSAの本当の仕事——AESの鍵を安全に渡す
理由はシンプルで、RSAは処理が遅いのです。大きな数の累乗計算を繰り返すRSAは、AESなどの対称暗号と比べて数百〜数千倍遅くなります。
だからこそ、RSAは「ハイブリッド暗号」という仕組みの裏側で動いています。
🔄 ハイブリッド暗号の基本の流れ(従来のTLSなどの場合)
- クライアントがサーバーの公開鍵(RSA用)を受け取る
- クライアントがランダムなセッション鍵(AES用)を生成する
- そのセッション鍵をRSAで暗号化してサーバーに送る
- サーバーがRSAの秘密鍵でセッション鍵を復号する
- 以降の通信はAESで高速に暗号化される
💡 つまりRSAは「AESの鍵を安全に渡す」ためだけに使い、実際のデータ暗号化はAESが担当します。
(※注:現在の最新通信規格『TLS 1.3』では、将来サーバーの秘密鍵が漏洩しても過去の通信まで遡って解読されない『前方秘匿性(PFS:Perfect Forward Secrecy)』を必須とするため、鍵交換には使い捨ての『楕円曲線ディフィー・ヘルマン鍵共有(ECDHE)』等が用いられ、この『RSAで鍵を暗号化して渡す方式』は廃止されました。現在TLSにおけるRSAは、第3章で解説する『デジタル署名(身元証明)』の役割に特化して使われています)
これは宅配ボックスではなく、もっと正確な比喩があります。
「金庫の暗証番号を、別の金庫に入れて渡す。その金庫を開けられるのは受け取った人だけ。開けたら中の暗証番号で、以降はずっとその番号を使う。」
RSAの役割はこれです。

「RSAの安全性」と「AESの速さ」のいいとこどり。宅配ボックスに例えると「ボックスの鍵をRSAで安全に渡して、荷物はAESで守る」ようなイメージね🐾
2. 素のRSAが危険な理由——パディングという解決策
RSA暗号の「パディング(Padding)」。暗号技術を初心者向けに紐解いていく上で、この概念は「なぜ現代の暗号が安全なのか」を知るための非常に面白くて重要なテーマです。
専門用語をなるべく使わずに、身近な例えを使ってわかりやすく解説します。
1. そもそもパディングとは?
パディング(Padding)を直訳すると「詰め物」や「緩衝材」という意味です。
RSA暗号におけるパディングとは、「短いメッセージを暗号化する前に、デタラメなデータ(乱数など)を付け足して、データの長さを一定のサイズに水増しする作業」のことです。
2. なぜ「詰め物」が必要なのか?
実は、数学の教科書に載っている基本そのままのRSA暗号(教科書的RSAと呼ばれます)には、「同じメッセージを暗号化すると、毎回必ず同じ暗号文になってしまう」という致命的な弱点があります。
たとえば、敵軍に「YES」か「NO」のどちらかの短い通信を送るとします。
- 「YES」を暗号化 →
A1 B2 C3 - 「NO」を暗号化 →
9F 8E 7D
もしパディングを行わない場合、何度「YES」を送っても必ず A1 B2 C3 になります。これでは、暗号を解読できなくても、通信を盗聴している攻撃者が「あ、また A1 B2 C3 が送られたから、答えはYESだな」とパターンから中身を推測できてしまうのです。
3. パディングがもたらす魔法(乱数による変化)
ここでパディング(詰め物)の出番です。メッセージを箱(暗号化ブロック)に入れる際、空いたスペースに毎回デタラメな詰め物をギュウギュウに敷き詰めます。
- 1回目の「YES」+[デタラメな詰め物A] → 暗号化 →
X5 9P 2L - 2回目の「YES」+[デタラメな詰め物B] → 暗号化 →
K3 7M 1W - 3回目の「YES」+[デタラメな詰め物C] → 暗号化 →
R9 4Q 8Z
中身の「YES」は同じでも、一緒に入っている「詰め物」が毎回違うため、出来上がる暗号文は毎回まったく違う姿に変わります。 これにより、攻撃者はパターンから内容を推測することが完全に不可能になります。
4. 代表的なパディングの方式
現在、RSA暗号で使われているパディングには主に以下の2つがあります。
- OAEP(現代の標準):
最適非対称暗号パディング(Optimal Asymmetric Encryption Padding)の略です。メッセージと乱数をハッシュ関数やマスク生成関数(MGF)を用いてフェイステル構造のように複雑に混ぜ合わせます。「ランダムオラクルモデル」という数学的枠組みで選択暗号文攻撃(CCA)に対する安全性が証明されている非常に強固な現代の標準です。これからRSAを実装する場合は基本的にこちらを使います。 - PKCS#1 v1.5(古い方式):
昔から使われている標準的な詰め物です。しかし、復号時のパディング形式の正誤によるサーバーのわずかな応答の違い(エラーメッセージや処理時間)を「神託(オラクル)」として利用し、暗号文から元の平文を逆算する『パディングオラクル攻撃(Bleichenbacher攻撃等)』の標的となる脆弱性があり、現在新しいシステムでの使用は非推奨とされています。
パディングの効果を体験してみましょう
実際に「詰め物なし(教科書的RSA)」と「詰め物あり(OAEP)」で、暗号文がどう変わるのかをシミュレーションするツールを用意しました。「暗号化する」ボタンを何度か押して、結果の違いを観察してみてください。
パディングなし (Textbook RSA)
メッセージが同じなら、結果は常に同じ。
パディングあり (RSA-OAEP)
乱数が混ざるため、毎回結果が変わる!
パディングは、一見すると無駄なデータを増やしているように見えますが、暗号の世界において「予測不可能性」を生み出し、安全性を根底から支える縁の下の力持ちです。初心者に暗号技術の仕組みを説明する際、「毎回違う形に化けさせるための魔法の緩衝材」といった表現を用いると、とてもイメージが伝わりやすくなります。
3. 印鑑の代わりとなる「デジタル署名」
私たちは現実世界で契約を交わすとき、契約書に印鑑を押したり自筆のサインをします。
これによって「本人が承認した文書だ(本人確認)」、「後から勝手に内容を書き換えられていない(改ざん検知)」、そして「後になって『自分はサインしていない』と嘘をつけない(否認防止:Non-repudiation)」という3つの強力な証拠を持たせることができます。
では、コンピュータの世界(PDFなどの電子データ)ではどうでしょうか?
印鑑の画像をペタッと貼り付けても意味がありません。電子データの世界では、画像は誰でも簡単に100%完璧なコピーが作れてしまうからです。
印鑑の本質は「赤いインクのマーク」じゃなくて、「他人が絶対に真似できないこと」にあるんだね🐾 じゃあ、電子の世界で「他人が絶対に真似できないもの」ってなんだろう?
RSAのもう一つの顔:逆方向の魔法
ここで登場するのが、RSA暗号です。
RSAには、暗号化とは違う、もう一つの驚くべき使い道があります。概念としては、暗号化とは「逆の方向」で鍵を使います(※厳密には、決定論的な署名による偽造攻撃を防ぐため、ハッシュ値に乱数ソルトを付与して安全性を数学的に証明可能な『RSA-PSS(Probabilistic Signature Scheme)』という署名専用のパディング形式が必須ですが、土台としては逆方向の累乗計算をします):
🔒 暗号化(第2部でやったこと)
公開鍵で暗号化 → 秘密鍵で復号
「誰でも入れられるが、持ち主だけが開けられる」
✍️ デジタル署名
秘密鍵で署名 → 公開鍵で検証
「持ち主だけが作れて、誰でも本物だと確認できる」
これはRSAの数学が持つ対称性です。「E乗してからD乗しても、D乗してからE乗しても結果は同じになる」という累乗の対称性とオイラーの定理が、暗号化と署名という全く異なる用途を同時に可能にしています。
あなたは事前に用意した自分だけの「秘密鍵」で文書を暗号化し、署名として文書にくっつけて公開します。
受信者は誰でもあなたの「公開鍵」を持っているので、その署名を復元して中の文書と見比べることができます。もし一致すれば、「この暗号を作れるのは秘密鍵を持つ本人だけだ!」と証明され、承認された正しい文書だと言えるのです。
なぜ「ハッシュ値」を使うのか?
しかし、ここで一つ問題が起きます。
文書そのものを秘密鍵で暗号化して署名にすると、署名のサイズが文書と同じ巨大な量になってしまうのです。データ量が本来の倍になってしまいますね。
そこで現実の世界では、文書そのものではなく、文書から不可逆な計算で生成した『ハッシュ値(データの指紋:SHA-256など)』だけを計算し、その小さなハッシュ値を暗号化して署名にします。
これならどんなに長大な契約書でも署名は常に数十〜数百バイトの一定サイズに収まります。受信者は、受け取った文書から自分でハッシュ値を計算し、復元した署名のハッシュ値と一致するかを調べれば、同様に「本人確認」と「改ざん防止」が完璧に行えるのです。
4. 現在のRSAの正直な評価表
コンピュータの進化との戦い
「絶対に破られない」とされるRSA暗号も、鍵の長さ(数字の大きさ)が短ければ解読されてしまいます。
かつて使われていた「RSA-512(155桁)」は、すでに完全に解読され、現在は廃止されています。実はRSA-512が初めて因数分解されたのも1999年のことで、先の記事で解説した共通鍵暗号の「DES」が専用マシンで解読されたのと同じ時代の話です(※ただしDESの解読が22時間だったのに対し、RSA-512の因数分解は分散コンピューティングを使って約6ヶ月を要した大規模な研究プロジェクトでした)。いずれもコンピュータの進化に追いつかれた暗号という点で共通しており、現在はより桁数の大きい「RSA-2048(617桁)」以上を使用することが世界の標準となっています。
| 評価項目 | 評価 | コメント |
|---|---|---|
| 現在の安全性(古典コンピュータ) | ✅ 高い | RSA-2048以上なら実用上安全 |
| 将来の安全性(量子コンピュータ) | ⚠️ 脆弱 | ショアのアルゴリズムで原理上解読可能(NISTは耐量子計算機暗号/PQCへの移行を推進中) |
| 処理速度 | ⚠️ 低い | AESの数百〜数千倍遅い |
| 鍵サイズ | ⚠️ 大きい | 楕円曲線暗号(ECC)より鍵が大きい |
| 実績・信頼性 | ✅ 最高水準 | 1977年の発明から約50年(2026年現在)、世界中で検証済み |
RSAは決して万能ではありません。遅く、鍵が大きく、将来は量子コンピュータに対して脆弱になります。
それでも約50年間、世界のインターネットを支え続けています。なぜか。
それは「弱点を正直に公開し、工夫で補ってきた」からです。
共通鍵暗号の記事で解説したDESが、設計プロセスの不透明さを抱えたまま世に出て最終的に破られたのと対照的に、RSAはすべてをオープンにし、世界中の天才たちに攻撃されることで信頼を積み上げてきました。
📌 まとめと次のステップ
- RSAはデータ暗号化に直接使うのではなく、AESの鍵を安全に渡す「ハイブリッド暗号」で使う
- 「素のRSA」は危険。OAEPパディングとの組み合わせが現在の標準
- 暗号化と逆方向(秘密鍵で署名・公開鍵で検証)でデジタル署名にも使用
- 現在のスパコンに対しては十分安全。ただし量子コンピュータへの長期備えが必要

RSAは決して万能じゃないし、遅いという弱点もある。でも、それを「ハイブリッド暗号」や「パディング」といった天才的な工夫でカバーして、現在のインターネットを支えているんだよ!
「仕組みと限界を正しく知った上で使いこなす」——これこそが、本物のITエンジニアの視点だね🐾
🎯 この署名が、今この瞬間も数兆円を守っている
デジタル署名の仕組みを覚えていますか。
秘密鍵を持つ者だけが署名でき、誰でも公開鍵で検証できる。
ビットコインの送金は、この仕組みだけで成立しています。銀行も、政府も、第三者も介在しない。
秘密鍵を持つ者だけが、その資産を動かせる。数学がそれを保証しているから。
3記事を読み終えたあなたは今、なぜビットコインが銀行なしで機能するのかを、「ただの言葉」ではなく「数学のレベル」で理解しています。
🧮 数学が好きなあなたへ
RSA暗号の基礎となる「素因数分解の困難性」や、現代暗号に欠かせない「乱数」「ハッシュ関数」についてもっと深く知りたい方は、こちらの記事もおすすめです!
👉 現代暗号を支える3つの応用数学 を読む