✨ RSAは実は「遅い」暗号:ハイブリッド暗号とは
まず大事な事実をお伝えします。RSAは実際のWebサイト通信でデータの暗号化に直接使われることはほとんどありません。
理由はシンプルで、RSAは処理が遅いのです。大きな数の累乗計算を繰り返すRSAは、AESなどの対称暗号と比べて数百〜数千倍遅くなります。
では、RSAはどこで使われているのでしょうか?答えは「ハイブリッド暗号」の仕組みの中です。
🔄 ハイブリッド暗号の流れ(TLS 1.2以前の場合)
💡 RSAは「AESの鍵を安全に渡す役」のみ担当。実データの暗号化はAESが高速に処理。
⚠️ TLS 1.3(2018年〜現在の標準)では異なります
TLS 1.3ではRSAによる鍵交換が廃止され、ECDHE(楕円曲線ディフィー・ヘルマン鍵交換)による前方秘匿性のある鍵共有が必須となっています。RSAはTLS 1.3でも「サーバー証明書の署名検証」には引き続き使われますが、セッション鍵の暗号化(鍵交換)には使われません。

二つの暗号を組み合わせるの?なんか複雑…

逆に考えると天才的なんだよ!「RSAの安全性」と「AESの速さ」のいいとこどり。宅配ボックスに例えると「ボックスの鍵をRSAで安全に渡して、荷物はAESで守る」ようなイメージね🐾
🔸 RSAパディング:素朴なRSAの落とし穴
「素朴なRSA(教科書RSA)」には実は重大な脆弱性があります。同じ平文は必ず同じ暗号文になるため、攻撃者が特定のメッセージを推測できてしまいます(意味的安全性の欠如)。また、暗号文を巧みに細工して復号させる選択暗号文攻撃(CCA)にも脆弱です。
この問題を解決するのがパディングです。現在のRSAでは必ずパディングを使います:
- OAEP(最適非対称暗号化パディング):暗号化前にランダムな値を混ぜます。現在の標準。PKCS#1 v2.0(RFC 2437)以降で規定。
- PKCS#1 v1.5パディング:古い方式。一部のシステムで使われていますが、脆弱性(ROBOT攻撃など)が報告されており非推奨。
- PSS(Probabilistic Signature Scheme / RSASSA-PSS):デジタル署名専用のパディング。現在の標準。
⚠️ 重要:パディングなしのRSAは絶対に使わない
教科書的な「素のRSA」は安全ではありません。必ずOAEP(暗号化用)またはPSS(署名用)のパディングを使った実装を選んでください。信頼できるライブラリ(OpenSSL等)を使えば自動でパディングが適用されます。
🔸 RSAのデジタル署名への応用
RSAは暗号化だけでなく、デジタル署名にも使われます。面白いことに、暗号化とは逆の方向で鍵を使います:
🔒 暗号化
公開鍵で暗号化 → 秘密鍵で復号
「誰でも入れるが、持ち主だけ開けられる」
✍️ デジタル署名
秘密鍵で署名 → 公開鍵で検証
「持ち主だけが署名でき、誰でも確認できる」
デジタル署名の具体的な流れ:送信者がメッセージのハッシュ値を自分の秘密鍵で署名 → 受信者が公開鍵で検証することで「このメッセージは確かに本人から来た」「改ざんされていない」を確認できます。
🔸 現在のRSAの正直な評価
| 評価項目 | 評価 | コメント |
|---|---|---|
| 現在の安全性(古典コンピュータ) | ✅ 高い | RSA-2048以上なら実用上安全 |
| 将来の安全性(量子コンピュータ) | ⚠️ 疑問あり | ショアのアルゴリズムで原理上解読可能 |
| 処理速度 | ⚠️ 低い | AESの数百〜千倍遅い |
| 鍵サイズ | ⚠️ 大きい | 楕円曲線暗号(ECC)より鍵が大きい |
| 実績・信頼性 | ✅ 最高水準 | 1977年の発明から約50年(2026年現在)、世界中で検証済み |
📌 まとめ
- RSAはデータ暗号化に直接使うのではなく、AESの鍵を安全に渡す「ハイブリッド暗号」で使う(TLS 1.2以前の方式。TLS 1.3以降はECDHEに移行済み)
- 「素のRSA」は危険。OAEPパディングとの組み合わせが現在の標準
- 暗号化と逆方向(秘密鍵で署名・公開鍵で検証)でデジタル署名にも使用
- 現在のスパコンに対しては十分安全。ただし量子コンピュータへの長期備えが必要
- 代替として楕円曲線暗号(ECDSA)や耐量子暗号(格子ベース)への移行も進んでいる

RSAは決して万能じゃないし、遅いという弱点もある。でも、それを「ハイブリッド暗号」や「パディング」といった天才的な工夫でカバーして、現在のインターネットを支えているんだよ!
「仕組みと限界を正しく知った上で使いこなす」——これこそが、本物のITエンジニアの視点だね🐾
本サイトのRSA暗号の解説は、仕組みをわかりやすく理解するための「教育用(Textbook RSA)」として簡略化されています。
- 実際のシステムでは、十分な鍵長(RSA-2048以上など)が必要です。
- 解説されている純粋なRSA(パディングなし)のままでは、同じメッセージが常に同じ暗号文になるなどの脆弱性があります。実際の通信や開発では、必ずOAEPなどのパディング方式を適用した安全なライブラリを使用してください。