この 章の 目標
ハッシュ関数の 原像・第 2 原像・衝突に 対する 困難性の 関係を 説明し、誕生日攻撃の 成功確率の 評価を 証明できる
長さ拡張攻撃を 理解し、HMAC が H ( k ∥ m ) H(k \mathbin{\Vert} m) H ( k ∥ m ) と 違って 安全に 使える 理由を 説明できる
格子の 行列式が 基底に よらない こと、2 次元の ガウス簡約が 最短ベクトルを 与える ことを 証明し、LLL に よる 格子攻撃の 仕組みを 説明できる
レゲフの LWE 暗号方式で、誤差の 総和が 小さければ 正しく 復号できる ことを 証明できる
量子計算機が 公開鍵暗号・共通鍵暗号・ハッシュ関数に 与える 影響の 違いと、耐量子暗号への 移行の 考え方を 説明できる
前提 :第2章 、第3章 、02-linear-algebra 第4章 (行列式)、02-linear-algebra 第7章 (内積・グラム–シュミットの 直交化)。7.5 節では ミンコフスキーの 凸体定理( 15-algebraic-number-theory 第3章 で 証明されている)の 主張だけを 使う。7.8 節では 第4章の ECDSA に 触れる。
本章では、暗号の あらゆる 場所で 使われる ハッシュ関数、暗号を 破る 道具であると 同時に 新しい 暗号の 土台でも ある 格子、第2〜4章の 公開鍵暗号を すべて 多項式時間で 破る 量子計算機を 扱い、NIST が 2024 年に 規格化した 耐量子暗号と 移行の 考え方を 整理する。
7.1 ハッシュ関数の 安全性
ダウンロードした ファイルの SHA-256 の ハッシュ値を 配布元の 掲載値と 比べて 改ざんを 検出できるのは、同じ ハッシュ値を もつ別の ファイルを 作るのが 難しいからである。
定義 7.1 (ハッシュ関数と その 安全性, 非形式的)任意の 長さ( 実際には 2 64 2^{64} 2 64 ビット未満などの 上限が ある)の ビット列を n n n ビットの ビット列に 写す、効率よく 計算できる 関数 H H H を ハッシュ関数 (hash function) と いい、 H ( x ) H(x) H ( x ) を x x x の ハッシュ値と いう。
原像困難性 (preimage resistance):ランダムに 選んだ x x x (たとえば 2 n 2n 2 n ビットの 列から 一様に)の ハッシュ値 y = H ( x ) y = H(x) y = H ( x ) だけから、H ( x ′ ) = y H(x') = y H ( x ′ ) = y と なる x ′ x' x ′ を 求めるのが 難しい( x ′ = x x' = x x ′ = x でなくてよい)。
第 2 原像困難性 (second-preimage resistance):ランダムに 選んだ x x x が 与えられた とき、 x ′ ≠ x x' \neq x x ′ = x かつ H ( x ′ ) = H ( x ) H(x') = H(x) H ( x ′ ) = H ( x ) と なる x ′ x' x ′ を 求めるのが 難しい。
衝突困難性 (collision resistance):x ≠ x ′ x \neq x' x = x ′ かつ H ( x ) = H ( x ′ ) H(x) = H(x') H ( x ) = H ( x ′ ) と なる 組 ( x , x ′ ) (x, x') ( x , x ′ ) (衝突 , collision)を 求めるのが 難しい。
入力は 出力より ずっと 多いので 衝突は 無数に あり、問題は それを 見つけられるかである(固定した 関数には 衝突を 出力するだけの アルゴリズムが 誰も 知らなくても 存在するので、厳密な 定義には 鍵つきの 関数族を 使う。実際の ハッシュ関数の 安全性は 最良の 攻撃の 計算量で 測る)。
命題 7.2 (衝突困難なら 第 2 原像困難)第 2 原像を 確率 ε \varepsilon ε で 求める アルゴリズム A \mathcal{A} A が あれば、それを 1 回 使って 衝突を 確率 ε \varepsilon ε で 求められる。
証明. 定義 7.1 の 2 の とおりに x x x を 選んで A \mathcal{A} A に 与え、出力 x ′ x' x ′ と 組に する。 A \mathcal{A} A が 成功すれば x ′ ≠ x x' \neq x x ′ = x かつ H ( x ′ ) = H ( x ) H(x') = H(x) H ( x ′ ) = H ( x ) である。□ \square □
衝突困難性から 原像困難性を 導くには、関数が 十分に 圧縮する ことが 要る。
命題 7.3 (圧縮する 関数では、原像が 求まれば 衝突が 求まる) X , Y X, Y X , Y を 有限集合、 H : X → Y H\colon X \to Y H : X → Y とし、一様に 選んだ x ∈ X x \in X x ∈ X の 像 y = H ( x ) y = H(x) y = H ( x ) から 確率 ε \varepsilon ε で y y y の 原像を 出力する アルゴリズム A \mathcal{A} A (内部の 乱数は x x x と 独立)が あると する。 x x x を 一様に 選んで x ′ = A ( H ( x ) ) x' = \mathcal{A}(H(x)) x ′ = A ( H ( x )) とし、x ′ ≠ x x' \neq x x ′ = x かつ H ( x ′ ) = H ( x ) H(x') = H(x) H ( x ′ ) = H ( x ) なら ( x , x ′ ) (x, x') ( x , x ′ ) を 出力すれば、確率 ε − ∣ Y ∣ / ∣ X ∣ \varepsilon - \lvert Y \rvert/\lvert X \rvert ε − ∣ Y ∣ / ∣ X ∣ 以上で 衝突が 得られる。
証明. y ∈ H ( X ) y \in H(X) y ∈ H ( X ) に ついて c y = ∣ H − 1 ( y ) ∣ c_y = \lvert H^{-1}(y) \rvert c y = ∣ H − 1 ( y )∣ 、ε y = P ( A ( y ) ∈ H − 1 ( y ) ) \varepsilon_y = P(\mathcal{A}(y) \in H^{-1}(y)) ε y = P ( A ( y ) ∈ H − 1 ( y )) と する。 H ( x ) = y H(x) = y H ( x ) = y と いう 条件のもとで x x x は H − 1 ( y ) H^{-1}(y) H − 1 ( y ) 上に 一様に 分布して A ( y ) \mathcal{A}(y) A ( y ) と 独立なので、 A ( y ) ∈ H − 1 ( y ) \mathcal{A}(y) \in H^{-1}(y) A ( y ) ∈ H − 1 ( y ) の とき A ( y ) ≠ x \mathcal{A}(y) \neq x A ( y ) = x と なる 条件付き確率は 1 − 1 / c y 1 - 1/c_y 1 − 1/ c y である。P ( H ( x ) = y ) = c y / ∣ X ∣ P(H(x) = y) = c_y/\lvert X \rvert P ( H ( x ) = y ) = c y / ∣ X ∣ だから、成功確率は
∑ y ∈ H ( X ) c y ∣ X ∣ ε y ( 1 − 1 c y ) = ∑ y ∈ H ( X ) c y ε y ∣ X ∣ − ∑ y ∈ H ( X ) ε y ∣ X ∣ ≥ ε − ∣ Y ∣ ∣ X ∣ \sum_{y \in H(X)} \frac{c_y}{\lvert X \rvert}\varepsilon_y\Bigl(1 - \frac{1}{c_y}\Bigr) = \sum_{y \in H(X)} \frac{c_y\varepsilon_y}{\lvert X \rvert} - \sum_{y \in H(X)} \frac{\varepsilon_y}{\lvert X \rvert} \geq \varepsilon - \frac{\lvert Y \rvert}{\lvert X \rvert} y ∈ H ( X ) ∑ ∣ X ∣ c y ε y ( 1 − c y 1 ) = y ∈ H ( X ) ∑ ∣ X ∣ c y ε y − y ∈ H ( X ) ∑ ∣ X ∣ ε y ≥ ε − ∣ X ∣ ∣ Y ∣
である(第 1 項は A \mathcal{A} A の 成功確率 ε \varepsilon ε その もので、 ε y ≤ 1 \varepsilon_y \leq 1 ε y ≤ 1 , ∣ H ( X ) ∣ ≤ ∣ Y ∣ \lvert H(X) \rvert \leq \lvert Y \rvert ∣ H ( X )∣ ≤ ∣ Y ∣ を 使った)。 □ \square □
512 ビットを 256 ビットに 縮める 関数なら ∣ Y ∣ / ∣ X ∣ = 2 − 256 \lvert Y \rvert/\lvert X \rvert = 2^{-256} ∣ Y ∣ / ∣ X ∣ = 2 − 256 で、衝突困難で 十分に 圧縮する 関数は 原像困難である。
例 7.4 圧縮しなければ この 議論は 成り立たない。 { 0 , 1 } n \lbrace 0, 1 \rbrace^n { 0 , 1 } n 上の 恒等写像は 衝突を もたないので 衝突困難だが、 y y y の 原像は y y y 自身で、原像困難ではない。
出力が n n n ビットなら、値が ランダムに ふる まうと して、総当たりの 手間は 原像と 第 2 原像が 約 2 n 2^n 2 n 回、衝突は 次節の 誕生日攻撃で 約 2 n / 2 2^{n/2} 2 n /2 回である。
注意
原像困難性は x x x が 膨大な 候補から 一様に 選ばれる ときの 性質である。パスワードのように 候補が 少なければ、順に H H H に 通すだけで 原像が 見つかる(辞書攻撃)。パスワードの 保存には、利用者ごとの ランダムな 値(ソルト)を 加え、PBKDF2 や Argon2 のような わざと 計算を 重くした 専用の 関数を 使う。
7.2 誕生日攻撃
衝突を 探す 最も 単純な 方法は、多くの 入力の ハッシュ値を 計算して 一致を 探す ことである。その 成功確率は 次の 定理で 評価できる。
定理 7.5 (誕生日の 限界, birthday bound) N , k N, k N , k を 正の 整数とし、 Y 1 , … , Y k Y_1, \dots, Y_k Y 1 , … , Y k を、N N N 個の 元からなる 集合の 上の 一様 分布に 独立に 従う 確率変数と する。 Y i = Y j Y_i = Y_j Y i = Y j と なる i < j i < j i < j が 存在する 確率を p ( k , N ) p(k, N) p ( k , N ) と すると
1 − e − k ( k − 1 ) / ( 2 N ) ≤ p ( k , N ) ≤ k ( k − 1 ) 2 N 1 - e^{-k(k-1)/(2N)} \leq p(k, N) \leq \frac{k(k-1)}{2N} 1 − e − k ( k − 1 ) / ( 2 N ) ≤ p ( k , N ) ≤ 2 N k ( k − 1 )
が 成り立つ。
証明. 上界:各組 i < j i < j i < j に ついて P ( Y i = Y j ) = ∑ y P ( Y i = y ) P ( Y j = y ) = 1 / N P(Y_i = Y_j) = \sum_y P(Y_i = y)P(Y_j = y) = 1/N P ( Y i = Y j ) = ∑ y P ( Y i = y ) P ( Y j = y ) = 1/ N で、組は k ( k − 1 ) / 2 k(k-1)/2 k ( k − 1 ) /2 個あり、和事象の 確率は 個々の 確率の 和以下である。下界: k > N k > N k > N なら鳩の 巣原理に より p ( k , N ) = 1 p(k, N) = 1 p ( k , N ) = 1 なので、k ≤ N k \leq N k ≤ N と する。値の 並び ( Y 1 , … , Y k ) (Y_1, \dots, Y_k) ( Y 1 , … , Y k ) は N k N^k N k 通りで どれも 同じ 確率で 現れ、値が すべて 異なる 並びは N ( N − 1 ) ⋯ ( N − k + 1 ) N(N - 1)\cdots(N - k + 1) N ( N − 1 ) ⋯ ( N − k + 1 ) 通りなので
1 − p ( k , N ) = ∏ i = 1 k − 1 ( 1 − i N ) ≤ ∏ i = 1 k − 1 e − i / N = exp ( − k ( k − 1 ) 2 N ) 1 - p(k, N) = \prod_{i=1}^{k-1}\Bigl(1 - \frac{i}{N}\Bigr) \leq \prod_{i=1}^{k-1} e^{-i/N} = \exp\Bigl(-\frac{k(k-1)}{2N}\Bigr) 1 − p ( k , N ) = i = 1 ∏ k − 1 ( 1 − N i ) ≤ i = 1 ∏ k − 1 e − i / N = exp ( − 2 N k ( k − 1 ) )
である。ここで 各因子が 0 0 0 以上である ことと、すべての 実数 t t t に ついて 1 − t ≤ e − t 1 - t \leq e^{-t} 1 − t ≤ e − t である こと( e − t e^{-t} e − t は 下に 凸で、 t = 0 t = 0 t = 0 での 接線が 1 − t 1 - t 1 − t )を 使った。 □ \square □
下界は 攻撃の 成功確率を 保証し、上界からは k k k が N \sqrt{N} N より ずっと 小さければ 衝突は まず 起きない ことがわかる。
系 7.6 k ( k − 1 ) ≥ 2 N log 2 k(k - 1) \geq 2N\log 2 k ( k − 1 ) ≥ 2 N log 2 ならば p ( k , N ) ≥ 1 / 2 p(k, N) \geq 1/2 p ( k , N ) ≥ 1/2 である。特に k ≥ 1 + 1.18 N k \geq 1 + 1.18\sqrt{N} k ≥ 1 + 1.18 N ならば p ( k , N ) ≥ 1 / 2 p(k, N) \geq 1/2 p ( k , N ) ≥ 1/2 。
証明. 定理 7.5 の 下界が 1 − e − log 2 = 1 / 2 1 - e^{-\log 2} = 1/2 1 − e − l o g 2 = 1/2 以上に なる。 k ≥ 1 + 1.18 N k \geq 1 + 1.18\sqrt{N} k ≥ 1 + 1.18 N なら k ( k − 1 ) ≥ ( k − 1 ) 2 ≥ 1.18 2 N ≥ 2 N log 2 k(k - 1) \geq (k - 1)^2 \geq 1.18^2N \geq 2N\log 2 k ( k − 1 ) ≥ ( k − 1 ) 2 ≥ 1.1 8 2 N ≥ 2 N log 2 (2 log 2 = 1.386 ⋯ 2\log 2 = 1.386\cdots 2 log 2 = 1.386 ⋯ )である。□ \square □
例 7.7 (誕生日の パラドックス) N = 365 N = 365 N = 365 , k = 23 k = 23 k = 23 では k ( k − 1 ) = 506 ≥ 730 log 2 = 505.99 ⋯ k(k - 1) = 506 \geq 730\log 2 = 505.99\cdots k ( k − 1 ) = 506 ≥ 730 log 2 = 505.99 ⋯ なので、誕生日が 一様で 独立なら、23 人の 中に 誕生日が 同じ 2 人が いる 確率は 1 / 2 1/2 1/2 以上である。実際の 値は p ( 23 , 365 ) = 0.5073 p(23, 365) = 0.5073 p ( 23 , 365 ) = 0.5073 である。
値が 一様でない 同じ 分布に 独立に 従う 場合も、衝突の 確率は p ( k , N ) p(k, N) p ( k , N ) 以上である(概略:値が すべて 異なる 確率は、各値の 確率の k k k 次基本対称式 e k e_k e k の k ! k! k ! 倍で、二つの 確率を その 平均で 置き換えても e k e_k e k は 減らないので、一様分布で 最大に なる)。よって H : D → Y H\colon D \to Y H : D → Y (∣ Y ∣ = N \lvert Y \rvert = N ∣ Y ∣ = N )が 任意の 関数でも、x 1 , … , x k ∈ D x_1, \dots, x_k \in D x 1 , … , x k ∈ D を 一様に 独立に 選べば、 x i ≠ x j x_i \neq x_j x i = x j かつ H ( x i ) = H ( x j ) H(x_i) = H(x_j) H ( x i ) = H ( x j ) と なる 組が ある 確率は 1 − e − k ( k − 1 ) / ( 2 N ) − k ( k − 1 ) / ( 2 ∣ D ∣ ) 1 - e^{-k(k-1)/(2N)} - k(k-1)/(2\lvert D \rvert) 1 − e − k ( k − 1 ) / ( 2 N ) − k ( k − 1 ) / ( 2 ∣ D ∣) 以上である(最後の 項は 入力どうしが 一致する 確率の 上界)。この 誕生日攻撃 (birthday attack) に より、出力が n n n ビットなら(D D D を 十分 大きく とって)約 1.18 ⋅ 2 n / 2 1.18 \cdot 2^{n/2} 1.18 ⋅ 2 n /2 回の 計算で 確率ほぼ 1 / 2 1/2 1/2 以上で 衝突が 見つかるので、衝突困難性は 高々 n / 2 n/2 n /2 ビットの 安全性しかもたず、128 ビットの 安全性には 256 ビットの 出力が 要る( 第3章 の ρ \rho ρ 法の ように 記憶を ほとんど 使わない 方法も ある)。
7.3 メルクル–ダムガード構成と 実際の ハッシュ関数
任意の 長さの 入力を 扱う ハッシュ関数は、固定長の 入力を 縮める 圧縮関数を 繰り返して 作る ことが 多い。
定義 7.8 (メルクル–ダムガード構成, Merkle–Damgård construction)f : { 0 , 1 } n × { 0 , 1 } b → { 0 , 1 } n f\colon \lbrace 0, 1 \rbrace^n \times \lbrace 0, 1 \rbrace^b \to \lbrace 0, 1 \rbrace^n f : { 0 , 1 } n × { 0 , 1 } b → { 0 , 1 } n を 圧縮関数、 I V ∈ { 0 , 1 } n \mathrm{IV} \in \lbrace 0, 1 \rbrace^n IV ∈ { 0 , 1 } n を 固定の 初期値と する。長さ ℓ < 2 64 \ell < 2^{64} ℓ < 2 64 ビットの メッセージ M M M の 後ろに、ビット 1 1 1 、いく つかの 0 0 0 、ℓ \ell ℓ の 64 ビットの 2 進表示を 付け加えて 長さを b b b の 倍数に した 最短の 列を M ‾ = M ∥ pad ( ℓ ) \overline{M} = M \mathbin{\Vert} \operatorname{pad}(\ell) M = M ∥ pad ( ℓ ) と する( pad ( ℓ ) \operatorname{pad}(\ell) pad ( ℓ ) は ℓ \ell ℓ だけで 決まる)。 M ‾ \overline{M} M を b b b ビットずつの ブロック m 1 , … , m L m_1, \dots, m_L m 1 , … , m L に 分け、 h 0 = I V h_0 = \mathrm{IV} h 0 = IV , h i = f ( h i − 1 , m i ) h_i = f(h_{i-1}, m_i) h i = f ( h i − 1 , m i ) と して H ( M ) = h L H(M) = h_L H ( M ) = h L と する( h i h_i h i を 連鎖値と いう)。
定理 7.9 (メルクル, ダムガード, 1989 年)H H H の 衝突から f f f の 衝突が 効率よく 求まる。したがって f f f が 衝突困難なら H H H も 衝突困難である。
証明. H ( M ) = H ( M ′ ) H(M) = H(M') H ( M ) = H ( M ′ ) , M ≠ M ′ M \neq M' M = M ′ とし、M ′ M' M ′ の 側の 値に ′ ' ′ を つける。長さが 異なれば 最後の ブロックの 末尾 64 ビットが 異なるので、 f ( h L − 1 , m L ) = f ( h L ′ − 1 ′ , m L ′ ′ ) f(h_{L-1}, m_L) = f(h'_{L'-1}, m'_{L'}) f ( h L − 1 , m L ) = f ( h L ′ − 1 ′ , m L ′ ′ ) が 衝突である。長さが 等しければ L = L ′ L = L' L = L ′ で、( h i − 1 , m i ) ≠ ( h i − 1 ′ , m i ′ ) (h_{i-1}, m_i) \neq (h'_{i-1}, m'_i) ( h i − 1 , m i ) = ( h i − 1 ′ , m i ′ ) と なる 最大の i i i を i 0 i_0 i 0 と する( m i ≠ m i ′ m_i \neq m_i' m i = m i ′ と なる i i i が あるので 存在する)。 i 0 = L i_0 = L i 0 = L なら H ( M ) = H ( M ′ ) H(M) = H(M') H ( M ) = H ( M ′ ) から、i 0 < L i_0 < L i 0 < L なら i 0 i_0 i 0 の 最大性から h i 0 = h i 0 ′ h_{i_0} = h'_{i_0} h i 0 = h i 0 ′ なので、f ( h i 0 − 1 , m i 0 ) = f ( h i 0 − 1 ′ , m i 0 ′ ) f(h_{i_0-1}, m_{i_0}) = f(h'_{i_0-1}, m'_{i_0}) f ( h i 0 − 1 , m i 0 ) = f ( h i 0 − 1 ′ , m i 0 ′ ) が 衝突である。 □ \square □
命題 7.10 (長さ拡張, length extension)メルクル–ダムガード構成の H H H に ついて、 H ( M ) H(M) H ( M ) と M M M の 長さ ℓ \ell ℓ だけを 知っていれば( M M M を 知らなくても)、任意の ビット列 X X X に 対して H ( M ∥ pad ( ℓ ) ∥ X ) H(M \mathbin{\Vert} \operatorname{pad}(\ell) \mathbin{\Vert} X) H ( M ∥ pad ( ℓ ) ∥ X ) を 計算できる。
証明. M ′ = M ∥ pad ( ℓ ) ∥ X M' = M \mathbin{\Vert} \operatorname{pad}(\ell) \mathbin{\Vert} X M ′ = M ∥ pad ( ℓ ) ∥ X の 長さ ℓ ′ \ell' ℓ ′ は ℓ \ell ℓ と X X X から 求まり、 M ′ ‾ = M ‾ ∥ X ∥ pad ( ℓ ′ ) \overline{M'} = \overline{M} \mathbin{\Vert} X \mathbin{\Vert} \operatorname{pad}(\ell') M ′ = M ∥ X ∥ pad ( ℓ ′ ) である。M ‾ \overline{M} M の 長さは b b b の 倍数なので、最初の L L L ブロックまでの 連鎖値は h L = H ( M ) h_L = H(M) h L = H ( M ) で、残りの ブロックを h L h_L h L から 順に f f f で 処理すれば H ( M ′ ) H(M') H ( M ′ ) が 得られる。 □ \square □
実際の ハッシュ関数 米国の 規格 FIPS 180-4 の SHA-2 (SHA-256・SHA-512 など。数字は 出力の ビット数)は メルクル–ダムガード構成で(SHA-256 では n = 256 n = 256 n = 256 , b = 512 b = 512 b = 512 )、SHA-256 と SHA-512 は 最後の 連鎖値を そのまま 出力するので 長さ拡張が できる。FIPS 202(2015 年)の SHA-3 は Keccak に 基づく スポンジ構成で、内部状態の 一部を 出力しないので 長さ拡張は 当ては まらない。
MD5(出力 128 ビット)と SHA-1(160 ビット)も メルクル–ダムガード構成だが、圧縮関数の 構造を 突く 攻撃が 誕生日攻撃より ずっと 速い。2004 年 8 月に 王小雲(ワン・シャオユン)らが MD5 の 衝突の 実例を 発表し、2017 年 2 月には CWI(オランダ)と Google の 研究者が、SHA-1 の 値が 等しい 2 つの 異なる PDF ファイルを 公表した(SHAttered。SHA-1 の 計算約 900 京回(ほぼ 2 63 2^{63} 2 63 回)で、誕生日攻撃の 約 2 80 2^{80} 2 80 回よりはるかに 少ない)。衝突が 見つかった 関数を、署名や 証明書のように 衝突困難性に 依存する 用途に 使い続けてはいけない。
7.4 メッセージ認証符号と HMAC
ハッシュ値で 改ざんを 検出できるのは、正しい ハッシュ値が 別の 安全な 経路で 届く 場合だけである。秘密鍵 k k k を 共有する 2 者は、 メッセージ認証符号 (message authentication code, MAC) の タグ t = MAC k ( m ) t = \operatorname{MAC}_k(m) t = MAC k ( m ) を 添えて 送り、受信者は 同じ 計算を して 一致を 確かめる。安全性の 定義は 署名の EUF-CMA( 第2章 2.10 節)と 同じで、鍵を 知らない 攻撃者は、好きな メッセージの タグを 教えて もらえても、新しい メッセージの 正しい タグを 作れない ことである。
素朴な MAC k ( m ) = H ( k ∥ m ) \operatorname{MAC}_k(m) = H(k \mathbin{\Vert} m) MAC k ( m ) = H ( k ∥ m ) は、H H H が メルクル–ダムガード構成なら 安全で ない。タグ t = H ( k ∥ m ) t = H(k \mathbin{\Vert} m) t = H ( k ∥ m ) を 一つ 見た 攻撃者は、 k k k の 長ささえわかれば、命題 7.10 に より 任意の X X X に ついて m ∥ pad ( ℓ ) ∥ X m \mathbin{\Vert} \operatorname{pad}(\ell) \mathbin{\Vert} X m ∥ pad ( ℓ ) ∥ X (ℓ \ell ℓ は k ∥ m k \mathbin{\Vert} m k ∥ m の 長さ)の 正しい タグを 計算できる。
定義 7.11 (HMAC)H H H を ブロック長 b b b ビットの ハッシュ関数とし、鍵 k k k の 後ろに 0 0 0 を 付けて b b b ビットに した ものを k ′ k' k ′ と する( k k k が b b b ビットより 長ければ 先に H ( k ) H(k) H ( k ) に 置き換える)。
HMAC k ( m ) = H ( ( k ′ ⊕ o p a d ) ∥ H ( ( k ′ ⊕ i p a d ) ∥ m ) ) \operatorname{HMAC}_k(m) = H\bigl((k' \oplus \mathrm{opad}) \mathbin{\Vert} H((k' \oplus \mathrm{ipad}) \mathbin{\Vert} m)\bigr) HMAC k ( m ) = H ( ( k ′ ⊕ opad ) ∥ H (( k ′ ⊕ ipad ) ∥ m ) )
と おく。 i p a d \mathrm{ipad} ipad , o p a d \mathrm{opad} opad は それぞれバイト 0x36, 0x5c を b / 8 b/8 b /8 個 並べた 定数である(RFC 2104、FIPS 198-1)。
HMAC では 内側の ハッシュ値は 表に 出ず、外側を 長さ拡張しても、正しい タグの 外側の 入力は いつも「 b b b ビットの 鍵と n n n ビットの ハッシュ値」と いう 決まった 長さなので、どの メッセージの タグにもならない。HMAC の 安全性は 圧縮関数に ついての 仮定のもとで 証明されている(ベラーレ・カネッティ・クラフチック 1996 年。ベラーレ 2006 年は、圧縮関数が 擬似ランダム関数(鍵を 知らない 者には ランダムな 関数と 見分けが つかない 関数)であると いう 種類の、衝突困難性を 含まない 仮定から 証明した。主張のみ)。その ため SHA-1 の 衝突が HMAC-SHA1 を 直ちに 破るわけではないが、新しい 設計では HMAC-SHA256 以上を 実績の ある ライブラリで 使う( H ( k ∥ m ) H(k \mathbin{\Vert} m) H ( k ∥ m ) のような 自作の 構成は、Web API の リクエスト署名などで 実際に 長さ拡張攻撃を 受けてきた。問題 7.2)。
7.5 格子と 格子問題
格子 は、実ベクトルの 整数係数の 一次結合だけを 考える「整数版の 線形代数」である。
定義 7.12 (格子・基底・行列式)b 1 , … , b n ∈ R n b_1, \dots, b_n \in \mathbb{R}^n b 1 , … , b n ∈ R n を 一次独立と する。 L = Z b 1 + ⋯ + Z b n L = \mathbb{Z}b_1 + \cdots + \mathbb{Z}b_n L = Z b 1 + ⋯ + Z b n (b i b_i b i の 整数係数の 一次結合の 全体)を b 1 , … , b n b_1, \dots, b_n b 1 , … , b n で 生成される 格子 (lattice)、( b 1 , … , b n ) (b_1, \dots, b_n) ( b 1 , … , b n ) を その 基底と いう。基底を 列に 並べた 行列を B = ( b 1 ⋯ b n ) B = (b_1 \ \cdots \ b_n) B = ( b 1 ⋯ b n ) とし、det L = ∣ det B ∣ \det L = \lvert \det B \rvert det L = ∣ det B ∣ を L L L の 行列式 (determinant) と いう。
これは 15-algebraic-number-theory 第3章の 定義 3.1 の 格子と 同じで(行列式は そこでの 余体積)、 det L \det L det L は 平行体 { ∑ i t i b i ∣ 0 ≤ t i < 1 } \lbrace \sum_i t_ib_i \mid 0 \leq t_i < 1 \rbrace { ∑ i t i b i ∣ 0 ≤ t i < 1 } の 体積である。
定理 7.13 (行列式は 基底に よらない) ( b 1 , … , b n ) (b_1, \dots, b_n) ( b 1 , … , b n ) と ( b 1 ′ , … , b n ′ ) (b_1', \dots, b_n') ( b 1 ′ , … , b n ′ ) が 同じ 格子 L L L の 基底ならば、 B ′ = B U B' = BU B ′ = B U を みたす整数行列 U U U で det U = ± 1 \det U = \pm 1 det U = ± 1 と なる ものが ある。特に ∣ det B ′ ∣ = ∣ det B ∣ \lvert \det B' \rvert = \lvert \det B \rvert ∣ det B ′ ∣ = ∣ det B ∣ で、det L \det L det L は 基底の 取り方に よらない。
証明. 各 b j ′ b_j' b j ′ は L L L の 元なので b j ′ = ∑ i u i j b i b_j' = \sum_i u_{ij}b_i b j ′ = ∑ i u ij b i (u i j ∈ Z u_{ij} \in \mathbb{Z} u ij ∈ Z )と 書け、 U = ( u i j ) U = (u_{ij}) U = ( u ij ) と おけば B ′ = B U B' = BU B ′ = B U 。同様に B = B ′ V B = B'V B = B ′ V と なる 整数行列 V V V が ある。 B = B U V B = BUV B = B U V で B B B は 正則なので U V = I UV = I U V = I 。積公式(02-linear-algebra 第4章 定理 4.19)より det U det V = 1 \det U \det V = 1 det U det V = 1 で、どちらも 整数なので det U = ± 1 \det U = \pm 1 det U = ± 1 である。□ \square □
格子の 計算では、グラム–シュミットの 直交化( 02-linear-algebra 第7章 定理 7.9 の w j w_j w j )を 正規化せずに 使う。
b 1 ∗ = b 1 , b i ∗ = b i − ∑ j < i μ i j b j ∗ , μ i j = ⟨ b i , b j ∗ ⟩ ⟨ b j ∗ , b j ∗ ⟩ ( j < i ) b_1^{\ast} = b_1, \qquad b_i^{\ast} = b_i - \sum_{j < i} \mu_{ij}b_j^{\ast}, \qquad \mu_{ij} = \frac{\langle b_i, b_j^{\ast} \rangle}{\langle b_j^{\ast}, b_j^{\ast} \rangle} \quad (j < i) b 1 ∗ = b 1 , b i ∗ = b i − j < i ∑ μ ij b j ∗ , μ ij = ⟨ b j ∗ , b j ∗ ⟩ ⟨ b i , b j ∗ ⟩ ( j < i )
b 1 ∗ , … , b n ∗ b_1^{\ast}, \dots, b_n^{\ast} b 1 ∗ , … , b n ∗ は 互いに 直交し、 b 1 ∗ , … , b i ∗ b_1^{\ast}, \dots, b_i^{\ast} b 1 ∗ , … , b i ∗ は b 1 , … , b i b_1, \dots, b_i b 1 , … , b i と 同じ 部分 空間を 張る( b i ∗ b_i^{\ast} b i ∗ は 一般に 格子の 元ではない)。
命題 7.14 格子 L L L の 基底 ( b 1 , … , b n ) (b_1, \dots, b_n) ( b 1 , … , b n ) に ついて、
det L = ∏ i = 1 n ∥ b i ∗ ∥ \det L = \prod_{i=1}^{n} \lVert b_i^{\ast} \rVert det L = ∏ i = 1 n ∥ b i ∗ ∥ 。
0 0 0 でない v ∈ L v \in L v ∈ L は すべて ∥ v ∥ ≥ min i ∥ b i ∗ ∥ \lVert v \rVert \geq \min_i \lVert b_i^{\ast} \rVert ∥ v ∥ ≥ min i ∥ b i ∗ ∥ を みたす。
証明. (1) B = B ∗ T B = B^{\ast}T B = B ∗ T (B ∗ = ( b 1 ∗ ⋯ b n ∗ ) B^{\ast} = (b_1^{\ast} \ \cdots \ b_n^{\ast}) B ∗ = ( b 1 ∗ ⋯ b n ∗ ) 、T T T は 対角成分が 1 1 1 の 上三角行列)なので det B = det B ∗ \det B = \det B^{\ast} det B = det B ∗ 。B ∗ B^{\ast} B ∗ の 列を 正規化した 直交行列 Q Q Q に ついて B ∗ = Q diag ( ∥ b 1 ∗ ∥ , … , ∥ b n ∗ ∥ ) B^{\ast} = Q\operatorname{diag}(\lVert b_1^{\ast} \rVert, \dots, \lVert b_n^{\ast} \rVert) B ∗ = Q diag (∥ b 1 ∗ ∥ , … , ∥ b n ∗ ∥) で、det Q = ± 1 \det Q = \pm 1 det Q = ± 1 である。(2) v = ∑ i a i b i v = \sum_i a_ib_i v = ∑ i a i b i (a i ∈ Z a_i \in \mathbb{Z} a i ∈ Z )で a j ≠ 0 a_j \neq 0 a j = 0 と なる 最大の j j j を とる。 i < j i < j i < j の b i b_i b i は b j ∗ b_j^{\ast} b j ∗ と 直交し、 ⟨ b j , b j ∗ ⟩ = ∥ b j ∗ ∥ 2 \langle b_j, b_j^{\ast} \rangle = \lVert b_j^{\ast} \rVert^2 ⟨ b j , b j ∗ ⟩ = ∥ b j ∗ ∥ 2 なので ⟨ v , b j ∗ ⟩ = a j ∥ b j ∗ ∥ 2 \langle v, b_j^{\ast} \rangle = a_j\lVert b_j^{\ast} \rVert^2 ⟨ v , b j ∗ ⟩ = a j ∥ b j ∗ ∥ 2 。コーシー–シュワルツの 不等式より ∣ a j ∣ ∥ b j ∗ ∥ 2 ≤ ∥ v ∥ ∥ b j ∗ ∥ \lvert a_j \rvert \lVert b_j^{\ast} \rVert^2 \leq \lVert v \rVert \lVert b_j^{\ast} \rVert ∣ a j ∣ ∥ b j ∗ ∥ 2 ≤ ∥ v ∥ ∥ b j ∗ ∥ で、∣ a j ∣ ≥ 1 \lvert a_j \rvert \geq 1 ∣ a j ∣ ≥ 1 だから ∥ v ∥ ≥ ∥ b j ∗ ∥ \lVert v \rVert \geq \lVert b_j^{\ast} \rVert ∥ v ∥ ≥ ∥ b j ∗ ∥ 。□ \square □
格子点 v = B a v = Ba v = B a の 係数 a = B − 1 v ∈ Z n a = B^{-1}v \in \mathbb{Z}^n a = B − 1 v ∈ Z n は v v v の 一次式なので、長さが 一定以下の 格子点は 有限個しかない。よって 0 0 0 でない 格子点の 長さの 最小値 λ 1 ( L ) \lambda_1(L) λ 1 ( L ) が 存在する。
定義 7.15 (格子問題)基底が 与えられた とき、 ∥ v ∥ = λ 1 ( L ) \lVert v \rVert = \lambda_1(L) ∥ v ∥ = λ 1 ( L ) と なる v ∈ L v \in L v ∈ L を 求める 問題を 最短ベクトル問題 (SVP)、0 < ∥ v ∥ ≤ γ λ 1 ( L ) 0 < \lVert v \rVert \leq \gamma\lambda_1(L) 0 < ∥ v ∥ ≤ γ λ 1 ( L ) と なる v ∈ L v \in L v ∈ L を 求める 問題を γ \gamma γ -近似 SVP と いう。基底と 点 t ∈ R n t \in \mathbb{R}^n t ∈ R n から ∥ t − v ∥ \lVert t - v \rVert ∥ t − v ∥ が 最小の v ∈ L v \in L v ∈ L を 求める 問題を 最近 ベクトル問題 (CVP) と いう。
定理 7.16 (ミンコフスキー)L ⊂ R n L \subset \mathbb{R}^n L ⊂ R n を 格子と すると、 λ 1 ( L ) ≤ n ( det L ) 1 / n \lambda_1(L) \leq \sqrt{n}(\det L)^{1/n} λ 1 ( L ) ≤ n ( det L ) 1/ n である。
証明. ミンコフスキーの 凸体定理( 15-algebraic-number-theory 第3章 定理 3.4。主張だけを 使う)に よれば、原点対称な コンパクト凸集合 X X X が vol ( X ) ≥ 2 n det L \operatorname{vol}(X) \geq 2^n\det L vol ( X ) ≥ 2 n det L を みたせば、 X X X は L L L の 0 0 0 でない 点を 含む。 r = ( det L ) 1 / n r = (\det L)^{1/n} r = ( det L ) 1/ n と して X = [ − r , r ] n X = [-r, r]^n X = [ − r , r ] n に 適用すると、各座標の 絶対値が r r r 以下の 0 ≠ v ∈ L 0 \neq v \in L 0 = v ∈ L が あり、 ∥ v ∥ ≤ n r \lVert v \rVert \leq \sqrt{n}r ∥ v ∥ ≤ n r である。□ \square □
SVP と CVP を 厳密に 解く 問題は NP 困難である(CVP は ファン・エムデ・ボアス, 1981 年。SVP は 乱択帰着のもとで アイタイ, 1998 年。主張のみ)。暗号の 根拠に なる、近似倍率 γ \gamma γ が n n n の 多項式程度の 近似 SVP は、NP 困難か どうかは 知られていないが、古典・量子の どちらでも 知られている 最良の アルゴリズムは n n n に ついて 指数時間かかる。
7.6 2 次元の ガウス簡約
2 次元では、ユークリッドの 互除法と 同じ 考え方で 最短ベクトルが 求まる(ラグランジュと ガウスに よる 二元二次形式の 簡約理論に さかのぼる)。基底 ( b 1 , b 2 ) (b_1, b_2) ( b 1 , b 2 ) が
∥ b 1 ∥ ≤ ∥ b 2 ∥ , ∣ ⟨ b 1 , b 2 ⟩ ∣ ≤ 1 2 ∥ b 1 ∥ 2 \lVert b_1 \rVert \leq \lVert b_2 \rVert, \qquad \lvert \langle b_1, b_2 \rangle \rvert \leq \frac{1}{2}\lVert b_1 \rVert^2 ∥ b 1 ∥ ≤ ∥ b 2 ∥ , ∣⟨ b 1 , b 2 ⟩∣ ≤ 2 1 ∥ b 1 ∥ 2
を みたすとき、 簡約されている と いう。
ガウス簡約 (Gauss reduction) 入力は R 2 \mathbb{R}^2 R 2 の 一次独立な ベクトル b 1 , b 2 b_1, b_2 b 1 , b 2 と する。
∥ b 1 ∥ > ∥ b 2 ∥ \lVert b_1 \rVert > \lVert b_2 \rVert ∥ b 1 ∥ > ∥ b 2 ∥ なら b 1 b_1 b 1 と b 2 b_2 b 2 を 入れ替える。
μ = ⟨ b 1 , b 2 ⟩ / ∥ b 1 ∥ 2 \mu = \langle b_1, b_2 \rangle/\lVert b_1 \rVert^2 μ = ⟨ b 1 , b 2 ⟩ / ∥ b 1 ∥ 2 と する。 ∣ μ ∣ ≤ 1 / 2 \lvert \mu \rvert \leq 1/2 ∣ μ ∣ ≤ 1/2 なら ( b 1 , b 2 ) (b_1, b_2) ( b 1 , b 2 ) を 出力して 終わる。
μ \mu μ に 最も 近い 整数を m m m とし、b 2 ← b 2 − m b 1 b_2 \leftarrow b_2 - mb_1 b 2 ← b 2 − m b 1 と する(割り算の 余りに あたる)。
∥ b 2 ∥ ≥ ∥ b 1 ∥ \lVert b_2 \rVert \geq \lVert b_1 \rVert ∥ b 2 ∥ ≥ ∥ b 1 ∥ なら ( b 1 , b 2 ) (b_1, b_2) ( b 1 , b 2 ) を 出力して 終わる。そうでなければ b 1 b_1 b 1 と b 2 b_2 b 2 を 入れ替えて 2 に 戻る。
定理 7.17 (ガウス簡約)
ガウス簡約は 有限回の 操作で 終わり、出力は 入力と 同じ 格子 L L L の 簡約された 基底である。
格子 L L L の 基底 ( b 1 , b 2 ) (b_1, b_2) ( b 1 , b 2 ) が 簡約されていれば ∥ b 1 ∥ = λ 1 ( L ) \lVert b_1 \rVert = \lambda_1(L) ∥ b 1 ∥ = λ 1 ( L ) であり、b 1 b_1 b 1 と 一次独立な v ∈ L v \in L v ∈ L は すべて ∥ v ∥ ≥ ∥ b 2 ∥ \lVert v \rVert \geq \lVert b_2 \rVert ∥ v ∥ ≥ ∥ b 2 ∥ を みたす。
証明. (1) 入れ替えと b 2 ← b 2 − m b 1 b_2 \leftarrow b_2 - mb_1 b 2 ← b 2 − m b 1 は、逆の 操作(入れ替えと b 2 ← b 2 + m b 1 b_2 \leftarrow b_2 + mb_1 b 2 ← b 2 + m b 1 )も 整数係数なので、生成する 格子を 変えない。2 に 来る たびに ∥ b 1 ∥ ≤ ∥ b 2 ∥ \lVert b_1 \rVert \leq \lVert b_2 \rVert ∥ b 1 ∥ ≤ ∥ b 2 ∥ が 成り立つ(最初は 1 に より、2 回目以降は 4 の 入れ替えに よる)ので、2 で 終われば 簡約されている。3 の あとでは ∣ ⟨ b 1 , b 2 − m b 1 ⟩ ∣ = ∣ μ − m ∣ ∥ b 1 ∥ 2 ≤ 1 2 ∥ b 1 ∥ 2 \lvert \langle b_1, b_2 - mb_1 \rangle \rvert = \lvert \mu - m \rvert \lVert b_1 \rVert^2 \leq \frac{1}{2}\lVert b_1 \rVert^2 ∣⟨ b 1 , b 2 − m b 1 ⟩∣ = ∣ μ − m ∣ ∥ b 1 ∥ 2 ≤ 2 1 ∥ b 1 ∥ 2 なので、4 で 終わっても 簡約されている。4 で 入れ替えて 2 に 戻る とき、新しい b 1 b_1 b 1 は 古い b 1 b_1 b 1 より 真に 短い 0 0 0 でない 格子点である。長さが 最初の ∥ b 1 ∥ \lVert b_1 \rVert ∥ b 1 ∥ 以下の 格子点は 有限個なので、入れ替えは 有限回しか 起こらない。
(2) v = a 1 b 1 + a 2 b 2 ≠ 0 v = a_1b_1 + a_2b_2 \neq 0 v = a 1 b 1 + a 2 b 2 = 0 (a 1 , a 2 ∈ Z a_1, a_2 \in \mathbb{Z} a 1 , a 2 ∈ Z )と すると、簡約されている ことから
∥ v ∥ 2 = a 1 2 ∥ b 1 ∥ 2 + 2 a 1 a 2 ⟨ b 1 , b 2 ⟩ + a 2 2 ∥ b 2 ∥ 2 ≥ ( a 1 2 − ∣ a 1 a 2 ∣ ) ∥ b 1 ∥ 2 + a 2 2 ∥ b 2 ∥ 2 \lVert v \rVert^2 = a_1^2\lVert b_1 \rVert^2 + 2a_1a_2\langle b_1, b_2 \rangle + a_2^2\lVert b_2 \rVert^2 \geq (a_1^2 - \lvert a_1a_2 \rvert)\lVert b_1 \rVert^2 + a_2^2\lVert b_2 \rVert^2 ∥ v ∥ 2 = a 1 2 ∥ b 1 ∥ 2 + 2 a 1 a 2 ⟨ b 1 , b 2 ⟩ + a 2 2 ∥ b 2 ∥ 2 ≥ ( a 1 2 − ∣ a 1 a 2 ∣) ∥ b 1 ∥ 2 + a 2 2 ∥ b 2 ∥ 2
である。a 2 = 0 a_2 = 0 a 2 = 0 なら ∥ v ∥ = ∣ a 1 ∣ ∥ b 1 ∥ ≥ ∥ b 1 ∥ \lVert v \rVert = \lvert a_1 \rvert \lVert b_1 \rVert \geq \lVert b_1 \rVert ∥ v ∥ = ∣ a 1 ∣ ∥ b 1 ∥ ≥ ∥ b 1 ∥ 。a 2 ≠ 0 a_2 \neq 0 a 2 = 0 (v v v が b 1 b_1 b 1 と 一次独立)の とき、 ∣ a 1 ∣ ≥ ∣ a 2 ∣ \lvert a_1 \rvert \geq \lvert a_2 \rvert ∣ a 1 ∣ ≥ ∣ a 2 ∣ なら 第 1 項は 0 0 0 以上なので ∥ v ∥ 2 ≥ a 2 2 ∥ b 2 ∥ 2 ≥ ∥ b 2 ∥ 2 \lVert v \rVert^2 \geq a_2^2\lVert b_2 \rVert^2 \geq \lVert b_2 \rVert^2 ∥ v ∥ 2 ≥ a 2 2 ∥ b 2 ∥ 2 ≥ ∥ b 2 ∥ 2 。∣ a 1 ∣ < ∣ a 2 ∣ \lvert a_1 \rvert < \lvert a_2 \rvert ∣ a 1 ∣ < ∣ a 2 ∣ なら 第 1 項の 係数は 0 0 0 以下なので、∥ b 1 ∥ ≤ ∥ b 2 ∥ \lVert b_1 \rVert \leq \lVert b_2 \rVert ∥ b 1 ∥ ≤ ∥ b 2 ∥ を 使って
∥ v ∥ 2 ≥ ( a 1 2 − ∣ a 1 a 2 ∣ + a 2 2 ) ∥ b 2 ∥ 2 ≥ ∣ a 2 ∣ ( ∣ a 2 ∣ − ∣ a 1 ∣ ) ∥ b 2 ∥ 2 ≥ ∥ b 2 ∥ 2 \lVert v \rVert^2 \geq (a_1^2 - \lvert a_1a_2 \rvert + a_2^2)\lVert b_2 \rVert^2 \geq \lvert a_2 \rvert(\lvert a_2 \rvert - \lvert a_1 \rvert)\lVert b_2 \rVert^2 \geq \lVert b_2 \rVert^2 ∥ v ∥ 2 ≥ ( a 1 2 − ∣ a 1 a 2 ∣ + a 2 2 ) ∥ b 2 ∥ 2 ≥ ∣ a 2 ∣ (∣ a 2 ∣ − ∣ a 1 ∣) ∥ b 2 ∥ 2 ≥ ∥ b 2 ∥ 2
と なる。よって ∥ v ∥ ≥ ∥ b 1 ∥ \lVert v \rVert \geq \lVert b_1 \rVert ∥ v ∥ ≥ ∥ b 1 ∥ が つねに 成り立ち、 a 2 ≠ 0 a_2 \neq 0 a 2 = 0 なら ∥ v ∥ ≥ ∥ b 2 ∥ \lVert v \rVert \geq \lVert b_2 \rVert ∥ v ∥ ≥ ∥ b 2 ∥ である。□ \square □
例 7.18 b 1 = ( 42 , 29 ) b_1 = (42, 29) b 1 = ( 42 , 29 ) , b 2 = ( 55 , 37 ) b_2 = (55, 37) b 2 = ( 55 , 37 ) で 生成される 格子 L L L (det L = 41 \det L = 41 det L = 41 )を 簡約すると、 m = 1 , 3 , 2 m = 1, 3, 2 m = 1 , 3 , 2 の 引き算で ( 13 , 8 ) (13, 8) ( 13 , 8 ) , ( 3 , 5 ) (3, 5) ( 3 , 5 ) , ( 7 , − 2 ) (7, -2) ( 7 , − 2 ) が 順に 現れ、簡約された 基底 ( 3 , 5 ) , ( 7 , − 2 ) (3, 5), (7, -2) ( 3 , 5 ) , ( 7 , − 2 ) (内積は 11 ≤ 34 / 2 11 \leq 34/2 11 ≤ 34/2 )が 得られる。定理 7.17 より λ 1 ( L ) = 34 \lambda_1(L) = \sqrt{34} λ 1 ( L ) = 34 で、行列式は ∣ 3 ⋅ ( − 2 ) − 5 ⋅ 7 ∣ = 41 \lvert 3 \cdot (-2) - 5 \cdot 7 \rvert = 41 ∣ 3 ⋅ ( − 2 ) − 5 ⋅ 7 ∣ = 41 の まま、ほとんど 平行だった 入力(な す角は 約 0.7 0.7 0.7 度)が 直交に 近い 基底(約 75 75 75 度)に 変わる。
7.7 LLL アルゴリズム
次元 n n n が 大きいとき、 n n n の 多項式時間で 最短ベクトルを 求める 方法は 知られていない。1982 年に レンストラ・レンストラ・ロヴァースは、有理数係数の 多項式の 因数分解の ために、最短ベクトルを 指数的な 近似倍率で 求める 多項式時間の アルゴリズムを 与えた。
定義 7.19 (LLL 簡約, LLL-reduced)1 / 4 < δ < 1 1/4 < \delta < 1 1/4 < δ < 1 と する。格子の 基底 ( b 1 , … , b n ) (b_1, \dots, b_n) ( b 1 , … , b n ) が 次の 2 条件を みたすとき、 δ \delta δ に ついて LLL 簡約されている と いう(原論文では δ = 3 / 4 \delta = 3/4 δ = 3/4 )。
(サイズ簡約)すべての j < i j < i j < i に ついて ∣ μ i j ∣ ≤ 1 / 2 \lvert \mu_{ij} \rvert \leq 1/2 ∣ μ ij ∣ ≤ 1/2 。
(ロヴァースの 条件)すべての 2 ≤ i ≤ n 2 \leq i \leq n 2 ≤ i ≤ n に ついて ∥ b i ∗ ∥ 2 ≥ ( δ − μ i , i − 1 2 ) ∥ b i − 1 ∗ ∥ 2 \lVert b_i^{\ast} \rVert^2 \geq (\delta - \mu_{i,i-1}^2)\lVert b_{i-1}^{\ast} \rVert^2 ∥ b i ∗ ∥ 2 ≥ ( δ − μ i , i − 1 2 ) ∥ b i − 1 ∗ ∥ 2 。
ロヴァースの 条件は ∥ b i ∗ + μ i , i − 1 b i − 1 ∗ ∥ 2 ≥ δ ∥ b i − 1 ∗ ∥ 2 \lVert b_i^{\ast} + \mu_{i,i-1}b_{i-1}^{\ast} \rVert^2 \geq \delta\lVert b_{i-1}^{\ast} \rVert^2 ∥ b i ∗ + μ i , i − 1 b i − 1 ∗ ∥ 2 ≥ δ ∥ b i − 1 ∗ ∥ 2 と 同値で( b i ∗ ⊥ b i − 1 ∗ b_i^{\ast} \perp b_{i-1}^{\ast} b i ∗ ⊥ b i − 1 ∗ )、左辺は b i − 1 b_{i-1} b i − 1 と b i b_i b i を 入れ替えた ときの 新しい b i − 1 ∗ b_{i-1}^{\ast} b i − 1 ∗ の 長さの 2 乗である( n = 2 n = 2 n = 2 , δ = 1 \delta = 1 δ = 1 なら 7.6 節の「簡約されている」に なる)。
定理 7.20 (LLL 簡約基底の 性質) ( b 1 , … , b n ) (b_1, \dots, b_n) ( b 1 , … , b n ) を 格子 L L L の、δ = 3 / 4 \delta = 3/4 δ = 3/4 に ついて LLL 簡約された 基底と すると、
∥ b 1 ∥ ≤ 2 ( n − 1 ) / 2 λ 1 ( L ) , ∥ b 1 ∥ ≤ 2 ( n − 1 ) / 4 ( det L ) 1 / n \lVert b_1 \rVert \leq 2^{(n-1)/2}\lambda_1(L), \qquad \lVert b_1 \rVert \leq 2^{(n-1)/4}(\det L)^{1/n} ∥ b 1 ∥ ≤ 2 ( n − 1 ) /2 λ 1 ( L ) , ∥ b 1 ∥ ≤ 2 ( n − 1 ) /4 ( det L ) 1/ n
が 成り立つ。一般の δ \delta δ に ついては、 α = 1 / ( δ − 1 / 4 ) \alpha = 1/(\delta - 1/4) α = 1/ ( δ − 1/4 ) と おき、二つの 不等式の 2 2 2 を α \alpha α に 置き換えた ものが 成り立つ( δ = 3 / 4 \delta = 3/4 δ = 3/4 なら α = 2 \alpha = 2 α = 2 )。
証明. サイズ簡約より μ i , i − 1 2 ≤ 1 / 4 \mu_{i,i-1}^2 \leq 1/4 μ i , i − 1 2 ≤ 1/4 なので、ロヴァースの 条件から ∥ b i ∗ ∥ 2 ≥ ( δ − 1 / 4 ) ∥ b i − 1 ∗ ∥ 2 = ∥ b i − 1 ∗ ∥ 2 / α \lVert b_i^{\ast} \rVert^2 \geq (\delta - 1/4)\lVert b_{i-1}^{\ast} \rVert^2 = \lVert b_{i-1}^{\ast} \rVert^2/\alpha ∥ b i ∗ ∥ 2 ≥ ( δ − 1/4 ) ∥ b i − 1 ∗ ∥ 2 = ∥ b i − 1 ∗ ∥ 2 / α で、繰り返すと ∥ b 1 ∥ 2 = ∥ b 1 ∗ ∥ 2 ≤ α i − 1 ∥ b i ∗ ∥ 2 \lVert b_1 \rVert^2 = \lVert b_1^{\ast} \rVert^2 \leq \alpha^{i-1}\lVert b_i^{\ast} \rVert^2 ∥ b 1 ∥ 2 = ∥ b 1 ∗ ∥ 2 ≤ α i − 1 ∥ b i ∗ ∥ 2 (1 ≤ i ≤ n 1 \leq i \leq n 1 ≤ i ≤ n )。α > 1 \alpha > 1 α > 1 なので ∥ b i ∗ ∥ ≥ α − ( n − 1 ) / 2 ∥ b 1 ∥ \lVert b_i^{\ast} \rVert \geq \alpha^{-(n-1)/2}\lVert b_1 \rVert ∥ b i ∗ ∥ ≥ α − ( n − 1 ) /2 ∥ b 1 ∥ が すべての i i i で 成り立ち、命題 7.14 (2) より λ 1 ( L ) ≥ α − ( n − 1 ) / 2 ∥ b 1 ∥ \lambda_1(L) \geq \alpha^{-(n-1)/2}\lVert b_1 \rVert λ 1 ( L ) ≥ α − ( n − 1 ) /2 ∥ b 1 ∥ 。また i = 1 , … , n i = 1, \dots, n i = 1 , … , n に ついて 掛け合わせると、命題 7.14 (1) より ∥ b 1 ∥ 2 n ≤ α n ( n − 1 ) / 2 ( det L ) 2 \lVert b_1 \rVert^{2n} \leq \alpha^{n(n-1)/2}(\det L)^2 ∥ b 1 ∥ 2 n ≤ α n ( n − 1 ) /2 ( det L ) 2 。□ \square □
LLL アルゴリズム 入力は 基底 b 1 , … , b n b_1, \dots, b_n b 1 , … , b n と δ \delta δ 。k = 2 k = 2 k = 2 とし、k ≤ n k \leq n k ≤ n の 間、次を 繰り返して、 k = n + 1 k = n + 1 k = n + 1 に なったら ( b 1 , … , b n ) (b_1, \dots, b_n) ( b 1 , … , b n ) を 出力する。
(サイズ簡約)j = k − 1 , … , 1 j = k - 1, \dots, 1 j = k − 1 , … , 1 の 順に、 μ k j \mu_{kj} μ k j に 最も 近い 整数 m m m を とって b k ← b k − m b j b_k \leftarrow b_k - mb_j b k ← b k − m b j と する( b k ∗ b_k^{\ast} b k ∗ と μ k l \mu_{kl} μ k l (l > j l > j l > j )は 変わらず、 μ k j \mu_{kj} μ k j は m m m だけ 減るので、終わると ∣ μ k j ∣ ≤ 1 / 2 \lvert \mu_{kj} \rvert \leq 1/2 ∣ μ k j ∣ ≤ 1/2 と なる)。
ロヴァースの 条件 ∥ b k ∗ ∥ 2 ≥ ( δ − μ k , k − 1 2 ) ∥ b k − 1 ∗ ∥ 2 \lVert b_k^{\ast} \rVert^2 \geq (\delta - \mu_{k,k-1}^2)\lVert b_{k-1}^{\ast} \rVert^2 ∥ b k ∗ ∥ 2 ≥ ( δ − μ k , k − 1 2 ) ∥ b k − 1 ∗ ∥ 2 が 成り立てば k ← k + 1 k \leftarrow k + 1 k ← k + 1 、成り立たなければ b k − 1 b_{k-1} b k − 1 と b k b_k b k を 入れ替えて k ← max ( k − 1 , 2 ) k \leftarrow \max(k - 1, 2) k ← max ( k − 1 , 2 ) と する。
各段階の 始めに b 1 , … , b k − 1 b_1, \dots, b_{k-1} b 1 , … , b k − 1 が LLL 簡約されている こと(帰納的に 確かめられる)から、出力は LLL 簡約された 基底である。
定理 7.21 (LLL アルゴリズムの 計算量。主張)成分が 整数の 基底を 入力すると、 δ = 3 / 4 \delta = 3/4 δ = 3/4 の LLL アルゴリズムは n n n と log max i ∥ b i ∥ \log \max_i \lVert b_i \rVert log max i ∥ b i ∥ の 多項式時間で 終わる。
証明の 要点は、 b 1 , … , b i b_1, \dots, b_i b 1 , … , b i の 内積を 並べた 行列の 行列式 d i = ∏ j ≤ i ∥ b j ∗ ∥ 2 d_i = \prod_{j \leq i}\lVert b_j^{\ast} \rVert^2 d i = ∏ j ≤ i ∥ b j ∗ ∥ 2 (正の 整数)の 積が、サイズ簡約では 変わらず、入れ替えの たびに δ \delta δ 倍未満に なる ことである(詳細は Hoffstein–Pipher–Silverman)。実際の LLL は 定理 7.20 の 評価より ずっと 短い ベクトルを 出力する ことが 多い。小さな ブロックごとに 最短ベクトルを 求める BKZ は より 良い 近似を 与えるが、ブロックを 大きく すると 計算時間が 指数的に 増える。格子暗号の 安全性の 見積もりは この 計算量に 基づく。
7.8 格子簡約に よる 攻撃
部分和問題 (ナップサック問題)は、正の 整数 a 1 , … , a n a_1, \dots, a_n a 1 , … , a n と S S S から ∑ i x i a i = S \sum_i x_ia_i = S ∑ i x i a i = S と なる x ∈ { 0 , 1 } n x \in \lbrace 0, 1 \rbrace^n x ∈ { 0 , 1 } n を 求める 問題で、一般には NP 困難である。これを 使う 暗号が 公開鍵暗号の 最初期に 提案された。
例 7.22 (メルクル–ヘルマン暗号, 1978 年)秘密の 列 r = ( 3 , 5 , 11 , 20 , 41 , 83 , 167 , 331 ) r = (3, 5, 11, 20, 41, 83, 167, 331) r = ( 3 , 5 , 11 , 20 , 41 , 83 , 167 , 331 ) は、各項が それより 前の 項の 和より 大きい( 超増加列 )。M = 673 > ∑ i r i = 661 M = 673 > \sum_i r_i = 661 M = 673 > ∑ i r i = 661 と、gcd ( W , M ) = 1 \gcd(W, M) = 1 g cd( W , M ) = 1 と なる W = 113 W = 113 W = 113 も 秘密にし、 a i = W r i m o d M a_i = Wr_i \bmod M a i = W r i mod M を 公開鍵と する : a = ( 339 , 565 , 570 , 241 , 595 , 630 , 27 , 388 ) a = (339, 565, 570, 241, 595, 630, 27, 388) a = ( 339 , 565 , 570 , 241 , 595 , 630 , 27 , 388 ) 。平文 x = ( 1 , 0 , 1 , 1 , 0 , 1 , 1 , 0 ) x = (1, 0, 1, 1, 0, 1, 1, 0) x = ( 1 , 0 , 1 , 1 , 0 , 1 , 1 , 0 ) の 暗号文は S = ∑ i x i a i = 1807 S = \sum_i x_ia_i = 1807 S = ∑ i x i a i = 1807 である。正規の 受信者は 113 − 1 ≡ 405 ( m o d 673 ) 113^{-1} \equiv 405 \pmod{673} 11 3 − 1 ≡ 405 ( mod 673 ) を 使って 405 ⋅ 1807 ≡ 284 ≡ ∑ i x i r i 405 \cdot 1807 \equiv 284 \equiv \sum_i x_ir_i 405 ⋅ 1807 ≡ 284 ≡ ∑ i x i r i を 得る。 0 ≤ ∑ i x i r i ≤ 661 0 \leq \sum_i x_ir_i \leq 661 0 ≤ ∑ i x i r i ≤ 661 なので 284 = ∑ i x i r i 284 = \sum_i x_ir_i 284 = ∑ i x i r i で、大きい 項から 貪欲に 引けば x x x が 決まる( 284 = 167 + 83 + 20 + 11 + 3 284 = 167 + 83 + 20 + 11 + 3 284 = 167 + 83 + 20 + 11 + 3 )。
攻撃者は W , M W, M W , M を 知らないが、格子で x x x を 求められる。 R n + 1 \mathbb{R}^{n+1} R n + 1 の ベクトル
b i = ( 2 e i , N a i ) ( i = 1 , … , n ) , b n + 1 = ( 1 , … , 1 , N S ) b_i = (2e_i, Na_i) \quad (i = 1, \dots, n), \qquad b_{n+1} = (1, \dots, 1, NS) b i = ( 2 e i , N a i ) ( i = 1 , … , n ) , b n + 1 = ( 1 , … , 1 , N S )
(e i e_i e i は R n \mathbb{R}^n R n の 第 i i i 単位ベクトル、N N N は 正の 整数)で 生成される 格子を 考える( 2 S ≠ ∑ i a i 2S \neq \sum_i a_i 2 S = ∑ i a i なら 一次独立)。 ∑ i x i b i − b n + 1 = ( 2 x 1 − 1 , … , 2 x n − 1 , 0 ) \sum_i x_ib_i - b_{n+1} = (2x_1 - 1, \dots, 2x_n - 1, 0) ∑ i x i b i − b n + 1 = ( 2 x 1 − 1 , … , 2 x n − 1 , 0 ) は 成分が すべて ± 1 \pm 1 ± 1 の 長さ n \sqrt{n} n の 格子点である。一方、最後の 成分が 0 0 0 でない 格子点は、その 成分が N N N の 0 0 0 でない 整数倍なので 長さ N N N 以上である。N > n N > \sqrt{n} N > n にとれば、短い 格子点は 最後の 成分が 0 0 0 の ものに 限られ、 ± ( 2 x − 1 , 0 ) \pm(2x - 1, 0) ± ( 2 x − 1 , 0 ) が LLL で 見つかる ことが 期待できる。実際、 N = 10 N = 10 N = 10 と して この 9 次元の 格子を LLL アルゴリズム( δ = 3 / 4 \delta = 3/4 δ = 3/4 、有理数で 厳密に 計算)で 簡約すると、最初の ベクトルは ( − 1 , 1 , − 1 , − 1 , 1 , − 1 , − 1 , 1 , 0 ) = − ( 2 x − 1 , 0 ) (-1, 1, -1, -1, 1, -1, -1, 1, 0) = -(2x - 1, 0) ( − 1 , 1 , − 1 , − 1 , 1 , − 1 , − 1 , 1 , 0 ) = − ( 2 x − 1 , 0 ) と なり、秘密鍵なしに 平文が 復元される(計算機で 確かめた。この 公開鍵では 256 通りの 平文すべてで 復元できる)。定理 7.20 の 保証は ∥ b 1 ∥ ≤ 2 4 λ 1 ( L ) \lVert b_1 \rVert \leq 2^4\lambda_1(L) ∥ b 1 ∥ ≤ 2 4 λ 1 ( L ) までだが、実際には 最短ベクトル(長さ 8 \sqrt{8} 8 )が 見つかっている。シャミアは 1982 年に 基本的な メルクル–ヘルマン暗号を 多項式時間で 破り、その後、格子簡約は 多くの ナップサック型の 暗号を 破った。上の 格子では、 密度 n / log 2 max i a i n/\log_2 \max_i a_i n / log 2 max i a i が 約 0.9408 0.9408 0.9408 未満の ほとんど すべての 部分和問題が、最短ベクトルを 求める オラクルで 解ける ことも 証明されている(コスター・ジュー・ラマッキア・オドリズコ・シュノア・スターン, 1992 年。主張のみ。例 7.22 の 密度は 約 0.86 0.86 0.86 )。最悪の 場合に 難しい 問題でも、暗号が 実際に 生成する 問題が 難しいとは 限らない。
偏った ナンス 第4章 の ECDSA の 署名 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 から、ナンスは 秘密鍵 d d d の 既知の 一次式 k i ≡ t i d + u i ( m o d n ) k_i \equiv t_id + u_i \pmod{n} k i ≡ t i d + u i ( mod n ) (t i = s i − 1 r i t_i = s_i^{-1}r_i t i = s i − 1 r i , u i = s i − 1 z i u_i = s_i^{-1}z_i u i = s i − 1 z i )で 表せる。ナンスが いつも 0 ≤ k i < K 0 \leq k_i < K 0 ≤ k i < K (上位 ℓ \ell ℓ ビットが 0 0 0 なら K K K は n / 2 ℓ n/2^{\ell} n / 2 ℓ 程度)を みたすなら、 n e i ne_i n e i (i = 1 , … , m i = 1, \dots, m i = 1 , … , m ), ( t 1 , … , t m , K / n , 0 ) (t_1, \dots, t_m, K/n, 0) ( t 1 , … , t m , K / n , 0 ) , ( u 1 , … , u m , 0 , K ) (u_1, \dots, u_m, 0, K) ( u 1 , … , u m , 0 , K ) で 生成される 格子は、成分の 絶対値が すべて K K K 以下の 点 ( k 1 , … , k m , d K / n , K ) (k_1, \dots, k_m, dK/n, K) ( k 1 , … , k m , d K / n , K ) を 含み、これを LLL などで 見つければ d d d が 求まる(第4章の 隠れた 数の 問題 。必要な ℓ \ell ℓ と 署名の 数 m m m は ヒューリスティックな 見積もりに なる)。
7.9 LWE 問題と レゲフの 暗号方式
連立一次方程式は 消去法で 解けるが、右辺に 小さな 誤差を 加えるだけで 急に 難しくなる。消去の 過程で 誤差も 拡大されるからである(問題 7.4)。以下、 a , s ∈ ( Z / q Z ) n a, s \in (\mathbb{Z}/q\mathbb{Z})^n a , s ∈ ( Z / q Z ) n に ついて ⟨ a , s ⟩ = ∑ j a j s j ∈ Z / q Z \langle a, s \rangle = \sum_j a_js_j \in \mathbb{Z}/q\mathbb{Z} ⟨ a , s ⟩ = ∑ j a j s j ∈ Z / q Z と する。
定義 7.23 (LWE 問題, learning with errors)n , m , q ≥ 2 n, m, q \geq 2 n , m , q ≥ 2 を 整数、 χ \chi χ を 絶対値の 小さい 整数の 上の 確率分布( 誤差分布 )と する。秘密 s ∈ ( Z / q Z ) n s \in (\mathbb{Z}/q\mathbb{Z})^n s ∈ ( Z / q Z ) n を 一様に 選び、 i = 1 , … , m i = 1, \dots, m i = 1 , … , m に ついて a i ∈ ( Z / q Z ) n a_i \in (\mathbb{Z}/q\mathbb{Z})^n a i ∈ ( Z / q Z ) n を 一様に、 e i e_i e i を χ \chi χ に 従って(すべて 独立に)選び、 b i = ⟨ a i , s ⟩ + e i b_i = \langle a_i, s \rangle + e_i b i = ⟨ a i , s ⟩ + e i と する。組 ( a i , b i ) i = 1 m (a_i, b_i)_{i=1}^{m} ( a i , b i ) i = 1 m から s s s を 求める 問題を 探索 LWE、この 組と b i b_i b i を Z / q Z \mathbb{Z}/q\mathbb{Z} Z / q Z から 一様に 選び直した 組とを 見分ける 問題を 判定 LWE と いう。
誤差分布には、正規分布を 整数に 離散化した 離散ガウス分布 や、{ − η , … , η } \lbrace -\eta, \dots, \eta \rbrace { − η , … , η } に 値を とる 二項分布(ML-KEM が 使う)などを 使う。ある x x x に ついて y i ≡ ⟨ a i , x ⟩ ( m o d q ) y_i \equiv \langle a_i, x \rangle \pmod{q} y i ≡ ⟨ a i , x ⟩ ( mod q ) (すべての i i i )と なる y ∈ Z m y \in \mathbb{Z}^m y ∈ Z m の 全体は 格子で、 ( b i ) i (b_i)_i ( b i ) i は その 格子点 ( ⟨ a i , s ⟩ ) i (\langle a_i, s \rangle)_i (⟨ a i , s ⟩ ) i から 誤差だけずれた 点だから、探索 LWE は CVP の 特別な 場合である。
定理 7.24 (レゲフ, 2005 年。主張)q q q を n n n の 多項式程度の 大きさの 素数とし、誤差分布を 標準偏差が n \sqrt{n} n 程度以上の 離散ガウス分布と する。LWE を 平均的に(無視できない 確率で)解く 効率的な アルゴリズムが あれば、 n n n 次元の 任意の 格子に ついて、近似倍率が n n n の 多項式程度の 近似 SVP(の 変種)を 解く 効率的な 量子アルゴリズムが 存在する。
ナップサック暗号とは 対照的に、ランダムな LWE は 最悪の 場合の 格子問題より(量子計算機に とって)易しくは ない。ただし規格の パラメータは、この 帰着ではなく BKZ などの 最良の 攻撃の 計算量から 決められている。
定義 7.25 (レゲフの 暗号方式) パラメータ n , m , q , χ n, m, q, \chi n , m , q , χ を 定める。
鍵生成:秘密鍵は s ∈ ( Z / q Z ) n s \in (\mathbb{Z}/q\mathbb{Z})^n s ∈ ( Z / q Z ) n 、公開鍵は LWE の 組 ( a i , b i ) i = 1 m (a_i, b_i)_{i=1}^{m} ( a i , b i ) i = 1 m (b i = ⟨ a i , s ⟩ + e i b_i = \langle a_i, s \rangle + e_i b i = ⟨ a i , s ⟩ + e i )。
暗号化(平文 μ ∈ { 0 , 1 } \mu \in \lbrace 0, 1 \rbrace μ ∈ { 0 , 1 } ):{ 1 , … , m } \lbrace 1, \dots, m \rbrace { 1 , … , m } の 部分集合 S S S を 一様に 選び、 u = ∑ i ∈ S a i u = \sum_{i \in S} a_i u = ∑ i ∈ S a i , v = ∑ i ∈ S b i + μ ⌊ q / 2 ⌋ v = \sum_{i \in S} b_i + \mu\lfloor q/2 \rfloor v = ∑ i ∈ S b i + μ ⌊ q /2 ⌋ と して、 ( u , v ) (u, v) ( u , v ) を 暗号文と する。
復号:w = v − ⟨ u , s ⟩ w = v - \langle u, s \rangle w = v − ⟨ u , s ⟩ の 代表 w ′ w' w ′ を − q / 2 < w ′ ≤ q / 2 -q/2 < w' \leq q/2 − q /2 < w ′ ≤ q /2 の 範囲に とり、 ∣ w ′ ∣ < q / 4 \lvert w' \rvert < q/4 ∣ w ′ ∣ < q /4 なら 0 0 0 、そうでなければ 1 1 1 を 出力する。
定理 7.26 (復号の 正しさ)誤差 e i e_i e i を 整数と みて E = ∑ i ∈ S e i E = \sum_{i \in S} e_i E = ∑ i ∈ S e i と おく。 ∣ E ∣ < ⌊ q / 2 ⌋ / 2 \lvert E \rvert < \lfloor q/2 \rfloor/2 ∣ E ∣ < ⌊ q /2 ⌋ /2 ならば、復号の 出力は μ \mu μ に 一致する。特に q q q が 偶数なら、誤差の 総和の 絶対値が q / 4 q/4 q /4 未満であれば 正しく 復号される。
証明. h = ⌊ q / 2 ⌋ h = \lfloor q/2 \rfloor h = ⌊ q /2 ⌋ と おく。 b i − ⟨ a i , s ⟩ = e i b_i - \langle a_i, s \rangle = e_i b i − ⟨ a i , s ⟩ = e i なので、Z / q Z \mathbb{Z}/q\mathbb{Z} Z / q Z で w = ∑ i ∈ S ( b i − ⟨ a i , s ⟩ ) + μ h = E + μ h w = \sum_{i \in S}(b_i - \langle a_i, s \rangle) + \mu h = E + \mu h w = ∑ i ∈ S ( b i − ⟨ a i , s ⟩) + μ h = E + μ h である。整数 x x x に 対し、 x x x と 法 q q q で 合同な 整数の 絶対値の 最小値を ∣ x ∣ q \lvert x \rvert_q ∣ x ∣ q と 書く( − q / 2 < x ′ ≤ q / 2 -q/2 < x' \leq q/2 − q /2 < x ′ ≤ q /2 と なる 代表 x ′ x' x ′ に ついて ∣ x ∣ q = ∣ x ′ ∣ \lvert x \rvert_q = \lvert x' \rvert ∣ x ∣ q = ∣ x ′ ∣ )。∣ x + y ∣ q ≤ ∣ x ∣ q + ∣ y ∣ q \lvert x + y \rvert_q \leq \lvert x \rvert_q + \lvert y \rvert_q ∣ x + y ∣ q ≤ ∣ x ∣ q + ∣ y ∣ q , ∣ x ∣ q ≤ ∣ x ∣ \lvert x \rvert_q \leq \lvert x \rvert ∣ x ∣ q ≤ ∣ x ∣ であり、0 ≤ h ≤ q / 2 0 \leq h \leq q/2 0 ≤ h ≤ q /2 より ∣ h ∣ q = h \lvert h \rvert_q = h ∣ h ∣ q = h である。
μ = 0 \mu = 0 μ = 0 の とき、 ∣ w ′ ∣ = ∣ E ∣ q ≤ ∣ E ∣ < h / 2 ≤ q / 4 \lvert w' \rvert = \lvert E \rvert_q \leq \lvert E \rvert < h/2 \leq q/4 ∣ w ′ ∣ = ∣ E ∣ q ≤ ∣ E ∣ < h /2 ≤ q /4 なので 0 0 0 が 出力される。 μ = 1 \mu = 1 μ = 1 の とき、 ∣ w ′ ∣ = ∣ h + E ∣ q ≥ ∣ h ∣ q − ∣ E ∣ q ≥ h − ∣ E ∣ > h / 2 \lvert w' \rvert = \lvert h + E \rvert_q \geq \lvert h \rvert_q - \lvert E \rvert_q \geq h - \lvert E \rvert > h/2 ∣ w ′ ∣ = ∣ h + E ∣ q ≥ ∣ h ∣ q − ∣ E ∣ q ≥ h − ∣ E ∣ > h /2 である。q q q が 偶数なら h / 2 = q / 4 h/2 = q/4 h /2 = q /4 なので ∣ w ′ ∣ > q / 4 \lvert w' \rvert > q/4 ∣ w ′ ∣ > q /4 。q q q が 奇数なら h / 2 = ( q − 1 ) / 4 h/2 = (q - 1)/4 h /2 = ( q − 1 ) /4 なので 4 ∣ w ′ ∣ > q − 1 4\lvert w' \rvert > q - 1 4 ∣ w ′ ∣ > q − 1 で、4 ∣ w ′ ∣ 4\lvert w' \rvert 4 ∣ w ′ ∣ は 整数だから 4 ∣ w ′ ∣ ≥ q 4\lvert w' \rvert \geq q 4 ∣ w ′ ∣ ≥ q 。いずれも ∣ w ′ ∣ ≥ q / 4 \lvert w' \rvert \geq q/4 ∣ w ′ ∣ ≥ q /4 で、1 1 1 が 出力される。 □ \square □
パラメータの 関係 誤差の 絶対値が つねに B B B 以下なら ∣ E ∣ ≤ m B \lvert E \rvert \leq mB ∣ E ∣ ≤ m B なので、m B < ⌊ q / 2 ⌋ / 2 mB < \lfloor q/2 \rfloor/2 m B < ⌊ q /2 ⌋ /2 ならつねに 正しく 復号できる。誤差が 離散ガウス分布などなら、 E E E は 独立な 小さい 数の 和と して 0 0 0 の 近くに 集中し、誤差の 標準偏差 σ \sigma σ に ついて q / 4 q/4 q /4 が σ m / 2 \sigma\sqrt{m/2} σ m /2 より 十分 大きければ 誤る 確率は きわめて 小さい。一方、安全性の ために σ \sigma σ は 小さくしすぎられない(定理 7.24 では n \sqrt{n} n 程度以上)ので、q q q は n n n の 多項式の 大きさに とる(レゲフの 原論文では n 2 n^2 n 2 と 2 n 2 2n^2 2 n 2 の 間の 素数)。また 定数 ε > 0 \varepsilon > 0 ε > 0 に ついて m ≥ ( 1 + ε ) ( n + 1 ) log 2 q m \geq (1 + \varepsilon)(n + 1)\log_2 q m ≥ ( 1 + ε ) ( n + 1 ) log 2 q なら、判定 LWE が 難しいと いう 仮定のもとで この 方式は IND-CPA 安全( 第2章 2.10 節)であることが、( u , v ) (u, v) ( u , v ) が ほぼ一様に 分布する ことを 示す 残余ハッシュ補題 を 使って 証明されている(主張のみ)。
例 7.28 n = 4 n = 4 n = 4 , q = 97 q = 97 q = 97 , m = 20 m = 20 m = 20 で 誤差が { − 1 , 0 , 1 } \lbrace -1, 0, 1 \rbrace { − 1 , 0 , 1 } に 値を とるなら、 ∣ E ∣ ≤ 20 < ⌊ 97 / 2 ⌋ / 2 = 24 \lvert E \rvert \leq 20 < \lfloor 97/2 \rfloor/2 = 24 ∣ E ∣ ≤ 20 < ⌊ 97/2 ⌋ /2 = 24 なので 復号は つねに 正しい。ただし 97 4 ≈ 8.9 × 10 7 97^4 \approx 8.9 \times 10^7 9 7 4 ≈ 8.9 × 1 0 7 通りの s s s の 総当たりで 破れるので、実用の 方式では 次元を 数百以上に する。
7.10 加群 LWE と ML-KEM
レゲフの 方式は 公開鍵が m ( n + 1 ) m(n + 1) m ( n + 1 ) 個、1 ビットの 暗号文が n + 1 n + 1 n + 1 個の 元からなり、効率が 悪い。実用の 方式は 多項式環の 構造を 使う。 n n n を 2 の べきとし、
R q = ( Z / q Z ) [ x ] / ( x n + 1 ) R_q = (\mathbb{Z}/q\mathbb{Z})[x]/(x^n + 1) R q = ( Z / q Z ) [ x ] / ( x n + 1 )
と おく(積は x n = − 1 x^n = -1 x n = − 1 と して 計算する。FIPS 203 は この 環を Z q [ X ] / ( X n + 1 ) \mathbb{Z}_q[X]/(X^n + 1) Z q [ X ] / ( X n + 1 ) と 書くが、本教材の Z q \mathbb{Z}_q Z q は q q q 進整数環なので 使わない)。 a ∈ R q a \in R_q a ∈ R q を 掛ける 写像は 係数ベクトルの 上の n n n 次正方行列なので、R q R_q R q の 一つの 元が n n n 本の LWE の 式の 役割を 果たす。成分が R q R_q R q の 一様な k × k k \times k k × k 行列 A A A と 係数の 小さい s , e ∈ R q k s, e \in R_q^k s , e ∈ R q k から t = A s + e t = As + e t = A s + e を 作り、 ( A , t ) (A, t) ( A , t ) から s s s を 求める 問題を 加群 LWE (module-LWE) と いう。
ML-KEM (FIPS 203)は CRYSTALS-Kyber から 作られた、加群 LWE に 基づく 鍵カプセル化メカニズム (KEM) で、公開鍵から 共有鍵と その「カプセル」を 作り、秘密鍵で カプセルから 共有鍵を 取り出す。パラメータは n = 256 n = 256 n = 256 , q = 3329 q = 3329 q = 3329 , k ∈ { 2 , 3 , 4 } k \in \lbrace 2, 3, 4 \rbrace k ∈ { 2 , 3 , 4 } で、A A A を 32 バイトの 種 ρ \rho ρ から SHAKE128 で 生成し、 ( t , ρ ) (t, \rho) ( t , ρ ) を 公開鍵、 s s s を 秘密鍵と する。256 ビットの μ \mu μ は、係数の 小さい y , e 1 ∈ R q k y, e_1 \in R_q^k y , e 1 ∈ R q k , e 2 ∈ R q e_2 \in R_q e 2 ∈ R q を 選んで u = A ⊤ y + e 1 u = A^{\top}y + e_1 u = A ⊤ y + e 1 , v = ⟨ t , y ⟩ + e 2 + 1665 μ v = \langle t, y \rangle + e_2 + 1665\mu v = ⟨ t , y ⟩ + e 2 + 1665 μ と 暗号化し、係数を 圧縮して 送る( A ⊤ A^{\top} A ⊤ は 転置で、 02-linear-algebra の t A {}^tA t A と 同じ もの。 μ \mu μ の ビットを 係数と みなし、 1665 1665 1665 は q / 2 q/2 q /2 を 四捨五入した 値)。復号では
v − ⟨ s , u ⟩ = ⟨ e , y ⟩ − ⟨ s , e 1 ⟩ + e 2 + 1665 μ v - \langle s, u \rangle = \langle e, y \rangle - \langle s, e_1 \rangle + e_2 + 1665\mu v − ⟨ s , u ⟩ = ⟨ e , y ⟩ − ⟨ s , e 1 ⟩ + e 2 + 1665 μ
(と 圧縮に よる 誤差)の 各係数が 0 0 0 と 1665 1665 1665 の どちらに 近いかで ビットを 決める。誤差の 項が レゲフの 方式の E E E に、y y y が 部分集合 S S S に あたる。これに 藤崎–岡本変換(暗号化の 乱数を μ \mu μ と 公開鍵の ハッシュ値から 作り、復号した 側が 暗号化し直して 確かめる 変換)を ほどこして KEM に しており、ML-KEM は IND-CCA2 安全であると 考えられている。な お 256 ∣ q − 1 256 \mid q - 1 256 ∣ q − 1 なので Z / q Z \mathbb{Z}/q\mathbb{Z} Z / q Z は 1 の 原始 256 乗根(たとえば 17 17 17 )を 含み、 R q R_q R q の 積は 数論的変換で 高速に 計算できる。
ML-KEM-512
ML-KEM-768
ML-KEM-1024
k k k
2 2 2
3 3 3
4 4 4
安全性の カテゴリー
1
3
5
カプセル化鍵(バイト)
800
1184
1568
暗号文(バイト)
768
1088
1568
復号に 失敗する 確率
2 − 138.8 2^{-138.8} 2 − 138.8
2 − 164.8 2^{-164.8} 2 − 164.8
2 − 174.8 2^{-174.8} 2 − 174.8
カテゴリー 1・3・5 は、破るのに それぞれ AES-128・AES-192・AES-256 の 鍵の 総当たり以上の 計算資源を 要すると いう 意味で、NIST は ML-KEM-768 を 既定と して 推奨している。失敗確率は ハッシュ関数を 理想化した 仮定のもとでの 見積もりである。
7.11 量子計算機の 影響
定理 7.29 (ショア, 1994 年。主張)量子計算機の 上で、整数 N N N の 素因数分解と、元を 一意的に 表せて 群演算が 効率よく 計算できる 巡回群( ( Z / p Z ) × (\mathbb{Z}/p\mathbb{Z})^\times ( Z / p Z ) × や 楕円曲線の 点の 群を 含む)の 離散対数問題を、入力の ビット長の 多項式時間で、高い 確率で 解く アルゴリズムが 存在する。
定理 7.30 (グローバー, 1996 年。主張)f : { 0 , 1 } k → { 0 , 1 } f\colon \lbrace 0, 1 \rbrace^k \to \lbrace 0, 1 \rbrace f : { 0 , 1 } k → { 0 , 1 } が f ( x ) = 1 f(x) = 1 f ( x ) = 1 と なる x x x を ただ 一つ もつとき、 f f f を 量子回路と して O ( 2 k / 2 ) O(2^{k/2}) O ( 2 k /2 ) 回呼び出して、その x x x を 高い 確率で 求める 量子アルゴリズムが 存在する。 f f f を 中身の 見えない 関数と して 扱う 限り、 Ω ( 2 k / 2 ) \Omega(2^{k/2}) Ω ( 2 k /2 ) 回の 呼び出しが 必要である(ベネット・バーンスタイン・ブラッサール・ヴァジラニ, 1997 年)。
対象
古典計算機での 最良の 攻撃
量子計算機での 攻撃
対策
RSA・有限体の DH・DSA
準指数時間(数体 ふる い 法)
多項式時間(ショア)
耐量子暗号へ 移行
ECDH・ECDSA・EdDSA
群の 位数の 平方根程度( ρ \rho ρ 法)
多項式時間(ショア)
耐量子暗号へ 移行
共通鍵暗号(k k k ビットの 鍵)
約 2 k 2^k 2 k 回
約 2 k / 2 2^{k/2} 2 k /2 回(グローバー)
256 ビットの 鍵を 使う
ハッシュ関数の 原像(出力 n n n ビット)
約 2 n 2^n 2 n 回
約 2 n / 2 2^{n/2} 2 n /2 回(グローバー)
出力を 十分長く する
ショアの アルゴリズムに 対しては、鍵を 長くしても 多項式時間の ままなので 方式を 取り替えるしかない。グローバーの アルゴリズムに 対しては 鍵を 2 倍の 長さに すれば 元の 手間に 戻るうえ、並列化の 効果が 小さく、量子回路で AES を 評価する こと自体も 重いので、実際の 影響は「鍵の 長さが 半分に なる」より 小さいと 考えられている。衝突探索には 約 2 n / 3 2^{n/3} 2 n /3 回の 評価で 済む量子アルゴリズム(ブラッサール・ホイヤー・タップ, 1998 年)が あるが、同程度の 量子メモリを 要する ため実際の 利点は 小さいと する 分析が ある。大規模な 誤り耐性の ある 量子計算機が いつ実現するかに ついて、確かな 予測は ない。
7.12 耐量子暗号の 規格と 移行
NIST は 2016 年に 耐量子暗号の 公募を 始め、2022 年に CRYSTALS-Kyber・CRYSTALS-Dilithium・FALCON・SPHINCS+ を 選び、2024 年 8 月 13 日に 最初の 3 つの 規格を 公表した。
規格
方式
元に なった 方式
用途
安全性の 根拠
FIPS 203
ML-KEM
CRYSTALS-Kyber
鍵カプセル化
加群 LWE
FIPS 204
ML-DSA
CRYSTALS-Dilithium
署名
加群 LWE と 加群 SIS の 変種
FIPS 205
SLH-DSA
SPHINCS+
署名
ハッシュ関数の 性質だけ
SIS 問題は、与えられた A A A に ついて A z ≡ 0 ( m o d q ) Az \equiv 0 \pmod{q} A z ≡ 0 ( mod q ) と なる 短い z ≠ 0 z \neq 0 z = 0 を 求める 問題である(アイタイが 1996 年に 最悪の 場合の 格子問題からの 帰着を 与えた)。SLH-DSA は 1 回しか 使えない ハッシュ関数に よる 署名(問題 7.5)を ハッシュ値の 木で 束ねた もので、最も 保守的な 選択だが 署名が 大きい(ECDSA(P-256)の 64 バイトに 対し、ML-DSA-44 は 2420 バイト、SLH-DSA-SHA2-128s は 7856 バイト)。
本書執筆時点(2026 年)の 状況を 補って おく。NIST は 2025 年 3 月、符号( 第5章 ・第6章 )に 基づく 鍵カプセル化方式 HQC を ML-KEM の 予備と して 規格化する 方式に 選び、FALCON に 基づく 署名 FN-DSA とともに 規格を 作成している。移行計画の 草案 NIST IR 8547(2024 年 11 月)は、量子計算機に 弱い 公開鍵暗号(RSA・楕円曲線暗号など)を 2035 年より 後は 認めない 日程を 提案している。
ハイブリッド鍵交換 ML-KEM は 新しく、未知の 攻撃や 実装の 誤りも ありうるので、移行期には ECDH(X25519 など)と ML-KEM を 同時に 行い、2 つの 共有秘密 Z , T Z, T Z , T から 鍵導出関数で K = KDF ( Z ∥ T ) K = \operatorname{KDF}(Z \mathbin{\Vert} T) K = KDF ( Z ∥ T ) を 作る。鍵導出関数を 適切に 選べば、どちらか 一方が 安全である 限り K K K は 安全である。TLS 1.3 向けには、X25519 と ML-KEM-768 を 組み合わせた X25519MLKEM768 などが RFC 10024(2026 年 8 月)で 規格化された。
クリプトアジリティ (暗号方式を 取り 替えやすい 設計)も 重要である。どこで どの 暗号を 使っているかを 棚卸しし、方式を 切り 替えられるようにし、鍵や 署名の 大きさを 決め打ちしない(X25519 の 公開鍵 32 バイトに 対し、ML-KEM-768 の カプセル化鍵は 1184 バイト)。データを 秘密に しておきたい 期間 x x x と 移行に かかる 期間 y y y の 和が、実用的な 量子計算機の 出現までの 期間 z z z を 超えれば 手遅れに なる( x + y > z x + y > z x + y > z 。モスカの 不等式と 呼ばれる)。今の 通信を 記録して 将来解読する 攻撃が ありうるので、長期の 秘密を 運ぶ鍵共有から 先に 移行する。署名は 検証の 時点で 安全なら 足りる ことが 多いが、長く 使う ルート証明書などは 早めに 移行する。
ヒント
実務では
耐量子暗号は 自作せず、FIPS 203・204・205 に 対応した 実績の ある ライブラリを 使い、鍵共有では まず ハイブリッド鍵交換を 検討する。共通鍵暗号は AES-256、ハッシュ関数は SHA-256 以上を 選べば 量子計算機に 対しても 余裕が ある。規格や 推奨は 改訂が 続くので、NIST の FIPS・SP、IETF の RFC、CRYPTREC の 暗号リストの 最新版を 確認する こと。
まとめ
衝突困難性は 第 2 原像困難性を 導き、十分に 圧縮する 関数では 原像困難性も 導く。誕生日の 限界に より、出力 n n n ビットの どんな 関数も 約 1.18 ⋅ 2 n / 2 1.18 \cdot 2^{n/2} 1.18 ⋅ 2 n /2 回の 計算で 確率ほぼ 1 / 2 1/2 1/2 以上で 衝突が 見つかる。
メルクル–ダムガード構成は 衝突困難性を 保つが 長さ拡張を 許すので、 H ( k ∥ m ) H(k \mathbin{\Vert} m) H ( k ∥ m ) ではなく HMAC を 使う。
格子の 行列式は 基底に よらず ∏ i ∥ b i ∗ ∥ \prod_i \lVert b_i^{\ast} \rVert ∏ i ∥ b i ∗ ∥ に 等しく、 min i ∥ b i ∗ ∥ ≤ λ 1 ( L ) ≤ n ( det L ) 1 / n \min_i \lVert b_i^{\ast} \rVert \leq \lambda_1(L) \leq \sqrt{n}(\det L)^{1/n} min i ∥ b i ∗ ∥ ≤ λ 1 ( L ) ≤ n ( det L ) 1/ n 。
2 次元では ガウス簡約が 最短ベクトルを 与え、LLL は 指数的な 近似倍率で 短い ベクトルを 多項式時間で 見つけ、ナップサック暗号や 偏った ナンスの ECDSA を 破る。
LWE は 最悪の 場合の 格子問題からの(量子)帰着を もつ。レゲフの 暗号方式は ∣ E ∣ < ⌊ q / 2 ⌋ / 2 \lvert E \rvert < \lfloor q/2 \rfloor/2 ∣ E ∣ < ⌊ q /2 ⌋ /2 なら 正しく 復号でき、ML-KEM は 加群 LWE に 基づく。
ショアの アルゴリズムは RSA・DH・楕円曲線暗号を 破るが、グローバーの アルゴリズムの 効果は 2 乗程度である。FIPS 203・204・205(2024 年)への 移行は、ハイブリッド鍵交換と クリプトアジリティを 軸に 進める。
演習問題
問題 7.1 ★ ある Web サービスは 利用者の ID を 32 ビットの 乱数で 発行している。(1) 10 万人分の ID を 発行した とき、重複が 起こる 確率の 下界を 定理 7.5 で 求めよ。(2) 10 億個の ID を 発行しても 重複の 確率を 10 − 9 10^{-9} 1 0 − 9 以下に したい。ID は 何ビットあれば よいか(定理 7.5 の 上界を 使え)。
解答
(1) N = 2 32 N = 2^{32} N = 2 32 , k = 10 5 k = 10^5 k = 1 0 5 で k ( k − 1 ) / ( 2 N ) = 9999900000 / 8589934592 ≈ 1.164 k(k-1)/(2N) = 9999900000/8589934592 \approx 1.164 k ( k − 1 ) / ( 2 N ) = 9999900000/8589934592 ≈ 1.164 なので、確率は 1 − e − 1.164 ≈ 0.688 1 - e^{-1.164} \approx 0.688 1 − e − 1.164 ≈ 0.688 以上である(正確な 値も ほぼ 0.688 0.688 0.688 )。32 ビットの 乱数では 一意性を 保てない。
(2) k = 10 9 k = 10^9 k = 1 0 9 で k ( k − 1 ) / ( 2 N ) ≤ 10 − 9 k(k-1)/(2N) \leq 10^{-9} k ( k − 1 ) / ( 2 N ) ≤ 1 0 − 9 と なるには N ≥ 10 9 ⋅ k ( k − 1 ) / 2 ≈ 5 × 10 26 ≈ 2 88.7 N \geq 10^9 \cdot k(k-1)/2 \approx 5 \times 10^{26} \approx 2^{88.7} N ≥ 1 0 9 ⋅ k ( k − 1 ) /2 ≈ 5 × 1 0 26 ≈ 2 88.7 であればよいので、89 ビットあればよい(ランダムな 122 ビットを もつ バージョン 4 の UUID なら、上界は 約 9.4 × 10 − 20 9.4 \times 10^{-20} 9.4 × 1 0 − 20 )。
問題 7.2 ★ ★ (この 実装の どこが 危ないか)ある Web API は、利用者と 共有した 16 バイトの 秘密 k k k を 使い、リクエストの 本文 m m m に t = H ( k ∥ m ) t = H(k \mathbin{\Vert} m) t = H ( k ∥ m ) (H H H は SHA-256)を 添えて 送らせ、サーバー側で 同じ値を 計算して == で 比べている。正規の リクエスト ( m , t ) (m, t) ( m , t ) を 1 つ 盗聴した 攻撃者は 何が できるか。どう直すべきか。
解答
攻撃者は k ∥ m k \mathbin{\Vert} m k ∥ m の 長さ ℓ \ell ℓ (16 バイトと 本文の 長さの 和)を 知っているので、命題 7.10 に より、好きな X X X (金額を 書き換える パラメータなど)に ついて m ∥ pad ( ℓ ) ∥ X m \mathbin{\Vert} \operatorname{pad}(\ell) \mathbin{\Vert} X m ∥ pad ( ℓ ) ∥ X の 正しい タグを t t t から 作れる。 pad ( ℓ ) \operatorname{pad}(\ell) pad ( ℓ ) の 部分は 意味の ない バイト列だが、それを 無視したり後の パラメータを 優先したりする サーバーは 少なくない。直し方 :タグを HMAC-SHA256 に し(定義 7.11)、照合は hmac.compare_digest のような 処理時間が 一定の 比較で 行う( == では 応答時間の 差から タグを 推測されうる)。盗聴した ( m , t ) (m, t) ( m , t ) の 再送も、タイムスタンプなどを 本文に 含めて 防ぐ。
問題 7.3 ★ 基底 b 1 = ( 9 , 16 ) b_1 = (9, 16) b 1 = ( 9 , 16 ) , b 2 = ( 11 , 21 ) b_2 = (11, 21) b 2 = ( 11 , 21 ) で 生成される 格子 L L L に ついて、ガウス簡約を 実行して λ 1 ( L ) \lambda_1(L) λ 1 ( L ) を 求め、 det L \det L det L を 簡約の 前後の 基底で 計算して 一致を 確かめよ。
解答
∥ b 1 ∥ 2 = 337 < ∥ b 2 ∥ 2 = 562 \lVert b_1 \rVert^2 = 337 < \lVert b_2 \rVert^2 = 562 ∥ b 1 ∥ 2 = 337 < ∥ b 2 ∥ 2 = 562 なので 入れ替えは ない。 μ = 435 / 337 \mu = 435/337 μ = 435/337 より m = 1 m = 1 m = 1 で b 2 − b 1 = ( 2 , 5 ) b_2 - b_1 = (2, 5) b 2 − b 1 = ( 2 , 5 ) (長さの 2 乗 29 29 29 )を 得て 入れ替え、 μ = 98 / 29 \mu = 98/29 μ = 98/29 より ( 9 , 16 ) − 3 ( 2 , 5 ) = ( 3 , 1 ) (9, 16) - 3(2, 5) = (3, 1) ( 9 , 16 ) − 3 ( 2 , 5 ) = ( 3 , 1 ) (10 10 10 )を 得て 入れ替え、 μ = 11 / 10 \mu = 11/10 μ = 11/10 より ( 2 , 5 ) − ( 3 , 1 ) = ( − 1 , 4 ) (2, 5) - (3, 1) = (-1, 4) ( 2 , 5 ) − ( 3 , 1 ) = ( − 1 , 4 ) (17 ≥ 10 17 \geq 10 17 ≥ 10 )を 得て 終わる。出力 ( 3 , 1 ) , ( − 1 , 4 ) (3, 1), (-1, 4) ( 3 , 1 ) , ( − 1 , 4 ) は ∣ ⟨ b 1 , b 2 ⟩ ∣ = 1 ≤ 5 \lvert \langle b_1, b_2 \rangle \rvert = 1 \leq 5 ∣⟨ b 1 , b 2 ⟩∣ = 1 ≤ 5 を みたし、定理 7.17 より λ 1 ( L ) = 10 \lambda_1(L) = \sqrt{10} λ 1 ( L ) = 10 。行列式は ∣ 9 ⋅ 21 − 16 ⋅ 11 ∣ = 13 = ∣ 3 ⋅ 4 − 1 ⋅ ( − 1 ) ∣ \lvert 9 \cdot 21 - 16 \cdot 11 \rvert = 13 = \lvert 3 \cdot 4 - 1 \cdot (-1) \rvert ∣ 9 ⋅ 21 − 16 ⋅ 11 ∣ = 13 = ∣ 3 ⋅ 4 − 1 ⋅ ( − 1 )∣ で 一致する。
問題 7.4 ★ ★ q = 17 q = 17 q = 17 , n = 2 n = 2 n = 2 の LWE で、a 1 = ( 1 , 3 ) a_1 = (1, 3) a 1 = ( 1 , 3 ) , a 2 = ( 2 , 7 ) a_2 = (2, 7) a 2 = ( 2 , 7 ) , a 3 = ( 4 , 1 ) a_3 = (4, 1) a 3 = ( 4 , 1 ) , a 4 = ( 3 , 5 ) a_4 = (3, 5) a 4 = ( 3 , 5 ) , ( b 1 , b 2 , b 3 , b 4 ) = ( 5 , 1 , 14 , 3 ) (b_1, b_2, b_3, b_4) = (5, 1, 14, 3) ( b 1 , b 2 , b 3 , b 4 ) = ( 5 , 1 , 14 , 3 ) が 与えられた。誤差は − 1 , 0 , 1 -1, 0, 1 − 1 , 0 , 1 の どれかである。(1) 誤差を 無視して 最初の 2 式から s s s を 求め、3 番目の 式と 矛盾する ことを 確かめよ。(2) 17 2 = 289 17^2 = 289 1 7 2 = 289 通りの s s s を 計算機で 総当たりし、4 つの 式すべてで b i − ⟨ a i , s ⟩ b_i - \langle a_i, s \rangle b i − ⟨ a i , s ⟩ が − 1 , 0 , 1 -1, 0, 1 − 1 , 0 , 1 の どれかと 合同に なる s s s を 求めよ。
解答
(1) 最初の 2 式の 係数行列の 行列式は 1 1 1 で、
( 1 3 2 7 ) − 1 = ( 7 − 3 − 2 1 ) \begin{pmatrix} 1 & 3 \\ 2 & 7 \end{pmatrix}^{-1} = \begin{pmatrix} 7 & -3 \\ -2 & 1 \end{pmatrix} ( 1 2 3 7 ) − 1 = ( 7 − 2 − 3 1 )
なので s ′ = ( 7 ⋅ 5 − 3 ⋅ 1 , − 2 ⋅ 5 + 1 ) ≡ ( 15 , 8 ) s' = (7 \cdot 5 - 3 \cdot 1, -2 \cdot 5 + 1) \equiv (15, 8) s ′ = ( 7 ⋅ 5 − 3 ⋅ 1 , − 2 ⋅ 5 + 1 ) ≡ ( 15 , 8 ) 。3 番目の 式では ⟨ ( 4 , 1 ) , ( 15 , 8 ) ⟩ = 68 ≡ 0 \langle (4, 1), (15, 8) \rangle = 68 \equiv 0 ⟨( 4 , 1 ) , ( 15 , 8 )⟩ = 68 ≡ 0 だが b 3 = 14 ≡ − 3 b_3 = 14 \equiv -3 b 3 = 14 ≡ − 3 で、差が 誤差の 範囲に 入らない。
(2) 条件を みたすのは s = ( 5 , 11 ) s = (5, 11) s = ( 5 , 11 ) だけで、誤差は ( 1 , − 1 , 0 , 1 ) (1, -1, 0, 1) ( 1 , − 1 , 0 , 1 ) である(最初の 3 式だけでは ( 2 , 7 ) (2, 7) ( 2 , 7 ) も 条件を みたす)。 s ′ − s = ( 10 , − 3 ) s' - s = (10, -3) s ′ − s = ( 10 , − 3 ) は 誤差 ( 1 , − 1 ) (1, -1) ( 1 , − 1 ) に 逆行列を 掛けた もので、小さな 誤差が 消去で 拡大されている。 n n n が 数百なら q n q^n q n 通りの 総当たりは 不可能である。
問題 7.5 ★ ★ (ランポートの 1 回署名)H H H を n n n ビットの ハッシュ関数と する。秘密鍵を 2 ℓ 2\ell 2 ℓ 個の ランダムな n n n ビット列 x i , c x_{i,c} x i , c (1 ≤ i ≤ ℓ 1 \leq i \leq \ell 1 ≤ i ≤ ℓ , c ∈ { 0 , 1 } c \in \lbrace 0, 1 \rbrace c ∈ { 0 , 1 } )、公開鍵を y i , c = H ( x i , c ) y_{i,c} = H(x_{i,c}) y i , c = H ( x i , c ) とし、ℓ \ell ℓ ビットの メッセージ m = ( m 1 , … , m ℓ ) m = (m_1, \dots, m_\ell) m = ( m 1 , … , m ℓ ) の 署名を ( x 1 , m 1 , … , x ℓ , m ℓ ) (x_{1,m_1}, \dots, x_{\ell,m_\ell}) ( x 1 , m 1 , … , x ℓ , m ℓ ) と する(検証では 各成分の H H H の 値が y i , m i y_{i,m_i} y i , m i に 等しい ことを 確かめる)。(1) 署名を 一つも 見ていない 攻撃者が 偽造するには 何が 必要か。(2) 同じ鍵で 異なる 2 つの メッセージ m , m ′ m, m' m , m ′ に 署名すると、何通りの メッセージの 署名が 作れるように なるか。
解答
(1) 各 i i i に ついて ランダムな x i , m i x_{i,m_i} x i , m i の 像 y i , m i y_{i,m_i} y i , m i の 原像が 必要で、原像困難性を 破らなければならない。
(2) m i ≠ m i ′ m_i \neq m_i' m i = m i ′ と なる 位置の 個数を d d d (≥ 1 \geq 1 ≥ 1 )と すると、その 位置では x i , 0 , x i , 1 x_{i,0}, x_{i,1} x i , 0 , x i , 1 の 両方が、ほかの 位置では x i , m i x_{i,m_i} x i , m i が 公開されている。よって、ほかの 位置で m m m と 一致し d d d 個の 位置を 自由に 選んだ 2 d 2^d 2 d 通りの メッセージの 署名が 作れ、そのうち 2 d − 2 2^d - 2 2 d − 2 通りが 新しい。この 方式は 1 回しか 使えない。
問題 7.6 ★ (この 結論は 正しいか)「量子計算機が 実現すれば RSA も AES も SHA-256 も 破られるので、すべての 暗号を 格子暗号に 置き換えなければならない」と いう 主張の 誤りを 指摘せよ。
解答
ショアの アルゴリズムで 破られるのは 素因数分解と 離散対数に 基づく 公開鍵暗号(RSA・DH・ECDH・ECDSA・EdDSA など)で、これらは ML-KEM・ML-DSA・SLH-DSA などに 置き換える。AES や SHA-256 に 対しては グローバーの アルゴリズムに よる 2 乗程度の 高速化にと どまり、AES-256 の 鍵の 総当たりも SHA-256 の 原像探索も 量子計算機で 約 2 128 2^{128} 2 128 回の 評価を 要するので、使い続けられる。また 格子暗号は 公開鍵暗号で、データ本体の 暗号化は ML-KEM で 共有した 鍵を 使う AES などが 引き続き担う。署名には ハッシュ関数に 基づく SLH-DSA と いう 選択肢も ある。