p, q, e, E
例:
p = 23917
q = 23929
e = 8731
E = 109861231
n = p × q
φ(n) = (p - 1) × (q - 1)n = 23917 × 23929 = 572068093
φ(n) = (23917 - 1) × (23929 - 1) = 23916 × 23928 = 572020248+-------------------+
| RSA モジュロ空間 |
+-------------------+
p = 23917
q = 23929
┌────────────────────┐
│ n = p × q │ → 572068093
└────────────────────┘
┌────────────────────┐
│ φ(n) = (p-1)(q-1) │ → 572020248
└────────────────────┘
d ≡ e⁻¹ mod φ(n)
e の逆元を求めるために、拡張ユークリッドの互除法(Extended Euclidean Algorithm)を使います。
+---------------------------------------+
| 拡張ユークリッド互除法 |
+---------------------------------------+
| e = 8731, φ(n) = 572020248 |
| 目的:8731 × d ≡ 1 mod 572020248 |
| 結果:d = 428126443 |
+---------------------------------------+
※ d を求めるには以下のように「a×x + b×y = gcd(a,b)」の形にし、x を mod m で正に直します。
ここがRSAの心臓部です!
M ≡ E^d mod n
これを高速に行うために「繰り返し二乗法(Binary Exponentiation)」を使います。
E = 109861231
|
v
+--------------------------+
| 繰り返し二乗法で |
| M = E^d mod n を計算 |
| d = 428126443 |
| n = 572068093 |
+--------------------------+
結果:
M = 75 ← ASCIIコード
M = 75 → 'K'+------------------+
| ASCII 変換 |
+------------------+
| M = 75 → 'K' |
+------------------+
graph TD;
A[入力: p, q, e, E] --> B[n = p × q]
B --> C[φ(n) = (p-1)(q-1)]
C --> D[d = e⁻¹ mod φ(n)]
D --> E[M = E^d mod n]
E --> F[文字 = ASCII(M)]
出力:K
| ステップ | 内容 | 実行時間・効率 |
|---|---|---|
| n, φ(n) | 乗算のみ | O(1) |
| d計算 | 拡張ユークリッド | O(log φ(n)) |
| 復号 | 繰り返し二乗法 | O(log d) |
| ASCII変換 | Number → String | O(1) |