RSA の数理(モジュラ冪乗・オイラー関数・CRT 高速化)
RSA がなぜ復号で元に戻るのか。オイラーの定理から鍵生成・暗号化・復号の成立を導き、CRT 高速化と安全な鍵長、教科書 RSA が危険な理由まで原理から押さえる。
- 1.RSA の正しさは「m^(ed) ≡ m (mod n)」が成り立つことに尽きる。ed ≡ 1 (mod λ(n)) を満たす鍵を作れば、オイラーの定理から復号で必ず元に戻る。
- 2.復号は秘密鍵 d が大きく重い。p と q を知る本人だけは CRT で mod p と mod q に分けて計算でき、約4倍高速化できる(OpenSSL もこれを使う)。
- 3.教科書 RSA は決定的で危険。同じ平文が同じ暗号文になり、低指数攻撃も成立する。実運用では暗号化に OAEP、署名に PSS のパディングが必須。
RSA は「冪乗して mod を取るだけ」
公開鍵暗号 の代表格である RSA は、突き詰めると 整数を整数乗して、ある数 n で割った余りを取る という一行の演算(モジュラ冪乗)でできています。暗号化も復号も署名も、すべて同じ形です。
暗号化: c = m^e mod n (公開鍵 (e, n) で)
復号: m = c^d mod n (秘密鍵 (d, n) で)
ここで n(法)と e(公開指数)は公開、d(秘密指数)だけが秘密です。c = m^e mod n から m を逆算するのが難しい一方、d を知る本人は c^d mod n で一発で戻せる。なぜ戻るのか、なぜ逆算が難しいのかを、ここから数論で詰めていきます。
a ≡ b (mod n) は「a と b を n で割った余りが等しい(合同)」の意味です。gcd(a,b) は最大公約数、a と b が互いに素とは gcd(a,b)=1 のこと。本文では数式を LaTeX ではなくインラインコードとプレーンテキストで表します。
鍵生成:n・e・d をどう決めるか
鍵生成は次の手順です。各ステップに理由があります。
- 大きな素数
p,qを独立にランダム生成し、n = p * qを作る。 - オイラー関数
φ(n) = (p-1)(q-1)、またはカーマイケル関数λ(n) = lcm(p-1, q-1)を計算する。 gcd(e, λ(n)) = 1となる公開指数eを選ぶ(実務ではe = 65537固定が定番)。eの逆元として、e * d ≡ 1 (mod λ(n))を満たす秘密指数dを拡張ユークリッド互除法で求める。- 公開鍵は
(e, n)、秘密鍵はd(実装上はp, qも保持)。
φ(n) は「1 から n までで n と互いに素な整数の個数」です。n = pq では φ(n) = (p-1)(q-1) になります。d は e の mod λ(n) における逆数 にあたり、この e*d ≡ 1 という関係こそが復号成立の核心です。
古典的な教科書は φ(n) = (p-1)(q-1) を法に d を求めますが、RFC 8017(PKCS#1)と実運用は λ(n) = lcm(p-1, q-1) を使います。λ(n) は φ(n) の約数なので、より小さい d が得られ復号が速くなります。どちらで作った d でも復号は正しく成立します(復号成立の条件は ed ≡ 1 (mod λ(n)) であり、φ(n) は λ(n) の倍数なので、φ(n) を法に作った d も自動的にこの条件を満たすため)。p-1 と q-1 を裸の積でなく lcm で束ねるのがポイントです。
なぜ復号で元に戻るのか:オイラーの定理から導出
RSA の正しさは、ただ一つの主張に集約されます。
任意の m(0 ≤ m < n)について m^(e*d) ≡ m (mod n)
これが成り立てば、c^d = (m^e)^d = m^(ed) ≡ m となり、復号で平文が戻ります。導出の道具は オイラーの定理 です。
オイラーの定理: gcd(a, n) = 1 ならば a^φ(n) ≡ 1 (mod n)
鍵生成で e*d ≡ 1 (mod λ(n)) を課したので、ある整数 k を使って e*d = 1 + k*λ(n) と書けます。m と n が互いに素なら、カーマイケルの定理(m^λ(n) ≡ 1 (mod n)。mod p と mod q でそれぞれフェルマーの小定理を使い CRT で束ねると、λ(n) = lcm(p-1, q-1) を指数にした合同式が成立する)から、
m^(ed) = m^(1 + k·λ(n))
= m · (m^λ(n))^k
≡ m · 1^k
= m (mod n)
となり、元に戻ります。問題は m が p または q の倍数で gcd(m,n) ≠ 1 の場合ですが、ここで n = pq の合成数構造が効きます。mod p と mod q のそれぞれで m^(ed) ≡ m が成り立つことを示し(一方が m ≡ 0 の自明ケースでも成立する)、中国剰余定理(CRT) で mod n に合成すれば、すべての m について成立が言えます。つまり RSA の正しさそのものが CRT に支えられています。
CRT による復号高速化
CRT は正しさの証明だけでなく、復号の高速化にも直接使えます。c^d mod n は d が n と同程度に巨大なため重い演算ですが、p と q を知る本人だけは、計算を mod p と mod q の二つに分割できます。
事前計算(秘密鍵に同梱):
dp = d mod (p-1)
dq = d mod (q-1)
qInv = q^(-1) mod p
復号(Garner のアルゴリズム):
m1 = c^dp mod p
m2 = c^dq mod q
h = (qInv * (m1 - m2)) mod p
m = m2 + h * q
ポイントは二つあります。第一に、指数が d から dp, dq(それぞれ約半分のビット長)に縮む。第二に、法が n から p, q(約半分のビット長)に縮む。モジュラ冪乗の計算量はビット長の3乗に比例するため、半分のサイズの計算を2回行うほうが、フルサイズを1回行うより圧倒的に速く、理論上およそ4倍 の高速化になります。OpenSSL をはじめ実装はこの CRT 復号を標準採用しており、PKCS#1 の秘密鍵には dp, dq, qInv が最初から格納されています。
CRT 復号は速い反面、計算途中に故障(ビット反転)が混入すると致命的です。m1 か m2 の片方だけが誤った値 m' になると、gcd(m^e - m'^e mod n, n) の計算から n が一発で素因数分解されてしまう(Bellcore 攻撃)。電圧グリッチやレーザー照射でこの故障を意図的に起こすのがフォルトインジェクションです。対策として、実装は復号結果を再度暗号化して入力と一致するか検証する、などの故障検知を入れます。
安全性の根拠:素因数分解の困難性
RSA の安全性は「n から d を求められないこと」に依存し、それは実質 n = pq の素因数分解が難しいこと に等しくなっています。p, q がわかれば λ(n) が計算でき、λ(n) がわかれば e の逆元として d が即座に求まるからです。逆に n を因数分解する効率的な古典アルゴリズムは知られていません(一般数体ふるい法でも準指数時間)。
| RSA 鍵長 | おおよその対称鍵相当強度 | 位置づけ |
|---|---|---|
| 1024 bit | 約 80 bit | 危殆化。新規利用は禁止 |
| 2048 bit | 約 112 bit | 現行の実用最小ライン |
| 3072 bit | 約 128 bit | 長期保護で推奨(AES-128 相当) |
| 4096 bit | 約 140 bit 超 | より長期・高保証用途 |
注意すべきは、鍵長を倍にしても強度は倍にならない点です。同じ強度なら RSA は楕円曲線暗号(ECC)より鍵がはるかに長く(128ビット強度で RSA-3072 対 ECC-256)、これが新規システムで ECC が好まれる理由です。さらに将来的には、Shor のアルゴリズム を実装した大規模量子コンピュータが素因数分解を多項式時間で解くため、RSA は原理的に破られます。耐量子(PQC)への移行が議論されるのはこのためです。
教科書 RSA はなぜ危険か:パディングの必然性
ここまでの c = m^e mod n をそのまま使う「教科書 RSA」は、実は そのまま使うと危険 です。理由は決定性とべき乗の代数的性質にあります。
- 決定的である:同じ平文は必ず同じ暗号文になる。攻撃者は候補平文を片端から暗号化して照合でき、選択肢が少ない平文(Yes/No、暗証番号など)は即座に特定される。
- 低指数攻撃:
e=3でmが小さくm^3 < nだと、mod が効かず単なる立方根で平文が戻る。同じ平文を3人の異なるnに送ると、CRT(Håstad 攻撃)で復元される。 - 準同型性:
(m1^e)(m2^e) ≡ (m1·m2)^e (mod n)。暗号文を掛け合わせると平文を掛けた暗号文が作れてしまい、選択暗号文攻撃や署名の偽造に悪用される。
これらを潰すのが パディング です。暗号化には OAEP(Optimal Asymmetric Encryption Padding)を使い、平文に乱数(シード)とハッシュを混ぜてから冪乗します。これにより同じ平文でも毎回異なる暗号文になり(確率的暗号化)、上記の構造的攻撃が成立しなくなります。署名には PSS(Probabilistic Signature Scheme)を使います。素のハッシュへの署名は準同型性で偽造の余地が残るため、乱数入りのエンコードで安全性を担保するわけです。
RSA を生で(パディングなしで)実装・使用してはいけません。実装ライブラリの選択肢に古い PKCS#1 v1.5 パディングがありますが、これは Bleichenbacher 攻撃(パディングの正否を漏らすオラクルを使う適応的選択暗号文攻撃)の標的になりやすく、暗号化用途では非推奨です。新規実装は暗号化に RSA-OAEP、署名に RSA-PSS を選んでください。なお RSA は仕様上、平文が法 n より小さい必要があり、大きなデータは直接暗号化できません。実務では「RSA で共通鍵を包み、本体は AES で暗号化する」ハイブリッド構成が基本です。
まとめ
RSA の正しさは m^(ed) ≡ m (mod n) の一点に集約され、これは鍵生成で ed ≡ 1 (mod λ(n)) を課し、オイラーの定理と CRT を使って導けます。復号は秘密指数 d が重いため、p, q を知る本人だけが CRT で mod p/mod q に分割して約4倍高速化します。安全性は素因数分解の困難性に依存し、安全な鍵長は現状 2048 ビット以上(長期は 3072 以上)が目安です。そして教科書 RSA は決定性・準同型性ゆえに危険で、暗号化は OAEP、署名は PSS のパディングが必須です。
土台となる公開鍵と署名の考え方は 暗号の基礎、鍵と持ち主の結びつきを保証する仕組みは 公開鍵基盤(PKI)と証明書、一方向関数との対比は ハッシュ化と暗号化の違い と合わせて押さえると、RSA が実システムのどこに効いているかが見えてきます。
セキュリティ Article
RSA の数理(モジュラ冪乗・オイラー関数・CRT 高速化)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
RSA
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 5
導入後に効く点
復号は秘密鍵 d が大きく重い。p と q を知る本人だけは CRT で mod p と mod q に分けて計算でき、約4倍高速化できる(OpenSSL もこれを使う)。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 5
判断チェックリスト
- 自社の用途が「RSA / 公開鍵暗号」に近いか確認する。
- 強みである「RSA の正しさは「m^(ed) ≡ m (mod n)」が成り立つことに尽きる。ed ≡ 1 (mod λ(n)) を満たす鍵を作れば、オイラーの定理から復号で必ず元に戻る。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。