Home
Blog
Products
Profile
Study
Collatz
© 2024 Oizumi Yuta

RSA 暗号の仕組み

2025-1-1

RSA 暗号とは

公開鍵暗号方式の 1 つ。

  • mmm: 平文
  • ccc: 暗号文
  • eee: 公開鍵
  • ddd: 秘密鍵

とする。

メッセージ送信者と受信者間で暗号化通信を行う際、送信者側で平文 mmm を暗号化(これを E(m)E(m)E(m) と書く)する。一方受信者側で暗号文 ccc を復号(これを D(c)D(c)D(c) と書く)する。このとき D(E(m))=mD(E(m)) = mD(E(m))=m は、平文を暗号化し、その暗号文から元の平文を復号できたことを意味する。

RSA 暗号は大きな素数 p, qp,\ qp, q を用いて n=pqn = pqn=pq の mod 計算で暗号化・復号を行う。平文 mmm を

E(m)=(m mod n)eE(m) = (m \bmod n)^eE(m)=(mmodn)e

で暗号化し、暗号文 ccc を

D(c)=(c mod n)dD(c) = (c \bmod n)^dD(c)=(cmodn)d

で復号する。すなわち RSA 暗号において平文を暗号化し、その暗号文から元の平文を復号できることは

med≡m(modn)m^{ed} \equiv m \pmod{n}med≡m(modn)

を意味する。

RSA 暗号で使われる数学

以下、(a, b)(a,\ b)(a, b) で整数 a, ba,\ ba, b の最大公約数を表す。ϕ(n)\phi(n)ϕ(n) を nnn と互い素であるような nnn 以下の自然数の個数とする。ϕ\phiϕ をオイラー関数という。RSA 暗号で使われる数学ではオイラーの定理「 (a, b)=1(a,\ b) = 1(a, b)=1 ならば

aϕ(b)≡1(modb)a^{\phi(b)} \equiv 1 \pmod{b}aϕ(b)≡1(modb)

が成り立つ」が重要である。

参考:

https://mathlandscape.com/euler-function/

https://manabitimes.jp/math/667

ϕ\phiϕ をオイラー関数、 p, qp,\ qp, q を異なる奇素数とし、n:=pqn := pqn:=pq とおく。(e, ϕ(n))=1, 1<e<ϕ(n)(e,\ \phi(n)) = 1,\ 1\lt e \lt \phi(n)(e, ϕ(n))=1, 1<e<ϕ(n) となる eee を選ぶ(※)。また

ed≡1(modϕ(n)), 1<d<ϕ(n)ed \equiv 1 \pmod{\phi(n)},\ 1\lt d \lt \phi(n)ed≡1(modϕ(n)), 1<d<ϕ(n)

となる ddd を選ぶ(※)。このとき 1≤m<n1\le m \lt n1≤m<n に対して

med≡m(modn)m^{ed} \equiv m \pmod{n}med≡m(modn)

が成り立つ。

【証明】

  • (m,n)=1(m, n) = 1(m,n)=1 の場合

オイラーの定理により mϕ(n)≡1(modn)m^{\phi(n)} \equiv 1 \pmod{n}mϕ(n)≡1(modn) だから成り立つ。

  • (m,n)=p(m, n) = p(m,n)=p の場合

m≡0(modp)m\equiv 0 \pmod{p}m≡0(modp) だから med≡m(modp)m^{ed} \equiv m \pmod{p}med≡m(modp) となる。また、オイラーの定理より mq−1≡1(modq)m^{q - 1} \equiv 1 \pmod{q}mq−1≡1(modq) だから mϕ(n)≡1(modq)m^{\phi(n)} \equiv 1 \pmod{q}mϕ(n)≡1(modq) となる。よって med≡m(modq)m^{ed} \equiv m \pmod{q}med≡m(modq) となる。(p, q)=1(p,\ q) = 1(p, q)=1 だから med≡m(modn)m^{ed} \equiv m \pmod{n}med≡m(modn) となる。

  • (m,n)=q(m, n) = q(m,n)=q の場合

(m,n)=p(m, n) = p(m,n)=p の場合において ppp と qqq を入れ替える。

※このような e, de,\ de, d は必ず存在する。e, de,\ de, d の候補は ϕ(ϕ(n))−1\phi(\phi(n)) - 1ϕ(ϕ(n))−1 個ある。ここで p, qp,\ qp, q は奇素数だから

ϕ(ϕ(n))=ϕ((p−1)(q−1))=2k(1−12)l, (k≥2, l≥1)\displaystyle \phi(\phi(n)) = \phi((p-1)(q-1)) = 2^k\left(1 - \frac{1}{2}\right)l,\ (k \ge 2,\ l \ge 1)ϕ(ϕ(n))=ϕ((p−1)(q−1))=2k(1−21​)l, (k≥2, l≥1)

と表せる。よって ϕ(ϕ(n))−1≥1\phi(\phi(n)) - 1\ge 1ϕ(ϕ(n))−1≥1 である。

例

ステップ1: 素数 p と q を決める

p=5, q=3p = 5,\ q = 3p=5, q=3 とする。このとき n=15n = 15n=15 、ϕ(n)=(p−1)(q−1)=8\phi(n) = (p - 1)(q - 1) = 8ϕ(n)=(p−1)(q−1)=8 である。

ステップ2: 公開鍵 e と秘密鍵 d を生成する

まずは公開鍵 eee を決める。 1<e<81 \lt e \lt 81<e<8 を満たし、かつ (e,8)=1(e, 8) = 1(e,8)=1 となるように決める。そこで e=3e = 3e=3 とする。

このとき秘密鍵は ed≡1(mod8)ed\equiv 1 \pmod 8ed≡1(mod8) を解いて d=7d = 7d=7 と決まる。

ステップ3: 暗号化と復号

平文を m=2m = 2m=2 とする。このとき暗号文は

E(2)=23mod  15=8mod  15E(2) = 2^3 \mod 15 = 8 \mod 15E(2)=23mod15=8mod15

となる。これを復号すると

D(8)=87mod  15=2mod  15D(8) = 8^7 \mod 15 = 2 \mod 15D(8)=87mod15=2mod15

となる。

第三者が秘密鍵を知るには

メッセージ受信者は n, en,\ en, e を送信者に送信する。nnn と eee は意図しない第三者に知られても問題ない。なぜなら n, en,\ en, e から ddd を計算することは難しいからだ。ddd を知るためには  mod ϕ(n)\bmod{\phi(n)}modϕ(n) の世界を考える必要があるが、 mod ϕ(n)\bmod{\phi(n)}modϕ(n) の世界は nnn を素因数分解しない限りわからない。そして大きな自然数 nnn の素因数分解は難しい。

nnn を素因数分解できた場合、簡単に秘密鍵 ddd を知ることができる。nnn の素因数分解から ϕ(n)\phi(n)ϕ(n) がわかり、第三者はすでに n, en,\ en, e を知っているため、次の式から ddd を求めることができる。

ed≡1(modϕ(n))ed \equiv 1 \pmod{\phi(n)}ed≡1(modϕ(n))

ユークリッドの互除法を繰り返し使うことでこの式から ddd を求めるのは素因数分解よりもはるかに簡単である(Wikipedia ユークリッドの互除法 計算量)。