#crypto

暗号学入門 2. 楕円曲線編


前回では,暗号学の基盤となる抽象代数学の基礎を扱いました.
本稿では,現代暗号で広く使われる 楕円曲線 を扱います.楕円曲線暗号 (ECC) は,RSA より短い鍵で同等の安全性を実現でき,TLS 1.3 や SSH で使われています.

シリーズ目次
  1. 抽象代数学の基礎
  2. 楕円曲線 (本稿)
  3. DH 鍵共有,ECDH 鍵共有
  4. 共通鍵暗号 (AES など)
  5. 公開鍵暗号 (RSA, ECC など)
  6. TLS
  7. (余談) SSH

なぜ楕円曲線なのか

前回の最後で,離散対数問題 (DLP) が暗号の安全性の根拠になると説明しました.GF(p)\mathrm{GF}(p) 上の DLP でも暗号は構成できますが,十分な安全性を得るには 2048 ビット以上の素数が必要です.

一方,楕円曲線上の離散対数問題 (ECDLP) は,同じ安全性を 256 ビット程度の鍵で実現できます.
これは,ECDLP に対しては数体篩法のような準指数時間アルゴリズムが知られていないためです.

安全性レベルRSA/DH 鍵長ECC 鍵長
128 ビット3072 ビット256 ビット
192 ビット7680 ビット384 ビット
256 ビット15360 ビット512 ビット

(NIST SP 800-57 Part 1 Rev.5 Table 2)

鍵が短いということは,計算量もメモリも通信帯域も節約できるということです.
DNS の TXT レコードに公開鍵を入れるような用途では,短い鍵は大きなメリットになります.

☕ コラム: なぜ「楕円」曲線なのか

「楕円曲線」という名前から楕円を思い浮かべるかもしれませんが,楕円曲線の形は楕円ではありません.

この名前は,楕円の弧長を計算する楕円積分に由来しています.楕円積分を逆関数として捉えた楕円関数の研究の中で,その代数的構造として楕円曲線が登場しました.つまり「楕円の研究の過程で生まれた曲線」であって「楕円の形をした曲線」ではないのです.

暗号に応用されるようになったのは 1985 年のことで,Neal Koblitz と Victor Miller がそれぞれ独立に楕円曲線暗号を提案しました.

楕円曲線の定義

ワイエルシュトラス方程式

KK 上の 楕円曲線 EE は,以下の方程式で定義される曲線です.

y2=x3+ax+by^2 = x^3 + ax + b

ここで a,bKa, b \in K であり,判別式 4a3+27b204a^3 + 27b^2 \neq 0 を満たす必要があります.
本稿では,暗号実装でよく使う標数 p>3p > 3 の素数体を前提に,この短いワイエルシュトラス形を使います.

判別式の条件は,曲線が 特異点 (尖点や自己交差) を持たないことを保証します.特異点がある曲線では,後述する群構造がうまく定義できません.

実数上での楕円曲線

実数体 R\mathbb{R} 上で楕円曲線がどのような形をしているか,いくつかの例を見てみましょう.

  • y2=x3x+1y^2 = x^3 - x + 1(a=1,b=1a = -1, b = 1): なめらかな 1 つの連結成分
  • y2=x33x+3y^2 = x^3 - 3x + 3(a=3,b=3a = -3, b = 3): 同様に 1 つの連結成分
  • y2=x3xy^2 = x^3 - x(a=1,b=0a = -1, b = 0): 2 つの連結成分 (卵型の閉曲線と無限に伸びる曲線)

実数上のグラフは xx 軸に関して対称です.これは方程式の y2y^2 から明らかで,(x,y)(x, y) が曲線上の点なら (x,y)(x, -y) も曲線上の点です.

楕円曲線上の点の加法

楕円曲線の最も重要な性質は,曲線上の点に 加法 を定義でき,その加法に関して をなすことです.

無限遠点

楕円曲線の群には,通常の座標では表せない特別な点 O\mathcal{O} (無限遠点) を加えます.
O\mathcal{O} は群の 単位元 の役割を果たします.

幾何学的な定義 (実数上)

楕円曲線上の 2 点 P,QP, Q の和 R=P+QR = P + Q は,以下のように幾何学的に定義されます.

  1. PPQQ を通る直線を引く
  2. この直線と楕円曲線の第 3 の交点 RR' を求める
  3. RR'xx 軸に関して反転した点が R=P+QR = P + Q

P=QP = Q の場合 (点の 2 倍算: 2P=P+P2P = P + P) は,PP における楕円曲線の接線を使い,同じ手順を踏みます.

