この 章の 目標
有限体上の 楕円曲線の 加法公式と ハッセの 定理を 使って、小さい 曲線で 点の 計算と 群の 位数の 見積もりが できる
楕円曲線の 離散対数問題に 汎用的な 攻撃しか 知られていない ことから、鍵が RSA より 短くて すむ 理由を 説明できる
ECDH・ECDSA・EdDSA の 手順を 述べ、正しさを 証明できる
ナンスの 再利用・漏洩・偏りから 秘密鍵が 求まる ことを 証明し、決定的な ナンスの 意味を 説明できる
公開鍵の 検証を 怠った ときの 無効曲線攻撃・ 小部分群攻撃と、余因子の 役割を 説明できる
安全な 曲線の 条件と、秘密に 依存しない(定数時間の)実装の 考え方を 説明できる
前提 :第2章 、第3章 、04-algebra 第2章 。楕円曲線の 群法則と ハッセの 定理は 21 第2章 ・21 第4章 の 結果を 証明なしで 引用する。4.9 節では 有限体 F p k \mathbb{F}_{p^k} F p k (04-algebra 第8章 )を 使う。
TLS 1.3 の 規格 RFC 8446 は、用途ごとの 別の 定めが ない 限り、実装は 鍵共有に 楕円曲線 P-256 を 使えなければならず(MUST)、X25519 にも 対応すべき(SHOULD)と している。ビットコインの 取引の 署名には secp256k1 と いう 曲線の 上の ECDSA が 使われ、米国の 署名規格 FIPS 186-5(2023 年)が 承認する 3 つの 署名方式の うち 2 つ(ECDSA と EdDSA)は 楕円曲線を 使う。楕円曲線暗号が 広く 使われる 理由は、 第3章 で 見た とおり、同じ 安全性を RSA より ずっと 短い鍵で 実現できる ことに ある。
一方で、楕円曲線暗号は 数学的には 正しいのに 実装で 破れる ことが 多い。署名の たびに 選ぶ乱数(ナンス)を 2 回 使えば 秘密鍵が 計算され、受け取った 点が 曲線上に あるかを 確かめなければ 秘密鍵が 少し ずつ 漏れる。本章では、ECDH・ECDSA・EdDSA の 手順と その 正しさを 証明した うえで、こうした 落とし穴が なぜ鍵の 漏洩に つながるのかを 数学で 説明する。攻撃が 成り立つ理由の 数学的な 詳細(MOV 帰着、アノマラス曲線、点の 個数の 計算など)は 21 第5章 で 扱う。
4.1 有限体上の 楕円曲線
p > 3 p > 3 p > 3 を 素数、 A , B ∈ F p A, B \in \mathbb{F}_p A , B ∈ F p を 4 A 3 + 27 B 2 ≠ 0 4A^3 + 27B^2 \neq 0 4 A 3 + 27 B 2 = 0 を みたす元とし、
E ( F p ) = { ( x , y ) ∈ F p 2 ∣ y 2 = x 3 + A x + B } ∪ { O } E(\mathbb{F}_p) = \lbrace (x, y) \in \mathbb{F}_p^2 \mid y^2 = x^3 + Ax + B \rbrace \cup \lbrace O \rbrace E ( F p ) = {( x , y ) ∈ F p 2 ∣ y 2 = x 3 + A x + B } ∪ { O }
と おく。 O O O は 無限遠点である。条件 4 A 3 + 27 B 2 ≠ 0 4A^3 + 27B^2 \neq 0 4 A 3 + 27 B 2 = 0 は、右辺の 3 次式が 重根を もたない(曲線が 特異点を もたない)ことを 表す。
定理 4.1 (群法則と 加法公式) E ( F p ) E(\mathbb{F}_p) E ( F p ) は O O O を 単位元と する アーベル群であり、 ( x , y ) (x, y) ( x , y ) の 逆元は ( x , − y ) (x, -y) ( x , − y ) である。P 1 = ( x 1 , y 1 ) P_1 = (x_1, y_1) P 1 = ( x 1 , y 1 ) , P 2 = ( x 2 , y 2 ) P_2 = (x_2, y_2) P 2 = ( x 2 , y 2 ) に ついて、 x 1 = x 2 x_1 = x_2 x 1 = x 2 かつ y 1 = − y 2 y_1 = -y_2 y 1 = − y 2 なら P 1 + P 2 = O P_1 + P_2 = O P 1 + P 2 = O 、そうでなければ
λ = { y 2 − y 1 x 2 − x 1 ( x 1 ≠ x 2 ) 3 x 1 2 + A 2 y 1 ( P 1 = P 2 ) , x 3 = λ 2 − x 1 − x 2 , y 3 = λ ( x 1 − x 3 ) − y 1 \lambda = \begin{cases} \dfrac{y_2 - y_1}{x_2 - x_1} & (x_1 \neq x_2) \\[2ex] \dfrac{3x_1^2 + A}{2y_1} & (P_1 = P_2) \end{cases}, \qquad x_3 = \lambda^2 - x_1 - x_2, \qquad y_3 = \lambda(x_1 - x_3) - y_1 λ = ⎩ ⎨ ⎧ x 2 − x 1 y 2 − y 1 2 y 1 3 x 1 2 + A ( x 1 = x 2 ) ( P 1 = P 2 ) , x 3 = λ 2 − x 1 − x 2 , y 3 = λ ( x 1 − x 3 ) − y 1
と して P 1 + P 2 = ( x 3 , y 3 ) P_1 + P_2 = (x_3, y_3) P 1 + P 2 = ( x 3 , y 3 ) である。
(主張のみ。λ \lambda λ は 2 点を 通る 直線または 接線の 傾きで、直線と 曲線の 3 つ目の 交点を x x x 軸に ついて 折り返した ものが 和に なる。公式の 導出と 結合 法則の 証明は 21 第2章 の 定理 2.6(加法公式)と 定理 2.10(群法則)を 参照。)
整数 k k k と 点 P P P に ついて、 P P P を k k k 回足した ものを [ k ] P [k]P [ k ] P と 書く( [ 0 ] P = O [0]P = O [ 0 ] P = O , [ − k ] P = − [ k ] P [-k]P = -[k]P [ − k ] P = − [ k ] P )。[ k ] P [k]P [ k ] P は 反復二乗法( 第1章 )と 同じ「2 倍と 加算」で O ( log k ) O(\log k) O ( log k ) 回の 群演算で 計算できる。
定理 4.2 (ハッセの 定理) ∣ ∣ E ( F p ) ∣ − ( p + 1 ) ∣ ≤ 2 p \bigl\lvert \lvert E(\mathbb{F}_p) \rvert - (p + 1) \bigr\rvert \leq 2\sqrt{p} ∣ E ( F p )∣ − ( p + 1 ) ≤ 2 p 。
(主張のみ。証明は 21 第4章 定理 4.7 を 参照。)点の 個数は およそ p p p で、a p = p + 1 − ∣ E ( F p ) ∣ a_p = p + 1 - \lvert E(\mathbb{F}_p) \rvert a p = p + 1 − ∣ E ( F p )∣ を フロベニウスの トレースと いう。 ∣ E ( F p ) ∣ \lvert E(\mathbb{F}_p) \rvert ∣ E ( F p )∣ その ものは、シューフの アルゴリズムと その 改良に より log p \log p log p の 多項式時間で 計算でき( 21 第5章 5.6 節)、暗号では 位数が 素数(または その 小さい 倍数)に なる 曲線を 選ぶ。
例 4.3 (この 章の 小さい 曲線) p = 211 p = 211 p = 211 , E : y 2 = x 3 + x + 1 E\colon y^2 = x^3 + x + 1 E : y 2 = x 3 + x + 1 と する( 4 A 3 + 27 B 2 = 31 ≠ 0 4A^3 + 27B^2 = 31 \neq 0 4 A 3 + 27 B 2 = 31 = 0 )。各 x x x に ついて x 3 + x + 1 x^3 + x + 1 x 3 + x + 1 が 平方剰余か どうかを 調べて 数えると ∣ E ( F 211 ) ∣ = 223 \lvert E(\mathbb{F}_{211}) \rvert = 223 ∣ E ( F 211 )∣ = 223 で、これは 素数である。 a p = 212 − 223 = − 11 a_p = 212 - 223 = -11 a p = 212 − 223 = − 11 で、確かに ∣ a p ∣ ≤ 2 211 ≈ 29.05 \lvert a_p \rvert \leq 2\sqrt{211} \approx 29.05 ∣ a p ∣ ≤ 2 211 ≈ 29.05 。ラグランジュの 定理に より O O O 以外の すべての 点は 位数 223 223 223 で、群を 生成する。点 G = ( 0 , 1 ) G = (0, 1) G = ( 0 , 1 ) を とると、 [ 2 ] G [2]G [ 2 ] G は λ = 1 / 2 = 106 \lambda = 1/2 = 106 λ = 1/2 = 106 (2 ⋅ 106 = 212 ≡ 1 2 \cdot 106 = 212 \equiv 1 2 ⋅ 106 = 212 ≡ 1 )より
x 3 = 106 2 − 0 − 0 ≡ 53 , y 3 = 106 ⋅ ( 0 − 53 ) − 1 ≡ 78 ( m o d 211 ) x_3 = 106^2 - 0 - 0 \equiv 53, \qquad y_3 = 106 \cdot (0 - 53) - 1 \equiv 78 \pmod{211} x 3 = 10 6 2 − 0 − 0 ≡ 53 , y 3 = 106 ⋅ ( 0 − 53 ) − 1 ≡ 78 ( mod 211 )
で [ 2 ] G = ( 53 , 78 ) [2]G = (53, 78) [ 2 ] G = ( 53 , 78 ) である。同様に [ 3 ] G = ( 72 , 189 ) [3]G = (72, 189) [ 3 ] G = ( 72 , 189 ) 。以下、この G G G と n = 223 n = 223 n = 223 を 使う(数値は すべて 計算機で 確かめた)。
4.2 楕円曲線上の 離散対数問題と 鍵の 長さ
暗号に 使う 曲線は、 ドメインパラメータ ( p , A , B , G , n , h ) (p, A, B, G, n, h) ( p , A , B , G , n , h ) で 指定する。 G ∈ E ( F p ) G \in E(\mathbb{F}_p) G ∈ E ( F p ) は 素数位数 n n n の 点( ベースポイント )、h = ∣ E ( F p ) ∣ / n h = \lvert E(\mathbb{F}_p) \rvert / n h = ∣ E ( F p )∣ / n は 余因子 (cofactor) である。秘密鍵は 整数 d ∈ [ 1 , n − 1 ] d \in [1, n - 1] d ∈ [ 1 , n − 1 ] 、公開鍵は Q = [ d ] G Q = [d]G Q = [ d ] G で、公開鍵から 秘密鍵を 求める 問題が 楕円曲線離散対数問題 (ECDLP)である。
第3章 の 汎用的な 攻撃は そのまま 使える。ポーリッヒ–ヘルマン法が あるので n n n は 大きな 素数でなければならず、そのうえで ベビーステップ・ジャイアントステップ法や ρ \rho ρ 法で 約 n \sqrt{n} n 回の 群演算が かかる( ρ \rho ρ 法では P P P と − P -P − P を 同一視して 約 π n / 4 \sqrt{\pi n/4} π n /4 回)。一方、素体上の 一般の 楕円曲線には、 F p × \mathbb{F}_p^\times F p × の 指数計算法に あたる 準指数時間の 方法が 知られていない。その ため安全性ビット数は n n n の ビット数の ほぼ半分に なり、128 ビットの 安全性に 必要な 大きさは、RSA の 法の 3072 ビットに 対し n n n が 256 ビットである(NIST SP 800-57 Part 1 Rev. 5 の 目安。表は 第3章 3.11 節。推奨は 改訂されうる)。
ただし、これは よく 選んだ 曲線に ついての 話である。特別な 性質を もつ 曲線では ECDLP が 易しくなる(4.9 節)。また 鍵が 短くても、実装を 誤れば 数学の 安全性は 意味を 失う(4.4〜4.10 節)。
4.3 ECDH 鍵共有
ディフィー–ヘルマン鍵共有(第2章 )を 楕円曲線の 群で 行うのが ECDH である。アリスは 秘密鍵 d A d_A d A を 選んで Q A = [ d A ] G Q_A = [d_A]G Q A = [ d A ] G を、ボブは d B d_B d B を 選んで Q B = [ d B ] G Q_B = [d_B]G Q B = [ d B ] G を 送る。アリスは [ d A ] Q B [d_A]Q_B [ d A ] Q B 、ボブは [ d B ] Q A [d_B]Q_A [ d B ] Q A を 計算する。冪の 法則 [ a ] ( [ b ] P ) = [ a b ] P [a]\bigl([b]P\bigr) = [ab]P [ a ] ( [ b ] P ) = [ ab ] P より
[ d A ] Q B = [ d A d B ] G = [ d B ] Q A [d_A]Q_B = [d_Ad_B]G = [d_B]Q_A [ d A ] Q B = [ d A d B ] G = [ d B ] Q A
なので 2 人は 同じ 点 S S S を 得る。実際には S S S の x x x 座標だけを 鍵導出関数(ハッシュ関数に よる 変換)に 入れて 共通鍵を 作る(TLS 1.3 で P-256 を 使う 場合も、共有される 値は x x x 座標である)。
例 4.4 例 4.3 の 曲線で d A = 37 d_A = 37 d A = 37 , d B = 158 d_B = 158 d B = 158 と すると Q A = ( 169 , 115 ) Q_A = (169, 115) Q A = ( 169 , 115 ) , Q B = ( 59 , 145 ) Q_B = (59, 145) Q B = ( 59 , 145 ) 。d A d B = 5846 ≡ 48 ( m o d 223 ) d_Ad_B = 5846 \equiv 48 \pmod{223} d A d B = 5846 ≡ 48 ( mod 223 ) で、2 人とも S = [ 48 ] G = ( 185 , 171 ) S = [48]G = (185, 171) S = [ 48 ] G = ( 185 , 171 ) を 得る。
盗聴者が G , Q A , Q B G, Q_A, Q_B G , Q A , Q B から S S S を 求める 問題(楕円曲線版の 計算ディフィー–ヘルマン問題)は、ECDLP が 解ければ 解ける。ECDH その ものは 相手を 認証しないので、中間者攻撃を 防ぐには 署名などと 組み合わせる(第2章)。
4.4 公開鍵の 検証と 無効曲線攻撃
ECDH の 実装は、相手から 受け取った 点 Q Q Q に 自分の 秘密鍵を 掛ける。 Q Q Q が 本当に E E E の 点か どうかを 確かめないと 何が 起こるか。鍵に なるのは、定理 4.1 の 公式が B B B を 含まない と いう 観察である。
命題 4.5 (B B B を 使わない 計算)定理 4.1 の 公式だけを 使って [ d ] Q ′ [d]Q' [ d ] Q ′ を 計算する 実装に、 E E E 上に ない 点 Q ′ = ( x 0 , y 0 ) ∈ F p 2 Q' = (x_0, y_0) \in \mathbb{F}_p^2 Q ′ = ( x 0 , y 0 ) ∈ F p 2 を 与える。 B ′ = y 0 2 − x 0 3 − A x 0 B' = y_0^2 - x_0^3 - Ax_0 B ′ = y 0 2 − x 0 3 − A x 0 と おき、 4 A 3 + 27 B ′ 2 ≠ 0 4A^3 + 27B'^2 \neq 0 4 A 3 + 27 B ′2 = 0 と すると、実装の 出力は 曲線 E ′ : y 2 = x 3 + A x + B ′ E'\colon y^2 = x^3 + Ax + B' E ′ : y 2 = x 3 + A x + B ′ の 群 E ′ ( F p ) E'(\mathbb{F}_p) E ′ ( F p ) に おける [ d ] Q ′ [d]Q' [ d ] Q ′ である。
証明. Q ′ Q' Q ′ は E ′ E' E ′ の 点である。 E ′ E' E ′ に 定理 4.1 を 適用すると、 E ′ ( F p ) E'(\mathbb{F}_p) E ′ ( F p ) の 加法公式は A A A だけを 含み B ′ B' B ′ を 含まないので、実装が 使う式と 文字どおり一致する。したがって 実装が 途中で 計算する 点は すべて E ′ ( F p ) E'(\mathbb{F}_p) E ′ ( F p ) の 中に あり、2 倍と 加算を 正しく 行っている。帰納法に より、出力は E ′ ( F p ) E'(\mathbb{F}_p) E ′ ( F p ) での [ d ] Q ′ [d]Q' [ d ] Q ′ である。□ \square □
攻撃者は、∣ E ′ ( F p ) ∣ \lvert E'(\mathbb{F}_p) \rvert ∣ E ′ ( F p )∣ が 小さい 素因数 r r r を もつような B ′ B' B ′ を 探し、 E ′ E' E ′ 上の 位数 r r r の 点 Q ′ Q' Q ′ を 公開鍵として 送る。被害者の 計算結果 [ d ] Q ′ [d]Q' [ d ] Q ′ は ⟨ Q ′ ⟩ \langle Q' \rangle ⟨ Q ′ ⟩ の r r r 個の 元の どれかで、それは d m o d r d \bmod r d mod r で 決まる。被害者が この 結果から 作った 鍵で 応答を 暗号化すれば、攻撃者は r r r 通りの 候補を 試して d m o d r d \bmod r d mod r を 知る(共有値が x x x 座標だけなら、[ j ] Q ′ [j]Q' [ j ] Q ′ と [ − j ] Q ′ [-j]Q' [ − j ] Q ′ の 区別が つかず ± \pm ± を 除いて)。異なる r r r に ついて 繰り返し、中国剰余定理で まとめれば d d d が 求まる( ± \pm ± が 残る 場合も、 d 2 m o d r d^2 \bmod r d 2 mod r は 確定するので、 r r r の 積が n 2 n^2 n 2 を 超えるまで 集めて d 2 d^2 d 2 を 中国剰余定理で 求め、その 平方根を とればよい)。これを 無効曲線攻撃 (invalid curve attack) と いう。手間は n \sqrt{n} n ではなく、使う 小さい 素数 r r r の 和の 程度である。
例 4.6 例 4.4 の ボブの 秘密鍵 d B = 158 d_B = 158 d B = 158 を、攻撃者が 無効曲線攻撃で 求める。 B ′ = 9 B' = 9 B ′ = 9 の 曲線 E ′ : y 2 = x 3 + x + 9 E'\colon y^2 = x^3 + x + 9 E ′ : y 2 = x 3 + x + 9 は ∣ E ′ ( F 211 ) ∣ = 210 = 2 ⋅ 3 ⋅ 5 ⋅ 7 \lvert E'(\mathbb{F}_{211}) \rvert = 210 = 2 \cdot 3 \cdot 5 \cdot 7 ∣ E ′ ( F 211 )∣ = 210 = 2 ⋅ 3 ⋅ 5 ⋅ 7 で、位数 2 , 3 , 5 , 7 2, 3, 5, 7 2 , 3 , 5 , 7 の 点を もつ。それぞれを ボブに 送ると、ボブの 計算結果は 次のようになる。
送る 点 Q ′ Q' Q ′
位数
ボブの 計算 [ 158 ] Q ′ [158]Q' [ 158 ] Q ′
x x x 座標から わかる こと
( 112 , 0 ) (112, 0) ( 112 , 0 )
2 2 2
O O O
d B ≡ 0 ( m o d 2 ) d_B \equiv 0 \pmod 2 d B ≡ 0 ( mod 2 )
( 72 , 80 ) (72, 80) ( 72 , 80 )
3 3 3
( 72 , 131 ) = [ 2 ] Q ′ (72, 131) = [2]Q' ( 72 , 131 ) = [ 2 ] Q ′
d B ≡ ± 1 ( m o d 3 ) d_B \equiv \pm 1 \pmod 3 d B ≡ ± 1 ( mod 3 )
( 55 , 63 ) (55, 63) ( 55 , 63 )
5 5 5
( 126 , 130 ) = [ 3 ] Q ′ (126, 130) = [3]Q' ( 126 , 130 ) = [ 3 ] Q ′
d B ≡ ± 2 ( m o d 5 ) d_B \equiv \pm 2 \pmod 5 d B ≡ ± 2 ( mod 5 )
( 149 , 7 ) (149, 7) ( 149 , 7 )
7 7 7
( 158 , 16 ) = [ 4 ] Q ′ (158, 16) = [4]Q' ( 158 , 16 ) = [ 4 ] Q ′
d B ≡ ± 3 ( m o d 7 ) d_B \equiv \pm 3 \pmod 7 d B ≡ ± 3 ( mod 7 )
(x x x 座標が 126 126 126 の 点は [ 2 ] Q ′ [2]Q' [ 2 ] Q ′ と [ 3 ] Q ′ [3]Q' [ 3 ] Q ′ 、x x x 座標が 158 158 158 の 点は [ 3 ] Q ′ [3]Q' [ 3 ] Q ′ と [ 4 ] Q ′ [4]Q' [ 4 ] Q ′ である。)符号の 組み合わせは 2 3 = 8 2^3 = 8 2 3 = 8 通りで、中国剰余定理で d B m o d 210 d_B \bmod 210 d B mod 210 の 候補 32 , 38 , 52 , 88 , 122 , 158 , 172 , 178 32, 38, 52, 88, 122, 158, 172, 178 32 , 38 , 52 , 88 , 122 , 158 , 172 , 178 を 得る。 d B < 223 d_B < 223 d B < 223 なので 候補は これだけで、公開鍵 Q B = [ d B ] G Q_B = [d_B]G Q B = [ d B ] G と 照合すると d B = 158 d_B = 158 d B = 158 が 決まる。曲線の 位数 223 223 223 の 総当たりに 比べれば 小さいが、実際の 256 ビットの 曲線では、この 差が 2 128 2^{128} 2 128 回の 計算と 数十個の 小さい 素数の 和との 差に なる。
対策は 単純で、受け取った 点を 使う 前に 検証する ことである。NIST SP 800-56A Rev. 3 の「完全な 公開鍵の 検証」は 次の 4 段階からなる。
Q ≠ O Q \neq O Q = O を 確かめる。
座標 x Q , y Q x_Q, y_Q x Q , y Q が 0 0 0 以上 p − 1 p - 1 p − 1 以下の 整数である ことを 確かめる。
y Q 2 ≡ x Q 3 + A x Q + B ( m o d p ) y_Q^2 \equiv x_Q^3 + Ax_Q + B \pmod{p} y Q 2 ≡ x Q 3 + A x Q + B ( mod p ) (曲線上に ある こと)を 確かめる。
[ n ] Q = O [n]Q = O [ n ] Q = O (正しい 部分群に ある こと)を 確かめる。
h = 1 h = 1 h = 1 の 曲線では 3 までで 十分で( O O O 以外の 点は すべて 位数 n n n )、TLS 1.3 も P-256 などに ついて 1〜3 の 検証を 義務づけている。な お 4 A 3 + 27 B ′ 2 = 0 4A^3 + 27B'^2 = 0 4 A 3 + 27 B ′2 = 0 と なる B ′ B' B ′ を 使われると、計算は 特異 3 次曲線の 非特異点の 群( F p \mathbb{F}_p F p の 加法群、 F p × \mathbb{F}_p^\times F p × 、または F p 2 × \mathbb{F}_{p^2}^\times F p 2 × の 部分群と 同型。 21 第2章 定理 2.19)の 中で 行われ、そこでは 離散対数が さらに 易しい。これも 3 の 検証で 防げる。
4.5 余因子と 小部分群
h > 1 h > 1 h > 1 の 曲線では、曲線上の 点でも 位数の 小さい 成分を 含みうる。
命題 4.7 (余因子に よる 分解) ∣ E ( F p ) ∣ = h n \lvert E(\mathbb{F}_p) \rvert = hn ∣ E ( F p )∣ = hn 、n n n は 素数で n ∤ h n \nmid h n ∤ h とし、G G G を 位数 n n n の 点と する。
[ n ] Q = O [n]Q = O [ n ] Q = O と なる 点 Q Q Q 全体は ⟨ G ⟩ \langle G \rangle ⟨ G ⟩ に 一致する。
すべての Q ∈ E ( F p ) Q \in E(\mathbb{F}_p) Q ∈ E ( F p ) は Q = Q 1 + T Q = Q_1 + T Q = Q 1 + T (Q 1 ∈ ⟨ G ⟩ Q_1 \in \langle G \rangle Q 1 ∈ ⟨ G ⟩ , [ h ] T = O [h]T = O [ h ] T = O )とただ 一通りに 書ける。
h ∣ k h \mid k h ∣ k ならば [ k ] Q = [ k ] Q 1 [k]Q = [k]Q_1 [ k ] Q = [ k ] Q 1 である。特に [ h ] Q ∈ ⟨ G ⟩ [h]Q \in \langle G \rangle [ h ] Q ∈ ⟨ G ⟩ 。
証明. (1) [ n ] Q = O [n]Q = O [ n ] Q = O で Q ∉ ⟨ G ⟩ Q \notin \langle G \rangle Q ∈ / ⟨ G ⟩ と なる Q Q Q が あると する。 Q Q Q の 位数は n n n で、⟨ G ⟩ ∩ ⟨ Q ⟩ \langle G \rangle \cap \langle Q \rangle ⟨ G ⟩ ∩ ⟨ Q ⟩ は 素数位数の 群 ⟨ Q ⟩ \langle Q \rangle ⟨ Q ⟩ の 部分群で Q Q Q を 含まないので { O } \lbrace O \rbrace { O } である。すると ( U , V ) ↦ U + V (U, V) \mapsto U + V ( U , V ) ↦ U + V は ⟨ G ⟩ × ⟨ Q ⟩ \langle G \rangle \times \langle Q \rangle ⟨ G ⟩ × ⟨ Q ⟩ から E ( F p ) E(\mathbb{F}_p) E ( F p ) への 単射と なり、 n 2 n^2 n 2 個の 元の 部分群が できる。ラグランジュの 定理より n 2 ∣ h n n^2 \mid hn n 2 ∣ hn 、すな わち n ∣ h n \mid h n ∣ h と なって 矛盾する。(2) u h + v n = 1 uh + vn = 1 u h + v n = 1 と なる 整数 u , v u, v u , v を とり、 Q 1 = [ u h ] Q Q_1 = [uh]Q Q 1 = [ u h ] Q , T = [ v n ] Q T = [vn]Q T = [ v n ] Q と おくと Q = Q 1 + T Q = Q_1 + T Q = Q 1 + T である。[ n ] Q 1 = [ u ] [ h n ] Q = O [n]Q_1 = [u][hn]Q = O [ n ] Q 1 = [ u ] [ hn ] Q = O なので (1) より Q 1 ∈ ⟨ G ⟩ Q_1 \in \langle G \rangle Q 1 ∈ ⟨ G ⟩ 、また [ h ] T = [ v ] [ h n ] Q = O [h]T = [v][hn]Q = O [ h ] T = [ v ] [ hn ] Q = O 。一意性:Q 1 + T = Q 1 ′ + T ′ Q_1 + T = Q_1' + T' Q 1 + T = Q 1 ′ + T ′ なら Q 1 − Q 1 ′ = T ′ − T Q_1 - Q_1' = T' - T Q 1 − Q 1 ′ = T ′ − T は [ n ] [n] [ n ] でも [ h ] [h] [ h ] でも O O O に なり、 gcd ( n , h ) = 1 \gcd(n, h) = 1 g cd( n , h ) = 1 より O O O である。(3) [ k ] T = O [k]T = O [ k ] T = O に よる。 □ \square □
攻撃者が 正しい 公開鍵 Q Q Q の 代わりに Q + T Q + T Q + T (T T T は 位数の 小さい 点)を 送ると、被害者の 結果 [ d ] ( Q + T ) = [ d ] Q + [ d ] T [d](Q + T) = [d]Q + [d]T [ d ] ( Q + T ) = [ d ] Q + [ d ] T は d m o d ord ( T ) d \bmod \operatorname{ord}(T) d mod ord ( T ) に 依存し、その 情報が 漏れうる( 小部分群攻撃 )。漏れるのは ord ( T ) ∣ h \operatorname{ord}(T) \mid h ord ( T ) ∣ h の 分だけで、命題 4.7 (3) に より、スカラーを h h h の 倍数に すれば T T T の 成分は 消える。SP 800-56A の ECDH(余因子つき ECDH)は P = [ h d A ] Q B P = [hd_A]Q_B P = [ h d A ] Q B の x x x 座標を 共有値とし、 P = O P = O P = O なら 中止する。
Curve25519(h = 8 h = 8 h = 8 )の ECDH である X25519(RFC 7748)は、秘密鍵の 32 バイトの 整数の 最下位 3 ビットと 最上位ビットを 0 0 0 、その 次の ビットを 1 1 1 に した 値( 2 254 2^{254} 2 254 に 8 8 8 の 倍数を 足した 形)を スカラーと して 使う。これを クランプ (clamping) と いう。スカラーが 8 8 8 の 倍数なので、位数が 8 8 8 を 割る点を 送られると 結果は O O O に なり、X25519 は それを 全ビット 0 0 0 の 値と して 出力する。この 共有値は 受け取った 側の 秘密鍵に 依存しないので、RFC 7748 は これを 確かめて 中止して よい(MAY)とし、TLS 1.3(RFC 8446)は 確かめて 中止しなければならない(MUST)と している。
次の コードは RFC 7748 の 手順を Python で 書いた もので(安全な 実装ではない)、規格の テストベクトルとの 一致と、位数 2 の 点 u = 0 u = 0 u = 0 に 対する 出力が 全ビット 0 0 0 に なる ことを 確かめる。
p = 2**255 - 19
A24 = 121665 # (486662 - 2) / 4
def x25519(k_bytes, u_bytes):
k = bytearray(k_bytes)
k[0] &= 248; k[31] &= 127; k[31] |= 64 # クランプ:8 の倍数、最上位は 2^254
k = int.from_bytes(k, "little")
u = int.from_bytes(u_bytes, "little") & ((1 << 255) - 1)
x2, z2, x3, z3 = 1, 0, u, 1 # (x2:z2) = O, (x3:z3) = P
for t in reversed(range(255)): # モンゴメリー・ラダー(4.10 節)
bit = (k >> t) & 1
if bit: # 実装では定数時間の cswap にする
x2, z2, x3, z3 = x3, z3, x2, z2
a, b = (x2 + z2) % p, (x2 - z2) % p
c, d = (x3 + z3) % p, (x3 - z3) % p
da, cb = d * a % p, c * b % p
x3, z3 = (da + cb) ** 2 % p, u * (da - cb) ** 2 % p # 差が P の 2 点の和
aa, bb = a * a % p, b * b % p
x2, z2 = aa * bb % p, (aa - bb) * (aa + A24 * (aa - bb)) % p # 2 倍
if bit:
x2, z2, x3, z3 = x3, z3, x2, z2
return (x2 * pow(z2, p - 2, p) % p).to_bytes(32, "little")
k = bytes.fromhex("a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4")
u = bytes.fromhex("e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c")
print(x25519(k, u).hex())
print(x25519(k, (0).to_bytes(32, "little")).hex()) # u = 0 は位数 2 の点 (0, 0)
c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552
0000000000000000000000000000000000000000000000000000000000000000
1 行目は RFC 7748 の テストベクトルの 出力と 一致する。X25519 は u u u 座標(x x x 座標に あたる)だけで 計算するので、どんな u ∈ F p u \in \mathbb{F}_p u ∈ F p も 受け付け、 u u u が E E E の 点の 座標でなければ 二次ツイストと 呼ばれる 別の 曲線の 上で 計算が 進む(命題 4.5 と 同じ 現象)。Curve25519 は ツイストの 位数も 4 × 4 \times 4 × (素数)に なるように 選ばれており、ツイスト上で 計算させても 漏れうるのは d m o d 4 d \bmod 4 d mod 4 だけで、それも クランプで 消える。この 性質を ツイスト安全性 (twist security) と いう。
4.6 ECDSA
ECDSA は DSA(第2章 )を 楕円曲線の 群に 移した 署名方式で、FIPS 186-5 に 定められている。メッセージの ハッシュ値を n n n の ビット長に 切り詰めた 整数を z z z と する。
署名 :秘密鍵 d d d で 署名するには、(1) ナンス (nonce) k ∈ [ 1 , n − 1 ] k \in [1, n - 1] k ∈ [ 1 , n − 1 ] を 一様ランダムに 選ぶ。(2) [ k ] G = ( x 1 , y 1 ) [k]G = (x_1, y_1) [ k ] G = ( x 1 , y 1 ) とし、r = x 1 m o d n r = x_1 \bmod n r = x 1 mod n と する( x 1 x_1 x 1 は 0 ≤ x 1 < p 0 \leq x_1 < p 0 ≤ x 1 < p の 整数と みる)。(3) s = k − 1 ( z + r d ) m o d n s = k^{-1}(z + rd) \bmod n s = k − 1 ( z + r d ) mod n と する。 r = 0 r = 0 r = 0 または s = 0 s = 0 s = 0 なら (1) に 戻る。署名は ( r , s ) (r, s) ( r , s ) である。
検証 :公開鍵 Q = [ d ] G Q = [d]G Q = [ d ] G に ついて、(1) 1 ≤ r , s ≤ n − 1 1 \leq r, s \leq n - 1 1 ≤ r , s ≤ n − 1 を 確かめる。(2) w = s − 1 w = s^{-1} w = s − 1 , u 1 = z w u_1 = zw u 1 = z w , u 2 = r w u_2 = rw u 2 = r w (すべて m o d n \bmod n mod n )とし、X = [ u 1 ] G + [ u 2 ] Q X = [u_1]G + [u_2]Q X = [ u 1 ] G + [ u 2 ] Q を 計算する。(3) X ≠ O X \neq O X = O かつ X X X の x x x 座標を n n n で 割った 余りが r r r なら 受理する。
定理 4.8 (ECDSA の 正しさ)正しく 作られた 署名は 受理される。
証明. 1 ≤ r , s ≤ n − 1 1 \leq r, s \leq n - 1 1 ≤ r , s ≤ n − 1 は 作り方から 成り立ち、 n n n は 素数なので w = s − 1 m o d n w = s^{-1} \bmod n w = s − 1 mod n が 定まる。 s k ≡ z + r d ( m o d n ) sk \equiv z + rd \pmod{n} s k ≡ z + r d ( mod n ) より
u 1 + u 2 d ≡ w ( z + r d ) ≡ s − 1 s k = k ( m o d n ) u_1 + u_2d \equiv w(z + rd) \equiv s^{-1}sk = k \pmod{n} u 1 + u 2 d ≡ w ( z + r d ) ≡ s − 1 s k = k ( mod n )
G G G の 位数は n n n なので X = [ u 1 ] G + [ u 2 ] ( [ d ] G ) = [ u 1 + u 2 d ] G = [ k ] G X = [u_1]G + [u_2]\bigl([d]G\bigr) = [u_1 + u_2d]G = [k]G X = [ u 1 ] G + [ u 2 ] ( [ d ] G ) = [ u 1 + u 2 d ] G = [ k ] G である。1 ≤ k ≤ n − 1 1 \leq k \leq n - 1 1 ≤ k ≤ n − 1 より X ≠ O X \neq O X = O で、その x x x 座標 x 1 x_1 x 1 に ついて x 1 m o d n = r x_1 \bmod n = r x 1 mod n = r だから 受理される。 □ \square □
例 4.9 例 4.3 の 曲線で 秘密鍵を d = 97 d = 97 d = 97 と すると Q = [ 97 ] G = ( 95 , 38 ) Q = [97]G = (95, 38) Q = [ 97 ] G = ( 95 , 38 ) 。z = 41 z = 41 z = 41 に ナンス k = 150 k = 150 k = 150 で 署名すると、 [ 150 ] G = ( 33 , 177 ) [150]G = (33, 177) [ 150 ] G = ( 33 , 177 ) より r = 33 r = 33 r = 33 、s = 150 − 1 ( 41 + 33 ⋅ 97 ) m o d 223 = 90 s = 150^{-1}(41 + 33 \cdot 97) \bmod 223 = 90 s = 15 0 − 1 ( 41 + 33 ⋅ 97 ) mod 223 = 90 。検証では w = 90 − 1 ≡ 57 w = 90^{-1} \equiv 57 w = 9 0 − 1 ≡ 57 , u 1 = 41 ⋅ 57 ≡ 107 u_1 = 41 \cdot 57 \equiv 107 u 1 = 41 ⋅ 57 ≡ 107 , u 2 = 33 ⋅ 57 ≡ 97 u_2 = 33 \cdot 57 \equiv 97 u 2 = 33 ⋅ 57 ≡ 97 で、[ 107 ] G + [ 97 ] Q = ( 33 , 177 ) [107]G + [97]Q = (33, 177) [ 107 ] G + [ 97 ] Q = ( 33 , 177 ) の x x x 座標が r = 33 r = 33 r = 33 に 一致する。
これは 正しさの 証明であって、偽造できない こと(安全性)の 証明ではない。正しく 作られた 署名 ( r , s ) (r, s) ( r , s ) が あれば ( r , n − s ) (r, n - s) ( r , n − s ) も 受理される(問題 4.3)ので、署名の 値その ものを 取引の 識別子などに 使う 場合は、 s ≤ n / 2 s \leq n/2 s ≤ n /2 の ものだけを 受け付けると いった 約束が 要る。
4.7 ナンスの 事故
ECDSA の 安全性は、ナンス k k k が 秘密で、一様で、使い回されない ことに 全面的に 依存している。
定理 4.10 (ナンスの 漏洩と 再利用) ( r , s ) (r, s) ( r , s ) を ハッシュ値 z z z に 対する 秘密鍵 d d d の 署名と する。
その 署名の ナンス k k k が わかれば、 d ≡ r − 1 ( s k − z ) ( m o d n ) d \equiv r^{-1}(sk - z) \pmod{n} d ≡ r − 1 ( s k − z ) ( mod n ) である。
同じ d d d と 同じ k k k で、z 1 ≢ z 2 ( m o d n ) z_1 \not\equiv z_2 \pmod{n} z 1 ≡ z 2 ( mod n ) に 署名した ( r , s 1 ) (r, s_1) ( r , s 1 ) , ( r , s 2 ) (r, s_2) ( r , s 2 ) が あれば、 s 1 ≢ s 2 s_1 \not\equiv s_2 s 1 ≡ s 2 であり、k ≡ ( z 1 − z 2 ) ( s 1 − s 2 ) − 1 ( m o d n ) k \equiv (z_1 - z_2)(s_1 - s_2)^{-1} \pmod{n} k ≡ ( z 1 − z 2 ) ( s 1 − s 2 ) − 1 ( mod n ) である。したがって (1) に より d d d が 求まる。
証明. (1) s k ≡ z + r d sk \equiv z + rd s k ≡ z + r d を d d d に ついて 解く。 1 ≤ r ≤ n − 1 1 \leq r \leq n - 1 1 ≤ r ≤ n − 1 と n n n が 素数である ことから r r r は 可逆である。(2) s i k ≡ z i + r d s_ik \equiv z_i + rd s i k ≡ z i + r d (i = 1 , 2 i = 1, 2 i = 1 , 2 )を 辺々 引くと ( s 1 − s 2 ) k ≡ z 1 − z 2 ≢ 0 (s_1 - s_2)k \equiv z_1 - z_2 \not\equiv 0 ( s 1 − s 2 ) k ≡ z 1 − z 2 ≡ 0 。よって s 1 ≢ s 2 s_1 \not\equiv s_2 s 1 ≡ s 2 で、s 1 − s 2 s_1 - s_2 s 1 − s 2 は 可逆である。 □ \square □
同じ k k k なら 同じ r r r に なるので、再利用は 署名を 見るだけで わかる。
例 4.11 例 4.9 の 署名者が、同じ k = 150 k = 150 k = 150 で z 2 = 179 z_2 = 179 z 2 = 179 にも 署名したとする。 s 2 = 150 − 1 ( 179 + 33 ⋅ 97 ) m o d 223 = 82 s_2 = 150^{-1}(179 + 33 \cdot 97) \bmod 223 = 82 s 2 = 15 0 − 1 ( 179 + 33 ⋅ 97 ) mod 223 = 82 である。攻撃者は 公開された ( 33 , 90 ) (33, 90) ( 33 , 90 ) , ( 33 , 82 ) (33, 82) ( 33 , 82 ) と z 1 , z 2 z_1, z_2 z 1 , z 2 だけから
k ≡ ( 41 − 179 ) ⋅ ( 90 − 82 ) − 1 ≡ 85 ⋅ 28 ≡ 150 , d ≡ 33 − 1 ( 90 ⋅ 150 − 41 ) ≡ 196 ⋅ 79 ≡ 97 ( m o d 223 ) k \equiv (41 - 179) \cdot (90 - 82)^{-1} \equiv 85 \cdot 28 \equiv 150, \qquad d \equiv 33^{-1}(90 \cdot 150 - 41) \equiv 196 \cdot 79 \equiv 97 \pmod{223} k ≡ ( 41 − 179 ) ⋅ ( 90 − 82 ) − 1 ≡ 85 ⋅ 28 ≡ 150 , d ≡ 3 3 − 1 ( 90 ⋅ 150 − 41 ) ≡ 196 ⋅ 79 ≡ 97 ( mod 223 )
を 得る( 8 − 1 ≡ 28 8^{-1} \equiv 28 8 − 1 ≡ 28 , 33 − 1 ≡ 196 33^{-1} \equiv 196 3 3 − 1 ≡ 196 )。
これは 机上の 話ではない。2010 年末には、ある 家庭用ゲーム機の ソフトウェアの 署名で 毎回 同じ k k k が 使われており、定理 4.10 (2) に よって 署名鍵が 計算された ことが 公表された。
ナンスは「使い回さない」だけでは 足りない。
範囲が 狭い :点 R = [ k ] G R = [k]G R = [ k ] G は、検証と 同じ 計算 [ u 1 ] G + [ u 2 ] Q [u_1]G + [u_2]Q [ u 1 ] G + [ u 2 ] Q (定理 4.8 の 証明)で 誰でも 求められる。 k k k が [ 0 , K ) [0, K) [ 0 , K ) に あると わかっていれば、範囲を 制限した ベビーステップ・ジャイアントステップ法で O ( K ) O(\sqrt{K}) O ( K ) 回の 群演算で k k k が 求まり( 第3章 問題 3.5)、定理 4.10 (1) で d d d が わかる。 k k k を 64 ビットの 乱数から 作れば、群が どれほど 大きくても 約 2 33 2^{33} 2 33 回で 破られる。上位の ビットの 多くが 0 0 0 に 偏った ナンスは、範囲の 狭い ナンスに ほかならない。
関係が ある :連続する 署名で k 2 = k 1 + 1 k_2 = k_1 + 1 k 2 = k 1 + 1 のように ナンスが 既知の 関係に あれば、2 つの 署名の 式は ( k 1 , d ) (k_1, d) ( k 1 , d ) に ついての 連立一次合同式に なり、 d d d が 求まる(問題 4.5)。
偏りが ある :ナンスの 上位の 数ビットが 0 0 0 に 偏るだけでも、多数の 署名から 格子の 手法( 第7章 の LLL アルゴリズム。隠れた 数の 問題と 呼ばれる 問題に 帰着される)で 秘密鍵が 求まる ことが 知られている。計算時間の 差から ナンスの ビット長が 漏れ、この 方法で 鍵が 復元された 実例も 報告されている。 k k k を「256 ビットの 乱数を n n n で 割った 余り」と して 作るだけでも わずかな 偏りが 生じるので、FIPS 186-5 は 64 ビット以上 余分に 乱数を とってから 余りを とるか、範囲外の 値を 捨てて 選び直す方法を 定めている。
決定的な ナンス 乱数の 質に 依存しないように、ナンスを 秘密鍵と メッセージから 決定的に 作る 方法が ある。RFC 6979 の 決定的 ECDSA は、 d d d と ハッシュ値を 種と する、HMAC にもと づく 擬似乱数生成器(HMAC_DRBG)から k k k を 作り、FIPS 186-5 でも 承認されている。同じ メッセージには 同じ 署名が 出るが(それは 無害である)、異なる メッセージの ナンスは 秘密鍵を 知らない 者には 予測できず、一致する こともまずない。 秘密を 含まずに メッセージだけから k = H ( m ) k = H(m) k = H ( m ) のように 作るのは 致命的な 誤りである(問題 4.4)。
ヒント
実務では
ナンスの 生成を 自作しない。署名は、決定的 ECDSA(RFC 6979)や EdDSA を 実装した 検証済みの ライブラリで 行う。乱数を 使う 場合も OS の 暗号論的乱数源を 使う( 第1章 )。決定的な 署名は、計算途中に 故障を 起こさせる 攻撃(故障注入)で 同じ ナンスの 署名を 作られる 危険が あり、FIPS 186-5 も ハードウェアや 組み込み機器では 特に 注意する よう 述べている。署名した 直後に 自分で 検証してから 出力するのは、故障への 簡単な 対策である。
4.8 EdDSA と Curve25519
曲線 Curve25519 は p = 2 255 − 19 p = 2^{255} - 19 p = 2 255 − 19 上の モンゴメリー形の 曲線
v 2 = u 3 + 486662 u 2 + u v^2 = u^3 + 486662u^2 + u v 2 = u 3 + 486662 u 2 + u
で、∣ E ( F p ) ∣ = 8 n \lvert E(\mathbb{F}_p) \rvert = 8n ∣ E ( F p )∣ = 8 n , n = 2 252 + 27742317777372353535851937790883648493 n = 2^{252} + 27742317777372353535851937790883648493 n = 2 252 + 27742317777372353535851937790883648493 (素数)、ベースポイントの u u u 座標は 9 9 9 である(RFC 7748)。これは ツイストエドワーズ形 (twisted Edwards form) の 曲線 edwards25519
− x 2 + y 2 = 1 + d x 2 y 2 , d = − 121665 121666 ∈ F p -x^2 + y^2 = 1 + dx^2y^2, \qquad d = -\frac{121665}{121666} \in \mathbb{F}_p − x 2 + y 2 = 1 + d x 2 y 2 , d = − 121666 121665 ∈ F p
と ( u , v ) = ( ( 1 + y ) / ( 1 − y ) , − 486664 ⋅ u / x ) (u, v) = \bigl((1 + y)/(1 - y), \sqrt{-486664} \cdot u/x\bigr) ( u , v ) = ( ( 1 + y ) / ( 1 − y ) , − 486664 ⋅ u / x ) で 双有理同値で(RFC 7748。この d d d は ECDSA の 秘密鍵とは 別物)、ベースポイントは y = 4 / 5 y = 4/5 y = 4/5 の 点( u = ( 1 + 4 / 5 ) / ( 1 − 4 / 5 ) = 9 u = (1 + 4/5)/(1 - 4/5) = 9 u = ( 1 + 4/5 ) / ( 1 − 4/5 ) = 9 に 対応)である。エドワーズ形の 加法公式は
( x 1 , y 1 ) + ( x 2 , y 2 ) = ( x 1 y 2 + x 2 y 1 1 + d x 1 x 2 y 1 y 2 , y 1 y 2 + x 1 x 2 1 − d x 1 x 2 y 1 y 2 ) (x_1, y_1) + (x_2, y_2) = \left(\frac{x_1y_2 + x_2y_1}{1 + dx_1x_2y_1y_2}, \ \frac{y_1y_2 + x_1x_2}{1 - dx_1x_2y_1y_2}\right) ( x 1 , y 1 ) + ( x 2 , y 2 ) = ( 1 + d x 1 x 2 y 1 y 2 x 1 y 2 + x 2 y 1 , 1 − d x 1 x 2 y 1 y 2 y 1 y 2 + x 1 x 2 )
で、単位元は ( 0 , 1 ) (0, 1) ( 0 , 1 ) 、− ( x , y ) = ( − x , y ) -(x, y) = (-x, y) − ( x , y ) = ( − x , y ) である(主張のみ。一般の a x 2 + y 2 = 1 + d x 2 y 2 ax^2 + y^2 = 1 + dx^2y^2 a x 2 + y 2 = 1 + d x 2 y 2 の 場合が 21 第5章 5.5 節に ある)。 − 1 -1 − 1 が F p \mathbb{F}_p F p の 平方数( p ≡ 1 ( m o d 4 ) p \equiv 1 \pmod 4 p ≡ 1 ( mod 4 ) )で d d d が 平方数でない(計算機で 確認)ので、曲線上の どんな 2 点に ついても 分母は 0 0 0 に ならない(問題 4.8)。2 倍算も 単位元も 場合分けなしに 同じ式で 計算できる 公式を 完全な 加法公式 (complete addition law) と いい、秘密に 依存する 分岐を なくすのに 役立つ。
Ed25519 (RFC 8032) H H H を SHA-512 とし、ハッシュ値は 512 ビットの 整数と みる。ベースポイントを G G G (位数 n n n )と する。
鍵 :秘密鍵は 32 バイトの 乱数 k 0 k_0 k 0 。H ( k 0 ) H(k_0) H ( k 0 ) の 前半を X25519 と 同様に クランプした 整数を 秘密の スカラー s s s 、後半を p r e f i x \mathit{prefix} prefix とし、公開鍵を Q = [ s ] G Q = [s]G Q = [ s ] G と する。
署名 :メッセージ M M M に 対し、 r = H ( p r e f i x ∥ M ) m o d n r = H(\mathit{prefix} \mathbin{\Vert} M) \bmod n r = H ( prefix ∥ M ) mod n , R = [ r ] G R = [r]G R = [ r ] G , c = H ( R ∥ Q ∥ M ) m o d n c = H(R \mathbin{\Vert} Q \mathbin{\Vert} M) \bmod n c = H ( R ∥ Q ∥ M ) mod n , S = ( r + c s ) m o d n S = (r + cs) \bmod n S = ( r + cs ) mod n とし、署名を ( R , S ) (R, S) ( R , S ) と する( ∥ \Vert ∥ は 連結。点は バイト列に 符号化してから 入れる)。
検証 :0 ≤ S < n 0 \leq S < n 0 ≤ S < n を 確かめ、 c = H ( R ∥ Q ∥ M ) m o d n c = H(R \mathbin{\Vert} Q \mathbin{\Vert} M) \bmod n c = H ( R ∥ Q ∥ M ) mod n と して [ 8 ] [ S ] G = [ 8 ] R + [ 8 ] [ c ] Q [8][S]G = [8]R + [8][c]Q [ 8 ] [ S ] G = [ 8 ] R + [ 8 ] [ c ] Q が 成り立てば受理する( [ S ] G = R + [ c ] Q [S]G = R + [c]Q [ S ] G = R + [ c ] Q を 確かめても よい)。
(RFC 8032 では 基点を B B B 、公開鍵を A A A 、位数を L L L と 書く。)
定理 4.12 (EdDSA の 正しさ)正しく 作られた 署名は 受理される。
証明. S ≡ r + c s ( m o d n ) S \equiv r + cs \pmod{n} S ≡ r + cs ( mod n ) で G G G の 位数は n n n なので、[ S ] G = [ r ] G + [ c ] ( [ s ] G ) = R + [ c ] Q [S]G = [r]G + [c]\bigl([s]G\bigr) = R + [c]Q [ S ] G = [ r ] G + [ c ] ( [ s ] G ) = R + [ c ] Q 。両辺に [ 8 ] [8] [ 8 ] を 施せば 2 つ目の 式も 成り立つ。 0 ≤ S < n 0 \leq S < n 0 ≤ S < n は 作り方から 成り立つ。 □ \square □
なぜナンスを 決定的に 作るのか EdDSA の r r r も ECDSA の k k k と 同じ 役割を もち、同じ r r r で 異なる メッセージに 署名すると、 c 1 ≢ c 2 c_1 \not\equiv c_2 c 1 ≡ c 2 の とき s ≡ ( S 1 − S 2 ) ( c 1 − c 2 ) − 1 ( m o d n ) s \equiv (S_1 - S_2)(c_1 - c_2)^{-1} \pmod{n} s ≡ ( S 1 − S 2 ) ( c 1 − c 2 ) − 1 ( mod n ) で 秘密の スカラーが 求まる(定理 4.10 と 同じ 計算)。EdDSA は r r r を 秘密の p r e f i x \mathit{prefix} prefix と メッセージの ハッシュ から 作るので、(1) 署名の ときに 乱数が 要らず、乱数生成器の 欠陥の 影響を 受けない。(2) 同じ メッセージなら 同じ r r r で、署名も 同じに なるので 害は ない。(3) 異なる メッセージで r r r が 一致するのは H H H の 出力が m o d n \bmod n mod n で 一致する 場合に 限られ、 H H H が ランダムな 関数のように ふる まうなら、その 確率は 1 組あたり約 1 / n 1/n 1/ n で 無視できる。(4) p r e f i x \mathit{prefix} prefix を 知らない 者には r r r が 予測できない。RFC 8032 は「EdDSA の 署名は 決定的であり、質の 悪い 乱数で 署名する ことから 生じる 攻撃を 防ぐ」と 述べている。
検証で S < n S < n S < n を 確かめるのは、 S + n S + n S + n も 同じ 式を みたしてしまい、同じ メッセージに 別の 有効な 署名が 作れる(展性)のを 防ぐ ためである。また 余因子 8 8 8 を 掛ける 式と 掛けない 式は、位数の 小さい 成分を 混ぜた 悪意の ある 署名に 対して 判定が 分かれうる。RFC 8032 は どちらを 使っても よいと しているが、複数の 実装が 同じ 判定を しなければならない 用途(合意形成など)では どちらかに 統一する 必要が ある。
4.9 安全な 曲線の 条件
ECDLP が 易しくなる 曲線の 性質と、規格の 曲線が 満たしている 条件を まとめる。ここで n n n は ベースポイントの 位数、 h h h は 余因子である。
n n n が 大きな 素数で、 h h h が 小さい :ポーリッヒ–ヘルマン法と n \sqrt{n} n の 汎用攻撃への 対策。 h h h は 1, 4, 8 程度に する(4.5 節)。
埋め込み次数が 大きい :n ∣ p k − 1 n \mid p^k - 1 n ∣ p k − 1 と なる 最小の k k k を 埋め込み次数と いう。ヴェイユ対などを 使うと ECDLP は F p k × \mathbb{F}_{p^k}^\times F p k × の 離散対数問題に 帰着され(MOV 帰着。主張のみ、 21 第5章 定理 5.15)、k k k が 小さければ 指数計算法系の 方法で 解ける。超特異曲線は k k k が 小さい(素体 F p \mathbb{F}_p F p , p ≥ 5 p \geq 5 p ≥ 5 上では k ≤ 2 k \leq 2 k ≤ 2 。同 命題 5.16。問題 4.7 は 一例)。
アノマラスで ない :∣ E ( F p ) ∣ = p \lvert E(\mathbb{F}_p) \rvert = p ∣ E ( F p )∣ = p の 曲線(アノマラス曲線)では ECDLP が 多項式時間で 解ける(主張のみ、 21 第5章 定理 5.18)。
ツイスト安全性 :x x x 座標だけで 計算する 実装を 想定するなら、二次ツイストの 位数も 大きな 素因数を もつように する(4.5 節)。NIST SP 800-186 は、P-224 の ツイストの 位数の 最大の 素因数が 約 2 117 2^{117} 2 117 しかないので、ツイスト上で 計算させられないよう検証が 欠かせないと 注意している。
作り方が 検証できる :パラメータに 意図的な 弱点が 仕込まれていない ことを 第三者が 確かめられるように する。P-256 の B B B は 公開された 種から SHA-1 で 導かれる(SEC 2 の「検証可能な ランダム」。ただし種 その ものが どう 選ばれたかは 公表されていない)。Curve25519 の 係数 486662 486662 486662 は 条件を みたす 最小の 値と して 決められている(RFC 7748 付録 A。そこでは フロベニウスの トレースが 0 , 1 0, 1 0 , 1 でない こと、埋め込み次数が ( n − 1 ) / 100 (n - 1)/100 ( n − 1 ) /100 より 大きい こと、虚数乗法の 判別式が 2 100 2^{100} 2 100 より 大きいことも 条件に している)。
実際に 広く 使われている 3 つの 曲線の パラメータを、規格(SEC 2、FIPS 186-5 / SP 800-186、RFC 7748)と 照合して 示す。 ∣ E ( F p ) ∣ = h n \lvert E(\mathbb{F}_p) \rvert = hn ∣ E ( F p )∣ = hn と n n n が 素数である こと、トレースが 0 , 1 0, 1 0 , 1 でない こと、埋め込み次数(それぞれ ( n − 1 ) / 6 (n - 1)/6 ( n − 1 ) /6 , ( n − 1 ) / 3 (n - 1)/3 ( n − 1 ) /3 , ( n − 1 ) / 6 (n - 1)/6 ( n − 1 ) /6 )を PARI/GP で 確かめた。
secp256k1(SEC 2):ビットコインなど
p = 2^256 - 2^32 - 977, y^2 = x^3 + 7, h = 1
n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
P-256(FIPS 186-5 / SP 800-186。SEC 2 では secp256r1):TLS など
p = 2^256 - 2^224 + 2^192 + 2^96 - 1, y^2 = x^3 - 3x + B, h = 1
B = 5AC635D8 AA3A93E7 B3EBBD55 769886BC 651D06B0 CC53B0F6 3BCE3C3E 27D2604B
n = FFFFFFFF 00000000 FFFFFFFF FFFFFFFF BCE6FAAD A7179E84 F3B9CAC2 FC632551
Curve25519(RFC 7748):X25519、Ed25519(edwards25519 として)
p = 2^255 - 19, v^2 = u^3 + 486662 u^2 + u, h = 8
n = 2^252 + 27742317777372353535851937790883648493
secp256k1 は j j j 不変量が 0 0 0 の 曲線で、位数 6 の 自己同型(効率的に 計算できる 自己準同型)を もつ。これは スカラー倍の 高速化に 使える 一方、 ρ \rho ρ 法も 約 6 \sqrt{6} 6 倍速く できる ことが 知られているが、ビット数に して 1〜2 ビットの 差で、128 ビット程度の 安全性は 保たれる。
4.10 秘密に 依存しない 実装
数学的に 正しい 計算も、 計算の しかたが 秘密に 依存すると 漏れる。2 倍と 加算に よる スカラー倍は、k k k の 2 進表示の 1 1 1 の ビットでだけ加算を 行うので、処理時間や 消費電力の 波形から 加算の 有無、すな わち k k k の ビットが 読み取れる。秘密に 依存する 分岐・メモリの 参照位置・可変時間の 命令を なくした 実装を 定数時間実装 (constant-time implementation) と いう。
命題 4.13 (モンゴメリー・ラダー, Montgomery ladder)k = ∑ i = 0 t b i 2 i k = \sum_{i=0}^{t} b_i2^i k = ∑ i = 0 t b i 2 i (b i ∈ { 0 , 1 } b_i \in \lbrace 0, 1 \rbrace b i ∈ { 0 , 1 } )とし、( R 0 , R 1 ) = ( O , P ) (R_0, R_1) = (O, P) ( R 0 , R 1 ) = ( O , P ) から 始めて i = t , t − 1 , … , 0 i = t, t - 1, \dots, 0 i = t , t − 1 , … , 0 の 順に、 b i = 0 b_i = 0 b i = 0 なら ( R 0 , R 1 ) ← ( [ 2 ] R 0 , R 0 + R 1 ) (R_0, R_1) \leftarrow ([2]R_0, R_0 + R_1) ( R 0 , R 1 ) ← ([ 2 ] R 0 , R 0 + R 1 ) 、b i = 1 b_i = 1 b i = 1 なら ( R 0 , R 1 ) ← ( R 0 + R 1 , [ 2 ] R 1 ) (R_0, R_1) \leftarrow (R_0 + R_1, [2]R_1) ( R 0 , R 1 ) ← ( R 0 + R 1 , [ 2 ] R 1 ) と する。すると 各段の 後で R 1 − R 0 = P R_1 - R_0 = P R 1 − R 0 = P であり、最後に R 0 = [ k ] P R_0 = [k]P R 0 = [ k ] P と なる。
証明. 段の 始めに ( R 0 , R 1 ) = ( [ u ] P , [ u + 1 ] P ) (R_0, R_1) = ([u]P, [u + 1]P) ( R 0 , R 1 ) = ([ u ] P , [ u + 1 ] P ) なら、段の 後は b i = 0 b_i = 0 b i = 0 の とき ( [ 2 u ] P , [ 2 u + 1 ] P ) ([2u]P, [2u + 1]P) ([ 2 u ] P , [ 2 u + 1 ] P ) 、b i = 1 b_i = 1 b i = 1 の とき ( [ 2 u + 1 ] P , [ 2 u + 2 ] P ) ([2u + 1]P, [2u + 2]P) ([ 2 u + 1 ] P , [ 2 u + 2 ] P ) 、すな わち ( [ 2 u + b i ] P , [ 2 u + b i + 1 ] P ) ([2u + b_i]P, [2u + b_i + 1]P) ([ 2 u + b i ] P , [ 2 u + b i + 1 ] P ) である。最初は u = 0 u = 0 u = 0 で、u u u は k k k の 上位の ビットから 順に 2 進数を 読んだ値に なるので、最後に u = k u = k u = k である。□ \square □
ラダーでは、どの 段でも 加算 1 回と 2 倍 1 回を 行い、 b i b_i b i で 決まるのは どちらの 変数に 書き込むか だけである。そこで b i b_i b i に 応じて ( R 0 , R 1 ) (R_0, R_1) ( R 0 , R 1 ) を 入れ替える 操作を、分岐ではなく ビット演算( b i b_i b i から 全ビット 1 または 全ビット 0 の マスクを 作り、マスクと R 0 ⊕ R 1 R_0 \oplus R_1 R 0 ⊕ R 1 の 論理積を 両方に 排他的論理和で 足す)で 行えば、演算の 並びは k k k に よらない(RFC 7748 の cswap)。さらに 差 R 1 − R 0 = P R_1 - R_0 = P R 1 − R 0 = P が いつも 既知なので、モンゴメリー形では x x x 座標だけの 公式で 計算でき(4.5 節の コード)、エドワーズ形なら 完全な 加法公式で 例外処理の 分岐も なくせる。ただし、これだけですべての サイドチャネルが 防げるわけではない。RFC 7748 も、メモリの 参照パターンや 分岐が 秘密の ビットに 依存しない こと、さらに F p \mathbb{F}_p F p の 算術 その もの(環境に よっては 除算などの 機械命令の 実行時間)から 情報が 漏れない ことにまで 注意する よう 求めている。
注意
「数学的に 正しい コード」と「安全な コード」は 別物である。テストベクトルに 一致する ことは、定数時間であることも、無効な 点を 拒否する ことも 保証しない。楕円曲線暗号は 検証済みの ライブラリで 使い、自作の 実装を 本番で 使わない。
まとめ
E : y 2 = x 3 + A x + B E\colon y^2 = x^3 + Ax + B E : y 2 = x 3 + A x + B 上の 点は 弦と 接線の 公式で 群を なし( B B B は 公式に 現れない)、 ∣ E ( F p ) ∣ \lvert E(\mathbb{F}_p) \rvert ∣ E ( F p )∣ は p + 1 ± 2 p p + 1 \pm 2\sqrt{p} p + 1 ± 2 p の 範囲に ある(ハッセの 定理)。
ドメインパラメータ ( p , A , B , G , n , h ) (p, A, B, G, n, h) ( p , A , B , G , n , h ) で、秘密鍵 d d d 、公開鍵 Q = [ d ] G Q = [d]G Q = [ d ] G 。よい 曲線では 汎用攻撃(約 n \sqrt{n} n )しか 知られておらず、256 ビットの n n n で 128 ビットの 安全性に なる。
ECDH は [ d A ] Q B = [ d B ] Q A [d_A]Q_B = [d_B]Q_A [ d A ] Q B = [ d B ] Q A 。受け取った 点を 検証しないと、 B B B の 異なる 曲線の 小さい 位数の 点(無効曲線攻撃)や、小さい 位数の 成分(小部分群攻撃)から d d d が 漏れる。完全な 検証は Q ≠ O Q \neq O Q = O 、座標の 範囲、曲線の 方程式、 [ n ] Q = O [n]Q = O [ n ] Q = O の 4 段階。
余因子 h > 1 h > 1 h > 1 の 曲線では、スカラーを h h h の 倍数に すれば 小さい 位数の 成分が 消える。X25519 は クランプで これを 行い、位数の 小さい 点に 対しては 全ビット 0 0 0 を 出力する(TLS 1.3 では 検出して 中止)。
ECDSA の 正しさは u 1 + u 2 d ≡ k u_1 + u_2d \equiv k u 1 + u 2 d ≡ k から 従う。ナンス k k k が 漏れる ・再利用される ・範囲が 狭い・関係が ある ・ 偏っていると、秘密鍵が 求まる。
EdDSA(Ed25519)は ナンスを 秘密の 値と メッセージの ハッシュから 決定的に 作り、完全な 加法公式を もつ エドワーズ曲線を 使う。 [ S ] G = R + [ c ] Q [S]G = R + [c]Q [ S ] G = R + [ c ] Q が 正しさの 式。
安全な 曲線の 条件: 大きな 素数位数と 小さい 余因子、大きい 埋め込み次数、アノマラスでない こと、ツイスト安全性、検証できる 作り方。
秘密に 依存する 分岐を なくす:モンゴメリー・ラダーと cswap、完全な 加法公式。
演習問題
問題 4.1 ★ E : y 2 = x 3 + 2 x + 4 E\colon y^2 = x^3 + 2x + 4 E : y 2 = x 3 + 2 x + 4 を F 13 \mathbb{F}_{13} F 13 上で 考える。 E E E が 楕円曲線である ことを 確かめ、 ∣ E ( F 13 ) ∣ \lvert E(\mathbb{F}_{13}) \rvert ∣ E ( F 13 )∣ を 求めて ハッセの 定理の 範囲に ある ことを 確かめよ。また、 O O O 以外の どの 点も 群全体を 生成する ことを 示せ。
解答
4 A 3 + 27 B 2 = 32 + 432 = 464 ≡ 9 ≢ 0 ( m o d 13 ) 4A^3 + 27B^2 = 32 + 432 = 464 \equiv 9 \not\equiv 0 \pmod{13} 4 A 3 + 27 B 2 = 32 + 432 = 464 ≡ 9 ≡ 0 ( mod 13 ) なので 楕円曲線である。法 13 13 13 の 0 0 0 でない 平方は 1 , 3 , 4 , 9 , 10 , 12 1, 3, 4, 9, 10, 12 1 , 3 , 4 , 9 , 10 , 12 である。f ( x ) = x 3 + 2 x + 4 f(x) = x^3 + 2x + 4 f ( x ) = x 3 + 2 x + 4 の 値は x = 0 , 1 , … , 12 x = 0, 1, \dots, 12 x = 0 , 1 , … , 12 の 順に 4 , 7 , 3 , 11 , 11 , 9 , 11 , 10 , 12 , 10 , 10 , 5 , 1 4, 7, 3, 11, 11, 9, 11, 10, 12, 10, 10, 5, 1 4 , 7 , 3 , 11 , 11 , 9 , 11 , 10 , 12 , 10 , 10 , 5 , 1 で、平方剰余に なるのは x = 0 , 2 , 5 , 7 , 8 , 9 , 10 , 12 x = 0, 2, 5, 7, 8, 9, 10, 12 x = 0 , 2 , 5 , 7 , 8 , 9 , 10 , 12 の 8 個(0 0 0 に なる x x x は ない)。それぞれ y y y が 2 個ずつ あるので、 O O O と 合わせて ∣ E ( F 13 ) ∣ = 16 + 1 = 17 \lvert E(\mathbb{F}_{13}) \rvert = 16 + 1 = 17 ∣ E ( F 13 )∣ = 16 + 1 = 17 。∣ 17 − 14 ∣ = 3 ≤ 2 13 ≈ 7.2 \lvert 17 - 14 \rvert = 3 \leq 2\sqrt{13} \approx 7.2 ∣ 17 − 14 ∣ = 3 ≤ 2 13 ≈ 7.2 で ハッセの 定理の 範囲に ある。 17 17 17 は 素数なので、ラグランジュの 定理に より O O O 以外の 点の 位数は 17 17 17 で、群全体を 生成する。
問題 4.2 ★ ★ 例 4.3 の 曲線( n = 223 n = 223 n = 223 , G = ( 0 , 1 ) G = (0, 1) G = ( 0 , 1 ) )で、ある 署名者が 同じ ナンスで ハッシュ値 z 1 = 12 z_1 = 12 z 1 = 12 , z 2 = 99 z_2 = 99 z 2 = 99 に 署名し、署名 ( 130 , 54 ) (130, 54) ( 130 , 54 ) , ( 130 , 3 ) (130, 3) ( 130 , 3 ) を 公開した。秘密鍵 d d d を 求めよ。また、求めた d d d が 正しい ことを どう 確かめれば よいか。
解答
定理 4.10 (2) より k ≡ ( 12 − 99 ) ( 54 − 3 ) − 1 ≡ 136 ⋅ 51 − 1 ( m o d 223 ) k \equiv (12 - 99)(54 - 3)^{-1} \equiv 136 \cdot 51^{-1} \pmod{223} k ≡ ( 12 − 99 ) ( 54 − 3 ) − 1 ≡ 136 ⋅ 5 1 − 1 ( mod 223 ) 。51 ⋅ 35 = 1785 = 8 ⋅ 223 + 1 51 \cdot 35 = 1785 = 8 \cdot 223 + 1 51 ⋅ 35 = 1785 = 8 ⋅ 223 + 1 より 51 − 1 ≡ 35 51^{-1} \equiv 35 5 1 − 1 ≡ 35 で、k ≡ 136 ⋅ 35 = 4760 ≡ 77 k \equiv 136 \cdot 35 = 4760 \equiv 77 k ≡ 136 ⋅ 35 = 4760 ≡ 77 。次に d ≡ 130 − 1 ( 54 ⋅ 77 − 12 ) ≡ 130 − 1 ⋅ 132 d \equiv 130^{-1}(54 \cdot 77 - 12) \equiv 130^{-1} \cdot 132 d ≡ 13 0 − 1 ( 54 ⋅ 77 − 12 ) ≡ 13 0 − 1 ⋅ 132 。130 ⋅ 211 = 27430 = 123 ⋅ 223 + 1 130 \cdot 211 = 27430 = 123 \cdot 223 + 1 130 ⋅ 211 = 27430 = 123 ⋅ 223 + 1 より 130 − 1 ≡ 211 130^{-1} \equiv 211 13 0 − 1 ≡ 211 で、d ≡ 211 ⋅ 132 = 27852 ≡ 200 ( m o d 223 ) d \equiv 211 \cdot 132 = 27852 \equiv 200 \pmod{223} d ≡ 211 ⋅ 132 = 27852 ≡ 200 ( mod 223 ) 。確かめるには、[ d ] G [d]G [ d ] G が 公開鍵 Q Q Q に 一致する こと(ここでは Q = [ 200 ] G = ( 206 , 90 ) Q = [200]G = (206, 90) Q = [ 200 ] G = ( 206 , 90 ) )、あるいは [ k ] G [k]G [ k ] G の x x x 座標が r r r である こと( [ 77 ] G = ( 130 , 153 ) [77]G = (130, 153) [ 77 ] G = ( 130 , 153 ) )を 計算すればよい。
問題 4.3 ★ ★ ( r , s ) (r, s) ( r , s ) が ハッシュ値 z z z に 対する 正しい ECDSA 署名なら、 ( r , n − s ) (r, n - s) ( r , n − s ) も 検証に 合格する ことを 示せ。これは どんな 場面で 問題に なるか。
解答
s ′ = n − s ≡ − s s' = n - s \equiv -s s ′ = n − s ≡ − s と おくと 1 ≤ s ′ ≤ n − 1 1 \leq s' \leq n - 1 1 ≤ s ′ ≤ n − 1 で、w ′ = s ′ − 1 ≡ − w w' = s'^{-1} \equiv -w w ′ = s ′ − 1 ≡ − w , u 1 ′ = z w ′ ≡ − u 1 u_1' = zw' \equiv -u_1 u 1 ′ = z w ′ ≡ − u 1 , u 2 ′ = r w ′ ≡ − u 2 u_2' = rw' \equiv -u_2 u 2 ′ = r w ′ ≡ − u 2 。よって X ′ = [ u 1 ′ ] G + [ u 2 ′ ] Q = − ( [ u 1 ] G + [ u 2 ] Q ) = − X X' = [u_1']G + [u_2']Q = -([u_1]G + [u_2]Q) = -X X ′ = [ u 1 ′ ] G + [ u 2 ′ ] Q = − ([ u 1 ] G + [ u 2 ] Q ) = − X である。定理 4.8 より X ≠ O X \neq O X = O で その x x x 座標を n n n で 割った 余りは r r r で、− X -X − X は X X X と 同じ x x x 座標を もつ( y y y 座標の 符号だけが 違う)ので、 ( r , s ′ ) (r, s') ( r , s ′ ) も 受理される。秘密鍵を 知らない 第三者が、同じ メッセージに 対する 別の 有効な 署名を 作れる(展性)ので、署名の バイト列を 取引の 識別子に 使う システムでは、識別子を 書き換えられてしまう。 s ≤ n / 2 s \leq n/2 s ≤ n /2 の 署名だけを 受け付けるなど、表し方を 一つに 決める 約束で 防ぐ。
問題 4.4 ★ ★ (この 実装の どこが 危ないか)ある 実装は「乱数生成器が 信用できないので」と、ナンスを k = H ( m ) m o d n k = H(m) \bmod n k = H ( m ) mod n (H H H は 公開の ハッシュ関数、 m m m は 署名する メッセージ)と して ECDSA の 署名を 作っている。(1) 署名が 1 つ 公開されれば 秘密鍵が 求まる ことを 示せ。(2) 別の 実装は k k k を 32 ビットの 乱数と している。署名 1 つから 秘密鍵を 求める 手間を 見積もれ。(3) 正しい 直し方を 述べよ。
解答
(1) m m m は 署名とともに 公開されるので、誰でも k = H ( m ) m o d n k = H(m) \bmod n k = H ( m ) mod n を 計算できる。定理 4.10 (1) より d ≡ r − 1 ( s k − z ) ( m o d n ) d \equiv r^{-1}(sk - z) \pmod{n} d ≡ r − 1 ( s k − z ) ( mod n ) 。
(2) 点 R = [ k ] G R = [k]G R = [ k ] G は 検証と 同じ 計算 R = [ u 1 ] G + [ u 2 ] Q R = [u_1]G + [u_2]Q R = [ u 1 ] G + [ u 2 ] Q (u 1 = z s − 1 u_1 = zs^{-1} u 1 = z s − 1 , u 2 = r s − 1 u_2 = rs^{-1} u 2 = r s − 1 )で 求まる。 0 ≤ k < 2 32 0 \leq k < 2^{32} 0 ≤ k < 2 32 の 範囲の 離散対数 log G R \log_G R log G R を、範囲を 制限した ベビーステップ・ジャイアントステップ法(第3章 問題 3.5)で 約 2 ⋅ 2 16 = 2 17 2 \cdot 2^{16} = 2^{17} 2 ⋅ 2 16 = 2 17 回の 群演算で 求められる。 k k k が わかれば (1) と 同様に d d d が 求まる。曲線が 256 ビットでも、手間は 2 128 2^{128} 2 128 ではなく 2 17 2^{17} 2 17 程度である。
(3) ナンスは n n n と 同程度の ビット数を もち、秘密鍵を 知らない 者には 予測できなければならない。決定的に するなら RFC 6979 のように 秘密鍵 d d d を 入力に 含めた、HMAC にもと づく 擬似乱数から 作るか、EdDSA を 使う。乱数を 使うなら OS の 暗号論的乱数源から、 n n n の ビット長より 64 ビット以上 多く 取って n n n で 割った 余り(または 範囲外を 捨てて 選び直す方法)で 作る。
問題 4.5 ★ ★ 例 4.3 の 曲線( n = 223 n = 223 n = 223 )で、ある 実装は 署名の たびに ナンスを 1 ずつ 増や していた。ハッシュ値 z 1 = 50 z_1 = 50 z 1 = 50 への 署名 ( 123 , 81 ) (123, 81) ( 123 , 81 ) と、その 次の z 2 = 60 z_2 = 60 z 2 = 60 への 署名 ( 157 , 221 ) (157, 221) ( 157 , 221 ) から、秘密鍵 d d d を 求めよ。一般に、 k 2 = k 1 + 1 k_2 = k_1 + 1 k 2 = k 1 + 1 の とき d d d が 求まる 条件を 述べよ。
解答
s 1 k 1 ≡ z 1 + r 1 d s_1k_1 \equiv z_1 + r_1d s 1 k 1 ≡ z 1 + r 1 d , s 2 ( k 1 + 1 ) ≡ z 2 + r 2 d s_2(k_1 + 1) \equiv z_2 + r_2d s 2 ( k 1 + 1 ) ≡ z 2 + r 2 d である。1 つ目から k 1 ≡ s 1 − 1 ( z 1 + r 1 d ) k_1 \equiv s_1^{-1}(z_1 + r_1d) k 1 ≡ s 1 − 1 ( z 1 + r 1 d ) を 2 つ目に 代入し、 t = s 2 s 1 − 1 t = s_2s_1^{-1} t = s 2 s 1 − 1 と おくと t ( z 1 + r 1 d ) + s 2 ≡ z 2 + r 2 d t(z_1 + r_1d) + s_2 \equiv z_2 + r_2d t ( z 1 + r 1 d ) + s 2 ≡ z 2 + r 2 d 、すな わち
( t r 1 − r 2 ) d ≡ z 2 − s 2 − t z 1 ( m o d n ) (tr_1 - r_2)d \equiv z_2 - s_2 - tz_1 \pmod{n} ( t r 1 − r 2 ) d ≡ z 2 − s 2 − t z 1 ( mod n )
である。81 − 1 ≡ 212 81^{-1} \equiv 212 8 1 − 1 ≡ 212 (81 ⋅ 212 = 17172 = 77 ⋅ 223 + 1 81 \cdot 212 = 17172 = 77 \cdot 223 + 1 81 ⋅ 212 = 17172 = 77 ⋅ 223 + 1 )より t ≡ 221 ⋅ 212 ≡ 22 t \equiv 221 \cdot 212 \equiv 22 t ≡ 221 ⋅ 212 ≡ 22 、t r 1 − r 2 = 22 ⋅ 123 − 157 = 2549 ≡ 96 tr_1 - r_2 = 22 \cdot 123 - 157 = 2549 \equiv 96 t r 1 − r 2 = 22 ⋅ 123 − 157 = 2549 ≡ 96 、z 2 − s 2 − t z 1 = 60 − 221 − 1100 ≡ 77 z_2 - s_2 - tz_1 = 60 - 221 - 1100 \equiv 77 z 2 − s 2 − t z 1 = 60 − 221 − 1100 ≡ 77 。96 − 1 ≡ 151 96^{-1} \equiv 151 9 6 − 1 ≡ 151 (96 ⋅ 151 = 14496 = 65 ⋅ 223 + 1 96 \cdot 151 = 14496 = 65 \cdot 223 + 1 96 ⋅ 151 = 14496 = 65 ⋅ 223 + 1 )なので d ≡ 77 ⋅ 151 = 11627 ≡ 31 ( m o d 223 ) d \equiv 77 \cdot 151 = 11627 \equiv 31 \pmod{223} d ≡ 77 ⋅ 151 = 11627 ≡ 31 ( mod 223 ) 。検算:[ 31 ] G = ( 100 , 159 ) [31]G = (100, 159) [ 31 ] G = ( 100 , 159 ) が 公開鍵に 一致する。
一般には ( k 1 , d ) (k_1, d) ( k 1 , d ) に ついての 連立一次合同式 s 1 k 1 − r 1 d ≡ z 1 s_1k_1 - r_1d \equiv z_1 s 1 k 1 − r 1 d ≡ z 1 , s 2 k 1 − r 2 d ≡ z 2 − s 2 s_2k_1 - r_2d \equiv z_2 - s_2 s 2 k 1 − r 2 d ≡ z 2 − s 2 の 係数行列式 r 1 s 2 − r 2 s 1 r_1s_2 - r_2s_1 r 1 s 2 − r 2 s 1 が n n n で 割り切れなければ( t r 1 − r 2 ≢ 0 tr_1 - r_2 \not\equiv 0 t r 1 − r 2 ≡ 0 と 同値)、 d d d が ただ 一つ 定まる。ナンスどうしに 既知の 一次関係 k 2 = a k 1 + b k_2 = ak_1 + b k 2 = a k 1 + b が あれば、同じように 解ける。
問題 4.6 ★ ★ Curve25519 の 群 E ( F p ) E(\mathbb{F}_p) E ( F p ) は 位数 8 n 8n 8 n (n n n は 奇素数)の 巡回群である。(1) クランプされた スカラー k k k に ついて、任意の 点 P P P に 対し [ k ] P [k]P [ k ] P は 位数 n n n の 部分群に 入る ことを 示せ。(2) 位数が 8 8 8 を 割る 点 T T T を 相手から 送られた とき、X25519 の 出力が 自分の 秘密鍵に よらない 値に なる ことを 示し、全ビット 0 0 0 の 出力を 確かめて 中止する こと(RFC 7748 では 任意、TLS 1.3 では 必須)の 意味を 説明せよ。
解答
(1) クランプされた k k k は 8 8 8 の 倍数である。命題 4.7( h = 8 h = 8 h = 8 )の (3) より、P = P 1 + T P = P_1 + T P = P 1 + T (P 1 P_1 P 1 は 位数 n n n の 部分群の 元、 [ 8 ] T = O [8]T = O [ 8 ] T = O )と 分解すると [ k ] P = [ k ] P 1 [k]P = [k]P_1 [ k ] P = [ k ] P 1 で、これは 位数 n n n の 部分群に 入る。
(2) [ 8 ] T = O [8]T = O [ 8 ] T = O なので [ k ] T = [ k / 8 ] ( [ 8 ] T ) = O [k]T = [k/8]\bigl([8]T\bigr) = O [ k ] T = [ k /8 ] ( [ 8 ] T ) = O 。X25519 は O O O を u = 0 u = 0 u = 0 (全ビット 0 0 0 )と して 出力する(4.5 節の コードでは z 2 = 0 z_2 = 0 z 2 = 0 に なり、 0 p − 2 = 0 0^{p - 2} = 0 0 p − 2 = 0 )。この 値は 受け取った 側の 秘密鍵 k k k に まったく 依存しないので、 T T T を 送った 攻撃者は、秘密鍵を 何も 使わずに「共有された 秘密」を 知っている ことになる。両者の 秘密鍵が 共有値に 寄与すると いう 性質(RFC 7748 の いう contributory behaviour)を 前提に する プロトコルでは、これが 脆弱性に なる。全ビット 0 0 0 を 検出して 中止すれば 防げる(TLS 1.3 では 必須)。
問題 4.7 ★ ★ p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod{4} p ≡ 3 ( mod 4 ) を 素数とし、 E : y 2 = x 3 + x E\colon y^2 = x^3 + x E : y 2 = x 3 + x を F p \mathbb{F}_p F p 上で 考える。(1) ∣ E ( F p ) ∣ = p + 1 \lvert E(\mathbb{F}_p) \rvert = p + 1 ∣ E ( F p )∣ = p + 1 を 示せ。(2) n n n を ∣ E ( F p ) ∣ \lvert E(\mathbb{F}_p) \rvert ∣ E ( F p )∣ を 割る 奇素数と すると、埋め込み次数は 2 以下である ことを 示し、この 曲線が 暗号に 向かない 理由を 説明せよ。
解答
(1) f ( x ) = x 3 + x f(x) = x^3 + x f ( x ) = x 3 + x は f ( − x ) = − f ( x ) f(-x) = -f(x) f ( − x ) = − f ( x ) を みたす。 p ≡ 3 ( m o d 4 ) p \equiv 3 \pmod 4 p ≡ 3 ( mod 4 ) より − 1 -1 − 1 は 平方非剰余( 04-algebra 第1章 系 1.50 (2))なので、x 2 + 1 = 0 x^2 + 1 = 0 x 2 + 1 = 0 は 解を もたず、 f ( x ) = 0 f(x) = 0 f ( x ) = 0 と なるのは x = 0 x = 0 x = 0 だけである。x ≠ 0 x \neq 0 x = 0 なら f ( x ) ≠ 0 f(x) \neq 0 f ( x ) = 0 で、( f ( − x ) p ) = ( − 1 p ) ( f ( x ) p ) = − ( f ( x ) p ) \left(\frac{f(-x)}{p}\right) = \left(\frac{-1}{p}\right)\left(\frac{f(x)}{p}\right) = -\left(\frac{f(x)}{p}\right) ( p f ( − x ) ) = ( p − 1 ) ( p f ( x ) ) = − ( p f ( x ) ) なので、組 { x , − x } \lbrace x, -x \rbrace { x , − x } の うちちょうど 一方で f f f が 平方剰余に なり、その x x x に 点が 2 個ある。組は ( p − 1 ) / 2 (p - 1)/2 ( p − 1 ) /2 個なので、x ≠ 0 x \neq 0 x = 0 の 点は p − 1 p - 1 p − 1 個。これに ( 0 , 0 ) (0, 0) ( 0 , 0 ) と O O O を 加えて ∣ E ( F p ) ∣ = p + 1 \lvert E(\mathbb{F}_p) \rvert = p + 1 ∣ E ( F p )∣ = p + 1 。
(2) n ∣ p + 1 n \mid p + 1 n ∣ p + 1 なので n ∣ ( p + 1 ) ( p − 1 ) = p 2 − 1 n \mid (p + 1)(p - 1) = p^2 - 1 n ∣ ( p + 1 ) ( p − 1 ) = p 2 − 1 で、埋め込み次数は 2 以下である(gcd ( p + 1 , p − 1 ) = 2 \gcd(p + 1, p - 1) = 2 g cd( p + 1 , p − 1 ) = 2 なので 奇素数 n n n は p − 1 p - 1 p − 1 を 割らず、ちょうど 2 である)。MOV 帰着に より、 ⟨ G ⟩ \langle G \rangle ⟨ G ⟩ の ECDLP は F p 2 × \mathbb{F}_{p^2}^\times F p 2 × の 離散対数問題に 帰着され、そこでは 準指数時間の 方法が 使える(この 曲線で 帰着を 実際に 計算した 例が 21 第5章 例 5.17 に ある)。 F p 2 × \mathbb{F}_{p^2}^\times F p 2 × の 離散対数を 難しく するには p 2 p^2 p 2 が 数千ビット必要に なり、楕円曲線を 使う 利点(鍵の 短さ)が 失われる。
問題 4.8 ★ ★ ★ 標数が 2 でない 体 K K K 上で、a a a は 0 0 0 でない 平方数、 d d d は 平方数でないとし、曲線 a x 2 + y 2 = 1 + d x 2 y 2 ax^2 + y^2 = 1 + dx^2y^2 a x 2 + y 2 = 1 + d x 2 y 2 を 考える。曲線上の 任意の 2 点 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1, y_1), (x_2, y_2) ( x 1 , y 1 ) , ( x 2 , y 2 ) (座標は K K K の 元)に ついて 1 ± d x 1 x 2 y 1 y 2 ≠ 0 1 \pm dx_1x_2y_1y_2 \neq 0 1 ± d x 1 x 2 y 1 y 2 = 0 である ことを 示せ(4.8 節の 加法公式の 分母は 決して 0 0 0 に ならない)。
解答
ε ∈ { 1 , − 1 } \varepsilon \in \lbrace 1, -1 \rbrace ε ∈ { 1 , − 1 } に ついて d x 1 x 2 y 1 y 2 = ε dx_1x_2y_1y_2 = \varepsilon d x 1 x 2 y 1 y 2 = ε と 仮定して 矛盾を 導く。この とき x 1 , x 2 , y 1 , y 2 ≠ 0 x_1, x_2, y_1, y_2 \neq 0 x 1 , x 2 , y 1 , y 2 = 0 で、ε 2 = 1 \varepsilon^2 = 1 ε 2 = 1 より ( d x 1 2 y 1 2 ) ( d x 2 2 y 2 2 ) = 1 (dx_1^2y_1^2)(dx_2^2y_2^2) = 1 ( d x 1 2 y 1 2 ) ( d x 2 2 y 2 2 ) = 1 。α 2 = a \alpha^2 = a α 2 = a と なる α ∈ K \alpha \in K α ∈ K を とる。曲線の 方程式と 合わせると
d x 1 2 y 1 2 ( a x 2 2 + y 2 2 ) = d x 1 2 y 1 2 ( 1 + d x 2 2 y 2 2 ) = d x 1 2 y 1 2 + 1 = a x 1 2 + y 1 2 dx_1^2y_1^2(ax_2^2 + y_2^2) = dx_1^2y_1^2(1 + dx_2^2y_2^2) = dx_1^2y_1^2 + 1 = ax_1^2 + y_1^2 d x 1 2 y 1 2 ( a x 2 2 + y 2 2 ) = d x 1 2 y 1 2 ( 1 + d x 2 2 y 2 2 ) = d x 1 2 y 1 2 + 1 = a x 1 2 + y 1 2
であり、2 α ε x 1 y 1 = 2 α x 1 y 1 ⋅ d x 1 x 2 y 1 y 2 = d x 1 2 y 1 2 ⋅ 2 α x 2 y 2 2\alpha\varepsilon x_1y_1 = 2\alpha x_1y_1 \cdot dx_1x_2y_1y_2 = dx_1^2y_1^2 \cdot 2\alpha x_2y_2 2 α ε x 1 y 1 = 2 α x 1 y 1 ⋅ d x 1 x 2 y 1 y 2 = d x 1 2 y 1 2 ⋅ 2 α x 2 y 2 なので、2 つを 辺々 足して
( α x 1 + ε y 1 ) 2 = d x 1 2 y 1 2 ( α x 2 + y 2 ) 2 (\alpha x_1 + \varepsilon y_1)^2 = dx_1^2y_1^2(\alpha x_2 + y_2)^2 ( α x 1 + ε y 1 ) 2 = d x 1 2 y 1 2 ( α x 2 + y 2 ) 2
を 得る。 α x 2 + y 2 ≠ 0 \alpha x_2 + y_2 \neq 0 α x 2 + y 2 = 0 なら d = ( ( α x 1 + ε y 1 ) / ( x 1 y 1 ( α x 2 + y 2 ) ) ) 2 d = \bigl((\alpha x_1 + \varepsilon y_1)/(x_1y_1(\alpha x_2 + y_2))\bigr)^2 d = ( ( α x 1 + ε y 1 ) / ( x 1 y 1 ( α x 2 + y 2 )) ) 2 は 平方数と なり矛盾する。 α \alpha α を − α -\alpha − α に 取り替えても 同じ 議論が できるので、 − α x 2 + y 2 ≠ 0 -\alpha x_2 + y_2 \neq 0 − α x 2 + y 2 = 0 でも 矛盾する。両方が 0 0 0 なら 2 y 2 = 0 2y_2 = 0 2 y 2 = 0 、標数が 2 でないので y 2 = 0 y_2 = 0 y 2 = 0 と なり、 y 2 ≠ 0 y_2 \neq 0 y 2 = 0 に 反する。 □ \square □
(21 第5章 問題 5.7 は、a = 1 a = 1 a = 1 の 場合を 示してから 座標の 取り替えで 一般の a a a に 帰着させている。座標が d d d の 平方根を 含む拡大体の 点では 分母が 0 0 0 に なりうるので、「 K K K の 元」と いう 仮定は 外せない。)