← 戻る ライブラリ › 応用数学と計算数学 › 技術の中の数学 応用数学と計算数学
暗号理論 数論と代数を用いて情報を保護する分野で、RSAから現代の暗号方式に至るまでを扱う。
直観 正しい相手だけが開けるようにメッセージを施錠する 誰でも掛けることはできるが、特定の一本の鍵でしか開けられない南京錠を想像してほしい。もし誰もが自分の南京錠を公開し(鍵だけは秘密にしておけば)、誰でもあなたへのメッセージを施錠できるが、それを読めるのはあなただけである——事前に会う必要も、秘密の合図も不要である。これが公開鍵暗号の核心的な発想である:「施錠」の操作は一方向には計算しやすく、秘密鍵なしではその南京錠の設計自体が公開されていても、計算量的に元に戻すことが不可能である。
Z / 17 Z \mathbb{Z}/17\mathbb{Z} Z /17 Z 上のモジュラ乗算 x ↦ a x m o d m x \mapsto a x \bmod m x ↦ a x mod m :順方向の計算は瞬時だが、大きな法での離散対数やRSAべき乗の逆算の困難性が公開鍵暗号の基盤となる。中高 合同算術:基礎となる道具 定義: 合同とモジュラー冪乗
二つの整数 a a a と b b b が法 n n n のもとで合同である、すなわち a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) であるとは、n ∣ ( a − b ) n \mid (a-b) n ∣ ( a − b ) が成り立つこと、つまり両者の差が n n n のちょうど倍数であることをいう。モジュラー冪乗とは、底を法 n n n のもとで自分自身と繰り返し掛け合わせる操作であり、これはまさにRSAやDiffie-Hellmanといった暗号方式が基盤とする演算である。順方向の計算は高速だが、逆方向は困難だからである。
a ≡ b ( m o d n ) ⟺ n ∣ ( a − b ) a \equiv b \pmod{n} \iff n \mid (a-b) a ≡ b ( mod n ) ⟺ n ∣ ( a − b ) ここで n ∣ ( a − b ) n \mid (a-b) n ∣ ( a − b ) とは、n n n が a − b a-b a − b を割り切ることを意味し、したがって a ≡ b ( m o d n ) a \equiv b \pmod{n} a ≡ b ( mod n ) は実質的に余りについての主張である:a a a と b b b は n n n で割ったときに同じ余りを持つ。以下のオイラーの定理はフェルマーの小定理を拡張したものであり、RSA復号がなぜ元のメッセージを正しく復元できるのかを支える原動力である。
a ϕ ( n ) ≡ 1 ( m o d n ) whenever gcd ( a , n ) = 1 a^{\phi(n)} \equiv 1 \pmod n \quad \text{whenever} \quad \gcd(a,n)=1 a ϕ ( n ) ≡ 1 ( mod n ) whenever g cd( a , n ) = 1 三つの暗号方式の比較 方式 依拠する困難問題 典型的な鍵長(2026年) RSA n = p q n=pq n = pq を素因数分解すること2048~4096ビット Diffie-Hellman 素数を法とする離散対数 2048~3072ビット 楕円曲線暗号(ECC) 楕円曲線群上の離散対数 256~384ビット
大学 RSAが機能する理由と、Diffie-Hellmanが共有秘密を作る仕組み n = p q n = pq n = pq を相異なる二つの素数の積とし、e e e と d d d が e d ≡ 1 ( m o d ϕ ( n ) ) ed \equiv 1 \pmod{\phi(n)} e d ≡ 1 ( mod ϕ ( n )) を満たすとする。このとき、0 ≤ m < n 0 \le m < n 0 ≤ m < n を満たす任意のメッセージ m m m に対して、e e e で暗号化し d d d で復号すると元のメッセージが正しく復元される:( m e ) d ≡ m ( m o d n ) (m^e)^d \equiv m \pmod n ( m e ) d ≡ m ( mod n ) 。
なぜ正しいのか? これはRSAを実際に使用可能にする定理である:送信者が公開指数で何を暗号化しても、秘密指数を持つ者はほぼすべてのメッセージだけでなく、あらゆる可能なメッセージに対して常に復号できることを保証する——証明では、メッセージが偶然モジュラスと因数を共有してしまう境界事例も扱わなければならない。
証明 ここで e d ≡ 1 ( m o d ϕ ( n ) ) ed \equiv 1 \pmod{\phi(n)} e d ≡ 1 ( mod ϕ ( n )) により、モジュラー合同の定義から、ある非負整数 k k k が存在して e d = 1 + k ϕ ( n ) ed = 1 + k\phi(n) e d = 1 + k ϕ ( n ) が成り立つ。
場合1:gcd ( m , n ) = 1 \gcd(m,n)=1 g cd( m , n ) = 1 のとき。オイラーの定理より m ϕ ( n ) ≡ 1 ( m o d n ) m^{\phi(n)} \equiv 1 \pmod n m ϕ ( n ) ≡ 1 ( mod n ) が成り立つので、両辺を k k k 乗して m m m を掛けると m e d = m ⋅ ( m ϕ ( n ) ) k ≡ m ⋅ 1 k ≡ m ( m o d n ) m^{ed} = m \cdot (m^{\phi(n)})^{k} \equiv m \cdot 1^{k} \equiv m \pmod n m e d = m ⋅ ( m ϕ ( n ) ) k ≡ m ⋅ 1 k ≡ m ( mod n ) が得られる。
場合2:gcd ( m , n ) ≠ 1 \gcd(m,n) \ne 1 g cd( m , n ) = 1 のとき。n = p q n = pq n = pq であるから、これは p p p が m m m を割り切るか、または q q q が m m m を割り切ることを意味する(m m m は n n n より小さいので両方が同時に成り立つことはない)。法 p p p のもとで考える:もし p p p が m m m を割り切るなら、m m m と m e d m^{ed} m e d はともに法 p p p のもとで 0 0 0 と合同である。そうでなければ gcd ( m , p ) = 1 \gcd(m,p)=1 g cd( m , p ) = 1 であり、フェルマーの小定理より m p − 1 ≡ 1 ( m o d p ) m^{p-1} \equiv 1 \pmod p m p − 1 ≡ 1 ( mod p ) が成り立ち、( p − 1 ) (p-1) ( p − 1 ) が ϕ ( n ) \phi(n) ϕ ( n ) を割り切ることから、場合1と同じ計算で m e d ≡ m ( m o d p ) m^{ed} \equiv m \pmod p m e d ≡ m ( mod p ) が示される。法 q q q についても同様の議論により m e d ≡ m ( m o d q ) m^{ed} \equiv m \pmod q m e d ≡ m ( mod q ) が示される。
中国剰余定理により、法 p p p と法 q q q のそれぞれで成り立つ合同式は、その積 n = p q n=pq n = pq を法としても成り立つ。したがって ( m e ) d ≡ m ( m o d n ) (m^e)^d \equiv m \pmod n ( m e ) d ≡ m ( mod n ) はすべてのメッセージ m m m に対して成り立ち、n n n と互いに素なものだけに限らない。
素数 p p p と底 g g g を固定する。アリスが秘密の a a a を選び A = g a m o d p A = g^a \bmod p A = g a mod p を送り、ボブが秘密の b b b を選び B = g b m o d p B = g^b \bmod p B = g b mod p を送ったとする。このとき B a m o d p B^a \bmod p B a mod p と A b m o d p A^b \bmod p A b mod p を計算すると、a a a も b b b も一度も送信されていないにもかかわらず、どちらも同じ値 g a b m o d p g^{ab} \bmod p g ab mod p になる。
なぜ正しいのか? これにより、盗聴者が監視している公開チャネル上でも、二者が秘密鍵に合意できるようになる:盗聴者は底、法、そして両者の公開値を見ることができるが、そこから共有秘密を復元するには離散対数問題を解く必要があり、適切に選ばれたパラメータに対しては計算量的に困難であると信じられている。
証明 定義より A = g a m o d p A = g^a \bmod p A = g a mod p と B = g b m o d p B = g^b \bmod p B = g b mod p はモジュラー冪乗の結果であるため、ボブは A A A を受け取って B a = ( g b ) a m o d p B^a = (g^b)^a \bmod p B a = ( g b ) a mod p を計算し、アリスは B B B を受け取って A b = ( g a ) b m o d p A^b = (g^a)^b \bmod p A b = ( g a ) b mod p を計算する。
モジュラー冪乗は通常の冪乗と同じ指数法則に従う。なぜなら法 p p p のもとでの繰り返し乗算は、各段階で法 p p p により簡約される点を除けば、整数の繰り返し乗算とまったく同じように合成されるからである:g g g の指数として ( g b ) a = g b a = g a b = ( g a ) b (g^b)^a = g^{ba} = g^{ab} = (g^a)^b ( g b ) a = g ba = g ab = ( g a ) b が成り立ち、この等式はどの段階で法 p p p により簡約しても保たれる。
したがって B a m o d p = g a b m o d p = A b m o d p B^a \bmod p = g^{ab} \bmod p = A^b \bmod p B a mod p = g ab mod p = A b mod p である:アリスとボブは、自分の秘密指数と相手の公開値から、それぞれ独立に同じ値 g a b m o d p g^{ab} \bmod p g ab mod p を計算する。その際、秘密の a a a や b b b がチャネル上に現れることは一度もない。
安全性の議論はこの正当性の議論とは別である:正当性は両者が同じ数にたどり着くことしか示していない。g g g 、p p p 、A A A から a a a を計算する困難性(離散対数問題)こそが、その共有された数を観測者から秘密に保つ理由である。
大学 実世界での応用と具体例 あらゆるHTTPS接続、安全なメッセージングアプリ、暗号資産ウォレットは、上記の定理に依拠している:TLSハンドシェイクはセッション鍵の合意にDiffie-Hellman(またはその楕円曲線版)を用い、銀行システムやソフトウェア更新はRSAやECDSA署名で真正性を保証し、ブロックチェーンウォレットは楕円曲線上の離散対数を用いて公開アドレスから秘密鍵を導出することを計算量的に不可能にしている。以下の二つの具体例では、すべての手順を検証できるよう、小さな数を用いてRSAとDiffie-Hellmanを手計算で実行する。
例: 小さな素数によるRSAの手計算
素数 p = 5 p=5 p = 5 と q = 11 q=11 q = 11 を用い、公開指数 e = 3 e=3 e = 3 、メッセージ m = 2 m=2 m = 2 として、暗号文を求め、復号によってメッセージが正しく復元されることを確かめよ。
解答 ステップ1:法 n = 5 × 11 = 55 n = 5 \times 11 = 55 n = 5 × 11 = 55 と ϕ ( n ) = ( 5 − 1 ) ( 11 − 1 ) = 40 \phi(n) = (5-1)(11-1) = 40 ϕ ( n ) = ( 5 − 1 ) ( 11 − 1 ) = 40 を計算する。
ステップ2:gcd ( 3 , 40 ) = 1 \gcd(3,40)=1 g cd( 3 , 40 ) = 1 を確認し、e = 3 e=3 e = 3 が有効な公開指数であることを確かめる。
ステップ3:3 d ≡ 1 ( m o d 40 ) 3d \equiv 1 \pmod{40} 3 d ≡ 1 ( mod 40 ) を満たす秘密指数 d d d を求める。d = 27 d=27 d = 27 を試すと 3 × 27 = 81 = 2 × 40 + 1 3 \times 27 = 81 = 2 \times 40 + 1 3 × 27 = 81 = 2 × 40 + 1 となるので、d = 27 d=27 d = 27 でよい。
ステップ4:m = 2 m=2 m = 2 を暗号化する:暗号文は c = 2 3 m o d 55 = 8 m o d 55 = 8 c = 2^3 \bmod 55 = 8 \bmod 55 = 8 c = 2 3 mod 55 = 8 mod 55 = 8 である。
ステップ5:c 27 m o d 55 = 8 27 m o d 55 c^{27} \bmod 55 = 8^{27} \bmod 55 c 27 mod 55 = 8 27 mod 55 を計算して復号する。法55のもとで繰り返し二乗する:8 2 = 64 ≡ 9 8^2 = 64 \equiv 9 8 2 = 64 ≡ 9 , 8 4 ≡ 9 2 = 81 ≡ 26 8^4 \equiv 9^2 = 81 \equiv 26 8 4 ≡ 9 2 = 81 ≡ 26 , 8 8 ≡ 26 2 = 676 ≡ 16 8^8 \equiv 26^2 = 676 \equiv 16 8 8 ≡ 2 6 2 = 676 ≡ 16 , 8 16 ≡ 16 2 = 256 ≡ 36 8^{16} \equiv 16^2 = 256 \equiv 36 8 16 ≡ 1 6 2 = 256 ≡ 36 。27 = 16 + 8 + 2 + 1 27 = 16+8+2+1 27 = 16 + 8 + 2 + 1 であるから、8 16 ⋅ 8 8 ⋅ 8 2 ⋅ 8 1 ≡ 36 ⋅ 16 ⋅ 9 ⋅ 8 ( m o d 55 ) 8^{16} \cdot 8^{8} \cdot 8^{2} \cdot 8^{1} \equiv 36 \cdot 16 \cdot 9 \cdot 8 \pmod{55} 8 16 ⋅ 8 8 ⋅ 8 2 ⋅ 8 1 ≡ 36 ⋅ 16 ⋅ 9 ⋅ 8 ( mod 55 ) を計算すると、段階的に 2 2 2 に簡約される。
ステップ6:復号された値は 2 2 2 であり、まさに元のメッセージと一致する。これによりRSAの正当性定理がこの具体例で確認された。
例: Diffie-Hellman鍵交換の手計算
素数 p = 23 p=23 p = 23 と底 g = 5 g=5 g = 5 のもとで、アリスは秘密 a = 6 a=6 a = 6 を、ボブは秘密 b = 15 b=15 b = 15 を選ぶ。共有秘密を両方の方法で計算し、一致することを確認せよ。
解答 ステップ1:アリスは A = 5 6 m o d 23 A = 5^6 \bmod 23 A = 5 6 mod 23 を計算する。23を法とする5の冪を順に計算する:5 2 = 25 ≡ 2 5^2=25\equiv2 5 2 = 25 ≡ 2 , 5 3 ≡ 10 5^3\equiv10 5 3 ≡ 10 , 5 4 ≡ 4 5^4\equiv4 5 4 ≡ 4 , 5 5 ≡ 20 5^5\equiv20 5 5 ≡ 20 , 5 6 ≡ 8 5^6\equiv8 5 6 ≡ 8 。よって A = 8 A=8 A = 8 である。
ステップ2:ボブは B = 5 15 m o d 23 B = 5^{15} \bmod 23 B = 5 15 mod 23 を計算する。上の 5 6 ≡ 8 5^6\equiv8 5 6 ≡ 8 を用いると、5 12 ≡ 8 2 = 64 ≡ 18 5^{12}\equiv8^2=64\equiv18 5 12 ≡ 8 2 = 64 ≡ 18 、また 5 15 = 5 12 ⋅ 5 3 ≡ 18 ⋅ 10 = 180 ≡ 19 5^{15}=5^{12}\cdot5^3\equiv18\cdot10=180\equiv19 5 15 = 5 12 ⋅ 5 3 ≡ 18 ⋅ 10 = 180 ≡ 19 。よって B = 19 B=19 B = 19 である。
ステップ3:アリスは共有秘密として B a m o d p = 19 6 m o d 23 B^a \bmod p = 19^6 \bmod 23 B a mod p = 1 9 6 mod 23 を計算する。19 ≡ − 4 19\equiv-4 19 ≡ − 4 であるから 19 6 ≡ ( − 4 ) 6 = 4 6 = 4096 19^6\equiv(-4)^6=4^6=4096 1 9 6 ≡ ( − 4 ) 6 = 4 6 = 4096 であり、4096 = 178 × 23 + 2 4096 = 178\times23+2 4096 = 178 × 23 + 2 なので、これは 2 2 2 に等しい。
ステップ4:ボブは共有秘密として A b m o d p = 8 15 m o d 23 A^b \bmod p = 8^{15} \bmod 23 A b mod p = 8 15 mod 23 を計算する。8 = 2 3 8=2^3 8 = 2 3 と書くと 8 15 = 2 45 8^{15}=2^{45} 8 15 = 2 45 となる。2 11 ≡ 1 ( m o d 23 ) 2^{11}\equiv1 \pmod{23} 2 11 ≡ 1 ( mod 23 ) であり(直接確認すると 2 11 = 2048 = 89 × 23 + 1 2^{11}=2048=89\times23+1 2 11 = 2048 = 89 × 23 + 1 )、45 = 4 × 11 + 1 45=4\times11+1 45 = 4 × 11 + 1 であるから、これは 2 1 = 2 2^{1}=2 2 1 = 2 に簡約される。
ステップ5:どちらの計算も 2 2 2 を与え、アリスとボブが a = 6 a=6 a = 6 や b = 15 b=15 b = 15 をチャネル上で一度も送信することなく、同じ共有秘密に合意したことが確認される。
よくある誤り. よくある誤りは、パディングなしで生のメッセージに「教科書通りの」RSAを直接適用することである。暗号化は決定的であるため、同じメッセージは常に同じ暗号文を生成し、攻撃者が繰り返されたメッセージを識別したり、暗号文間の代数的関係を悪用したりできてしまう(展性)。実際のシステムはまさにこれを防ぐためにOAEPのようなランダム化パディング方式を用いており、上記の純粋な定理をパディングなしの実世界のメッセージにそのまま適用してはならない。 歴史的ノート
ピエール・ド・フェルマーは1640年に彼の小定理を、公開鍵暗号が存在する三世紀以上前に、純粋に素数と余りに関する事実として述べた。後にレオンハルト・オイラーはこれを、現在 ϕ ( n ) \phi(n) ϕ ( n ) と書かれる関数を用いて任意の法に一般化した。そして1977年、暗号的な動機とは無関係だったこの一般化こそが、RSA復号が常に元のメッセージを復元することを証明するのにまさに必要な代数的事実であることが判明した。
ピエール・ド・フェルマー
研究の最前線 2026年時点
RSA、Diffie-Hellman、楕円曲線暗号に対する最大の未解決の脅威は、1994年にショアが発表した量子アルゴリズムであり、十分に大きな誤り耐性量子コンピュータ上で多項式時間で整数を素因数分解し離散対数を計算できる——そのような機械はまだ存在しないが、このリスクはすでに世界的な移行を促している。2024年、NISTは最初の耐量子暗号標準を確定させた(CRYSTALS-Kyberに由来し現在ML-KEMと呼ばれる格子ベースの鍵カプセル化機構であるFIPS 203、およびデジタル署名のためのFIPS 204)。これらの安全性は、量子攻撃に耐えると信じられている格子問題の困難性の予想に基づいている。2022年からの教訓として、すべての「耐量子」候補が検証に耐えるわけではないという点が挙げられる:NISTの最終候補であった同種写像ベースのSIKE方式は、古典的な(量子でない)攻撃によって破られ、この分野がまだ確定したものではなく、活発に検証され続けていることを裏付けている。
n = 55 n=55 n = 55 , ϕ ( n ) = 40 \phi(n)=40 ϕ ( n ) = 40 , 公開指数 e = 3 e=3 e = 3 のRSAにおいて、3 d ≡ 1 ( m o d 40 ) 3d \equiv 1 \pmod{40} 3 d ≡ 1 ( mod 40 ) を満たす d d d の値はどれか。
d = 13 d=13 d = 13 d = 27 d=27 d = 27 d = 33 d=33 d = 33 d = 3 d=3 d = 3 Diffie-Hellman鍵交換の安全性は、どの基礎となる計算問題に依拠しているか。
大きな合成数を素因数分解すること 素数を法とする離散対数を計算すること 連立一次方程式を解くこと 二つの数の最大公約数を求めること
gcd ( a , n ) = 1 \gcd(a,n)=1 g cd( a , n ) = 1 のとき、オイラーの定理は a ϕ ( n ) ≡ 1 ( m o d n ) a^{\phi(n)} \equiv 1 \pmod n a ϕ ( n ) ≡ 1 ( mod n ) であると述べる。ここで ϕ ( n ) \phi(n) ϕ ( n ) は次のうちどれを数えるか。
n n n の素因数1 1 1 から n n n までの整数のうち n n n と互いに素なものの個数n n n の約数の個数n n n の平方根銀行は、顧客が本当に銀行から来たものであり改ざんされていないことを検証できるように、ソフトウェア更新に署名したいと考えている。この保証を直接提供する暗号ツールはどれか。
デジタル署名方式(例:RSAまたはECDSA署名) 対称暗号のみ 鍵を用いないハッシュ関数 乱数生成のみ