PPP-P の場合 (PPxx 軸に関して対称な点) は,直線は垂直になり第 3 の交点が存在しないため,P+(P)=OP + (-P) = \mathcal{O} (無限遠点) と定義します.

https://andrea.corbellini.name/ecc/interactive/reals-add.html

代数的な公式

有限体上での実際の計算には,以下の代数的な公式を使います.

P=(x1,y1), Q=(x2,y2)P = (x_1, y_1),\ Q = (x_2, y_2)P±QP \neq \pm Q のときは,次の通りです.

λ=y2y1x2x1,x3=λ2x1x2,y3=λ(x1x3)y1\lambda = \frac{y_2 - y_1}{x_2 - x_1}, \quad x_3 = \lambda^2 - x_1 - x_2, \quad y_3 = \lambda(x_1 - x_3) - y_1

P+Q=(x3,y3)P + Q = (x_3, y_3) です.

P=QP = Q のとき (2 倍算) は,次の通りです.

λ=3x12+a2y1,x3=λ22x1,y3=λ(x1x3)y1\lambda = \frac{3x_1^2 + a}{2y_1}, \quad x_3 = \lambda^2 - 2x_1, \quad y_3 = \lambda(x_1 - x_3) - y_1

2P=(x3,y3)2P = (x_3, y_3) です.

ここでの除算は,有限体 GF(p)\mathrm{GF}(p) 上では モジュロ逆元 を使って計算します (前回 の拡張ユークリッドの互除法).

群の性質

楕円曲線上の点の集合 E(K)E(K) は,上記の加法に関して アーベル群 をなします.

  • 単位元: 無限遠点 O\mathcal{O}
  • 逆元: 点 P=(x,y)P = (x, y) の逆元は P=(x,y)-P = (x, -y)
  • 結合法則・可換法則も成立 (証明は省略)

有限体上の楕円曲線

暗号で使う楕円曲線は,実数上ではなく 有限体 GF(p)\mathrm{GF}(p) 上で定義されます.

GF(p)\mathrm{GF}(p) 上の楕円曲線

素数 pp に対して,GF(p)\mathrm{GF}(p) 上の楕円曲線 EE は,次の合同式を満たす点の集合として定義します.

y2x3+ax+b(modp)y^2 \equiv x^3 + ax + b \pmod{p}

を満たす点 (x,y)(x, y) の集合 (と無限遠点 O\mathcal{O}) です.

実数上のような「なめらかな曲線」ではなく,離散的な点の集合 になります.

例: GF(23)\mathrm{GF}(23) 上の楕円曲線

E:y2x3+x+1(mod23)E: y^2 \equiv x^3 + x + 1 \pmod{23} を考えてみましょう (a=1,b=1a = 1, b = 1).

x{0,1,,22}x \in \{0, 1, \ldots, 22\} に対して x3+x+1mod23x^3 + x + 1 \bmod 23 を計算し,それが GF(23)\mathrm{GF}(23) で平方数かどうかを確認します.

  • x=0x = 0: 0+0+1=1, y210 + 0 + 1 = 1,\ y^2 \equiv 1y=1,22y = 1, 22 → 点 (0,1), (0,22)(0, 1),\ (0, 22)
  • x=1x = 1: 1+1+1=3, y231 + 1 + 1 = 3,\ y^2 \equiv 3y=7,16y = 7, 16 → 点 (1,7), (1,16)(1, 7),\ (1, 16)
  • x=2x = 2: 8+2+1=11, y2118 + 2 + 1 = 11,\ y^2 \equiv 11 → 平方数でない → 点なし
  • x=5x = 5: 125+5+1=13116, y216125 + 5 + 1 = 131 \equiv 16,\ y^2 \equiv 16y=4,19y = 4, 19 → 点 (5,4), (5,19)(5, 4),\ (5, 19)

このように,すべての xx を走査して点を列挙します.無限遠点 O\mathcal{O} を含めて,この曲線上には 28 個 の点が存在します (群の位数が 28).

群の位数

有限体 GF(p)\mathrm{GF}(p) 上の楕円曲線 EE の点の個数 #E(GF(p))\#E(\mathrm{GF}(p)) は,ハッセの定理 により以下の範囲に収まります.

p+12p#E(GF(p))p+1+2pp + 1 - 2\sqrt{p} \leq \#E(\mathrm{GF}(p)) \leq p + 1 + 2\sqrt{p}

つまり,点の個数は pp に近い値になります.

ただし,実際の暗号では楕円曲線上の全点をそのまま使うのではなく,その中の 大きな素数位数の部分群 と,その生成元となる基点 GG を選んで使います.
第 3 章の ECDH で出てくる GG は,この基点です.

実際に暗号へ繋がる流れを図にすると,次のようになります.

flowchart LR
  F["有限体 GF(p)"] --> E["楕円曲線 E(GF(p))"]
  E --> S["大きな素数位数の部分群"]
  S --> K["ECDH / X25519"]
  S --> Sig["ECDSA / Ed25519"]

スカラー倍

楕円曲線上の点 PP に対して,整数 nn によるスカラー倍 nPnP は,PPnn 回加算することです.

  • 1P=P1 \cdot P = P
  • 2P=P+P2P = P + P
  • 3P=P+P+P=2P+P3P = P + P + P = 2P + P
  • \vdots
  • nP=P+P++PnnP = \underbrace{P + P + \cdots + P}_{n}

繰り返し二乗法

スカラー倍を効率的に計算するために,繰り返し二乗法を使います.これは整数のべき乗における繰り返し二乗法の楕円曲線版です.

nn を 2 進展開して n=(bk bk1  b1 b0)2n = (b_k\ b_{k-1}\ \cdots\ b_1\ b_0)_2 と表したとき,手順は次の通りです.

  1. ROR \leftarrow \mathcal{O} (無限遠点)
  2. i=ki = k から 00 まで繰り返し:
    • R2RR \leftarrow 2R(2 倍算)
    • bi=1b_i = 1 なら RR+PR \leftarrow R + P (加算)
  3. RRnPnP

このアルゴリズムにより,O(logn)O(\log n) 回の演算で nPnP を計算できます.

ECDLP (楕円曲線上の離散対数問題)

定義

楕円曲線 EE 上の点 PP (生成元) と点 QQ が与えられたとき,次を考えます.

Q=nPQ = nP

を満たす整数 nn を求める問題を 楕円曲線上の離散対数問題 (ECDLP) と呼びます.

一方向性

前回の DLP と同様に,一方向性があります.

  • スカラー倍の計算は容易: nnPP から Q=nPQ = nPO(logn)O(\log n) で計算可能
  • 逆方向は困難: QQPP から nn を求める効率的なアルゴリズムは知られていない

GF(p)\mathrm{GF}(p) 上の DLP と異なり,ECDLP に対しては 数体篩法に相当する準指数時間アルゴリズムが存在しない ことが,楕円曲線暗号がより短い鍵で高い安全性を実現できる理由です.

現在知られている最良のアルゴリズムは Pollard の ρ\rho 法で,計算量は O(n)O(\sqrt{n}) です.

標準的な楕円曲線

暗号に使う楕円曲線は,安全性が十分に検証された標準曲線を使用します.自分で曲線を選ぶと,意図せず弱い曲線を選んでしまうリスクがあります.

P-256 (secp256r1 / prime256v1)

NIST が標準化した楕円曲線で,最も広く使われています.

  • 体: GF(p)\mathrm{GF}(p)p=22562224+2192+2961p = 2^{256} - 2^{224} + 2^{192} + 2^{96} - 1(256 ビット素数)
  • 方程式: y2=x33x+by^2 = x^3 - 3x + b(bb は特定の値)
  • 安全性: 128 ビットセキュリティ
  • 用途: TLS, X.509 証明書, WebAuthn の ES256 など

Curve25519 / X25519

Daniel J. Bernstein が 2006 年に提案した楕円曲線で,鍵共有では X25519 として広く使われています.

  • 体: GF(p)\mathrm{GF}(p)p=225519p = 2^{255} - 19 (この素数が名前の由来)
  • 方程式: y2=x3+486662x2+xy^2 = x^3 + 486662x^2 + x (モンゴメリ形式)
  • 安全性: 約 128 ビットセキュリティ
  • 用途: X25519 として TLS 1.3, SSH, Signal プロトコル, WireGuard

Ed25519

Curve25519 と同じ有限体 GF(225519)\mathrm{GF}(2^{255} - 19) 上のツイスト・エドワーズ曲線で,デジタル署名 に特化した形式です.
名前は似ていますが,X25519 は鍵共有,Ed25519 は署名と,用途を分けて覚えると混乱しにくいです.

  • 署名アルゴリズム: EdDSA (Edwards-curve Digital Signature Algorithm)
  • SSH の ssh-ed25519 として広く使われている

現在は ssh-keygen で発行されるデフォルトのアルゴリズムも Ed25519 になっています.


参考文献