Lemma

第7章ハッシュ関数・格子暗号・耐量子暗号

目安 10〜13 時間定理など 16演習 6 問
ここまでの道

この章の目標

  • ハッシュ関数の原像・第 2 原像・衝突に対する困難性の関係を説明し、誕生日攻撃の成功確率の評価を証明できる
  • 長さ拡張攻撃を理解し、HMAC が H(k∥m)H(k \mathbin{\Vert} 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(ハッシュ関数とその安全性, 非形式的)任意の長さ(実際には 2642^{64} ビット未満などの上限がある)のビット列を nn ビットのビット列に写す、効率よく計算できる関数 HH をハッシュ関数 (hash function) といい、H(x)H(x) を xx のハッシュ値という。

  1. 原像困難性 (preimage resistance):ランダムに選んだ xx(たとえば 2n2n ビットの列から一様に)のハッシュ値 y=H(x)y = H(x) だけから、H(x′)=yH(x') = y となる x′x' を求めるのが難しい(x′=xx' = x でなくてよい)。
  2. 第 2 原像困難性 (second-preimage resistance):ランダムに選んだ xx が与えられたとき、x′≠xx' \neq x かつ H(x′)=H(x)H(x') = H(x) となる x′x' を求めるのが難しい。
  3. 衝突困難性 (collision resistance):x≠x′x \neq x' かつ H(x)=H(x′)H(x) = H(x') となる組 (x,x′)(x, x')(衝突, collision)を求めるのが難しい。

入力は出力よりずっと多いので衝突は無数にあり、問題はそれを見つけられるかである(固定した関数には衝突を出力するだけのアルゴリズムが誰も知らなくても存在するので、厳密な定義には鍵つきの関数族を使う。実際のハッシュ関数の安全性は最良の攻撃の計算量で測る)。

命題 7.2(衝突困難なら第 2 原像困難)第 2 原像を確率 ε\varepsilon で求めるアルゴリズム A\mathcal{A} があれば、それを 1 回使って衝突を確率 ε\varepsilon で求められる。

証明. 定義 7.1 の 2 のとおりに xx を選んで A\mathcal{A} に与え、出力 x′x' と組にする。A\mathcal{A} が成功すれば x′≠xx' \neq x かつ H(x′)=H(x)H(x') = H(x) である。□\square

衝突困難性から原像困難性を導くには、関数が十分に圧縮することが要る。

命題 7.3(圧縮する関数では、原像が求まれば衝突が求まる)X,YX, Y を有限集合、H ⁣:X→YH\colon X \to Y とし、一様に選んだ x∈Xx \in X の像 y=H(x)y = H(x) から確率 ε\varepsilon で yy の原像を出力するアルゴリズム A\mathcal{A}(内部の乱数は xx と独立)があるとする。xx を一様に選んで x′=A(H(x))x' = \mathcal{A}(H(x)) とし、x′≠xx' \neq x かつ H(x′)=H(x)H(x') = H(x) なら (x,x′)(x, x') を出力すれば、確率 ε−∣Y∣/∣X∣\varepsilon - \lvert Y \rvert/\lvert X \rvert 以上で衝突が得られる。

証明. y∈H(X)y \in H(X) について cy=∣H−1(y)∣c_y = \lvert H^{-1}(y) \rvert、εy=P(A(y)∈H−1(y))\varepsilon_y = P(\mathcal{A}(y) \in H^{-1}(y)) とする。H(x)=yH(x) = y という条件のもとで xx は H−1(y)H^{-1}(y) 上に一様に分布して A(y)\mathcal{A}(y) と独立なので、A(y)∈H−1(y)\mathcal{A}(y) \in H^{-1}(y) のとき A(y)≠x\mathcal{A}(y) \neq x となる条件付き確率は 1−1/cy1 - 1/c_y である。P(H(x)=y)=cy/∣X∣P(H(x) = y) = c_y/\lvert X \rvert だから、成功確率は

∑y∈H(X)cy∣X∣εy(1−1cy)=∑y∈H(X)cyε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}

である(第 1 項は A\mathcal{A} の成功確率 ε\varepsilon そのもので、εy≤1\varepsilon_y \leq 1, ∣H(X)∣≤∣Y∣\lvert H(X) \rvert \leq \lvert Y \rvert を使った)。□\square

512 ビットを 256 ビットに縮める関数なら ∣Y∣/∣X∣=2−256\lvert Y \rvert/\lvert X \rvert = 2^{-256} で、衝突困難で十分に圧縮する関数は原像困難である。

例 7.4 圧縮しなければこの議論は成り立たない。{0,1}n\lbrace 0, 1 \rbrace^n 上の恒等写像は衝突をもたないので衝突困難だが、yy の原像は yy 自身で、原像困難ではない。

出力が nn ビットなら、値がランダムにふるまうとして、総当たりの手間は原像と第 2 原像が約 2n2^n 回、衝突は次節の誕生日攻撃で約 2n/22^{n/2} 回である。

注意

原像困難性は xx が膨大な候補から一様に選ばれるときの性質である。パスワードのように候補が少なければ、順に HH に通すだけで原像が見つかる(辞書攻撃)。パスワードの保存には、利用者ごとのランダムな値(ソルト)を加え、PBKDF2 や Argon2 のようなわざと計算を重くした専用の関数を使う。

7.2 誕生日攻撃

衝突を探す最も単純な方法は、多くの入力のハッシュ値を計算して一致を探すことである。その成功確率は次の定理で評価できる。

定理 7.5(誕生日の限界, birthday bound)N,kN, k を正の整数とし、Y1,…,YkY_1, \dots, Y_k を、NN 個の元からなる集合の上の一様分布に独立に従う確率変数とする。Yi=YjY_i = Y_j となる i<ji < j が存在する確率を p(k,N)p(k, N) とすると

1−e−k(k−1)/(2N)≤p(k,N)≤k(k−1)2N1 - e^{-k(k-1)/(2N)} \leq p(k, N) \leq \frac{k(k-1)}{2N}

が成り立つ。

証明. 上界:各組 i<ji < j について P(Yi=Yj)=∑yP(Yi=y)P(Yj=y)=1/NP(Y_i = Y_j) = \sum_y P(Y_i = y)P(Y_j = y) = 1/N で、組は k(k−1)/2k(k-1)/2 個あり、和事象の確率は個々の確率の和以下である。下界:k>Nk > N なら鳩の巣原理により p(k,N)=1p(k, N) = 1 なので、k≤Nk \leq N とする。値の並び (Y1,…,Yk)(Y_1, \dots, Y_k) は NkN^k 通りでどれも同じ確率で現れ、値がすべて異なる並びは N(N−1)⋯(N−k+1)N(N - 1)\cdots(N - k + 1) 通りなので

1−p(k,N)=∏i=1k−1(1−iN)≤∏i=1k−1e−i/N=exp⁡(−k(k−1)2N)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)

である。ここで各因子が 00 以上であることと、すべての実数 tt について 1−t≤e−t1 - t \leq e^{-t} であること(e−te^{-t} は下に凸で、t=0t = 0 での接線が 1−t1 - t)を使った。□\square

下界は攻撃の成功確率を保証し、上界からは kk が N\sqrt{N} よりずっと小さければ衝突はまず起きないことがわかる。

系 7.6 k(k−1)≥2Nlog⁡2k(k - 1) \geq 2N\log 2 ならば p(k,N)≥1/2p(k, N) \geq 1/2 である。特に k≥1+1.18Nk \geq 1 + 1.18\sqrt{N} ならば p(k,N)≥1/2p(k, N) \geq 1/2。

証明. 定理 7.5 の下界が 1−e−log⁡2=1/21 - e^{-\log 2} = 1/2 以上になる。k≥1+1.18Nk \geq 1 + 1.18\sqrt{N} なら k(k−1)≥(k−1)2≥1.182N≥2Nlog⁡2k(k - 1) \geq (k - 1)^2 \geq 1.18^2N \geq 2N\log 2(2log⁡2=1.386⋯2\log 2 = 1.386\cdots)である。□\square

例 7.7(誕生日のパラドックス)N=365N = 365, k=23k = 23 では k(k−1)=506≥730log⁡2=505.99⋯k(k - 1) = 506 \geq 730\log 2 = 505.99\cdots なので、誕生日が一様で独立なら、23 人の中に誕生日が同じ 2 人がいる確率は 1/21/2 以上である。実際の値は p(23,365)=0.5073p(23, 365) = 0.5073 である。

値が一様でない同じ分布に独立に従う場合も、衝突の確率は p(k,N)p(k, N) 以上である(概略:値がすべて異なる確率は、各値の確率の kk 次基本対称式 eke_k の k!k! 倍で、二つの確率をその平均で置き換えても eke_k は減らないので、一様分布で最大になる)。よって H ⁣:D→YH\colon D \to Y(∣Y∣=N\lvert Y \rvert = N)が任意の関数でも、x1,…,xk∈Dx_1, \dots, x_k \in D を一様に独立に選べば、xi≠xjx_i \neq x_j かつ H(xi)=H(xj)H(x_i) = H(x_j) となる組がある確率は 1−e−k(k−1)/(2N)−k(k−1)/(2∣D∣)1 - e^{-k(k-1)/(2N)} - k(k-1)/(2\lvert D \rvert) 以上である(最後の項は入力どうしが一致する確率の上界)。この誕生日攻撃 (birthday attack) により、出力が nn ビットなら(DD を十分大きくとって)約 1.18⋅2n/21.18 \cdot 2^{n/2} 回の計算で確率ほぼ 1/21/2 以上で衝突が見つかるので、衝突困難性は高々 n/2n/2 ビットの安全性しかもたず、128 ビットの安全性には 256 ビットの出力が要る(第3章の ρ\rho 法のように記憶をほとんど使わない方法もある)。

7.3 メルクル–ダムガード構成と実際のハッシュ関数

任意の長さの入力を扱うハッシュ関数は、固定長の入力を縮める圧縮関数を繰り返して作ることが多い。

定義 7.8(メルクル–ダムガード構成, Merkle–Damgård construction)f ⁣:{0,1}n×{0,1}b→{0,1}nf\colon \lbrace 0, 1 \rbrace^n \times \lbrace 0, 1 \rbrace^b \to \lbrace 0, 1 \rbrace^n を圧縮関数、IV∈{0,1}n\mathrm{IV} \in \lbrace 0, 1 \rbrace^n を固定の初期値とする。長さ ℓ<264\ell < 2^{64} ビットのメッセージ MM の後ろに、ビット 11、いくつかの 00、ℓ\ell の 64 ビットの 2 進表示を付け加えて長さを bb の倍数にした最短の列を M‾=M∥pad⁡(ℓ)\overline{M} = M \mathbin{\Vert} \operatorname{pad}(\ell) とする(pad⁡(ℓ)\operatorname{pad}(\ell) は ℓ\ell だけで決まる)。M‾\overline{M} を bb ビットずつのブロック m1,…,mLm_1, \dots, m_L に分け、h0=IVh_0 = \mathrm{IV}, hi=f(hi−1,mi)h_i = f(h_{i-1}, m_i) として H(M)=hLH(M) = h_L とする(hih_i を連鎖値という)。

定理 7.9(メルクル, ダムガード, 1989 年)HH の衝突から ff の衝突が効率よく求まる。したがって ff が衝突困難なら HH も衝突困難である。

証明. H(M)=H(M′)H(M) = H(M'), M≠M′M \neq M' とし、M′M' の側の値に ′' をつける。長さが異なれば最後のブロックの末尾 64 ビットが異なるので、f(hL−1,mL)=f(hL′−1′,mL′′)f(h_{L-1}, m_L) = f(h'_{L'-1}, m'_{L'}) が衝突である。長さが等しければ L=L′L = L' で、(hi−1,mi)≠(hi−1′,mi′)(h_{i-1}, m_i) \neq (h'_{i-1}, m'_i) となる最大の ii を i0i_0 とする(mi≠mi′m_i \neq m_i' となる ii があるので存在する)。i0=Li_0 = L なら H(M)=H(M′)H(M) = H(M') から、i0<Li_0 < L なら i0i_0 の最大性から hi0=hi0′h_{i_0} = h'_{i_0} なので、f(hi0−1,mi0)=f(hi0−1′,mi0′)f(h_{i_0-1}, m_{i_0}) = f(h'_{i_0-1}, m'_{i_0}) が衝突である。□\square

命題 7.10(長さ拡張, length extension)メルクル–ダムガード構成の HH について、H(M)H(M) と MM の長さ ℓ\ell だけを知っていれば(MM を知らなくても)、任意のビット列 XX に対して H(M∥pad⁡(ℓ)∥X)H(M \mathbin{\Vert} \operatorname{pad}(\ell) \mathbin{\Vert} X) を計算できる。

証明. M′=M∥pad⁡(ℓ)∥XM' = M \mathbin{\Vert} \operatorname{pad}(\ell) \mathbin{\Vert} X の長さ ℓ′\ell' は ℓ\ell と XX から求まり、M′‾=M‾∥X∥pad⁡(ℓ′)\overline{M'} = \overline{M} \mathbin{\Vert} X \mathbin{\Vert} \operatorname{pad}(\ell') である。M‾\overline{M} の長さは bb の倍数なので、最初の LL ブロックまでの連鎖値は hL=H(M)h_L = H(M) で、残りのブロックを hLh_L から順に ff で処理すれば H(M′)H(M') が得られる。□\square

実際のハッシュ関数 米国の規格 FIPS 180-4 の SHA-2(SHA-256・SHA-512 など。数字は出力のビット数)はメルクル–ダムガード構成で(SHA-256 では n=256n = 256, b=512b = 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 京回(ほぼ 2632^{63} 回)で、誕生日攻撃の約 2802^{80} 回よりはるかに少ない)。衝突が見つかった関数を、署名や証明書のように衝突困難性に依存する用途に使い続けてはいけない。

7.4 メッセージ認証符号と HMAC

ハッシュ値で改ざんを検出できるのは、正しいハッシュ値が別の安全な経路で届く場合だけである。秘密鍵 kk を共有する 2 者は、メッセージ認証符号 (message authentication code, MAC) のタグ t=MAC⁡k(m)t = \operatorname{MAC}_k(m) を添えて送り、受信者は同じ計算をして一致を確かめる。安全性の定義は署名の EUF-CMA(第2章 2.10 節)と同じで、鍵を知らない攻撃者は、好きなメッセージのタグを教えてもらえても、新しいメッセージの正しいタグを作れないことである。

素朴な MAC⁡k(m)=H(k∥m)\operatorname{MAC}_k(m) = H(k \mathbin{\Vert} m) は、HH がメルクル–ダムガード構成なら安全でない。タグ t=H(k∥m)t = H(k \mathbin{\Vert} m) を一つ見た攻撃者は、kk の長ささえわかれば、命題 7.10 により任意の XX について m∥pad⁡(ℓ)∥Xm \mathbin{\Vert} \operatorname{pad}(\ell) \mathbin{\Vert} X(ℓ\ell は k∥mk \mathbin{\Vert} m の長さ)の正しいタグを計算できる。

定義 7.11(HMAC)HH をブロック長 bb ビットのハッシュ関数とし、鍵 kk の後ろに 00 を付けて bb ビットにしたものを k′k' とする(kk が bb ビットより長ければ先に H(k)H(k) に置き換える)。

HMAC⁡k(m)=H((k′⊕opad)∥H((k′⊕ipad)∥m))\operatorname{HMAC}_k(m) = H\bigl((k' \oplus \mathrm{opad}) \mathbin{\Vert} H((k' \oplus \mathrm{ipad}) \mathbin{\Vert} m)\bigr)

とおく。ipad\mathrm{ipad}, opad\mathrm{opad} はそれぞれバイト 0x36, 0x5c を b/8b/8 個並べた定数である(RFC 2104、FIPS 198-1)。

HMAC では内側のハッシュ値は表に出ず、外側を長さ拡張しても、正しいタグの外側の入力はいつも「bb ビットの鍵と nn ビットのハッシュ値」という決まった長さなので、どのメッセージのタグにもならない。HMAC の安全性は圧縮関数についての仮定のもとで証明されている(ベラーレ・カネッティ・クラフチック 1996 年。ベラーレ 2006 年は、圧縮関数が擬似ランダム関数(鍵を知らない者にはランダムな関数と見分けがつかない関数)であるという種類の、衝突困難性を含まない仮定から証明した。主張のみ)。そのため SHA-1 の衝突が HMAC-SHA1 を直ちに破るわけではないが、新しい設計では HMAC-SHA256 以上を実績のあるライブラリで使う(H(k∥m)H(k \mathbin{\Vert} m) のような自作の構成は、Web API のリクエスト署名などで実際に長さ拡張攻撃を受けてきた。問題 7.2)。

7.5 格子と格子問題

格子は、実ベクトルの整数係数の一次結合だけを考える「整数版の線形代数」である。

定義 7.12(格子・基底・行列式)b1,…,bn∈Rnb_1, \dots, b_n \in \mathbb{R}^n を一次独立とする。L=Zb1+⋯+ZbnL = \mathbb{Z}b_1 + \cdots + \mathbb{Z}b_n(bib_i の整数係数の一次結合の全体)を b1,…,bnb_1, \dots, b_n で生成される格子 (lattice)、(b1,…,bn)(b_1, \dots, b_n) をその基底という。基底を列に並べた行列を B=(b1 ⋯ bn)B = (b_1 \ \cdots \ b_n) とし、det⁡L=∣det⁡B∣\det L = \lvert \det B \rvert を LL の行列式 (determinant) という。

これは15-algebraic-number-theory 第3章の定義 3.1 の格子と同じで(行列式はそこでの余体積)、det⁡L\det L は平行体 {∑itibi∣0≤ti<1}\lbrace \sum_i t_ib_i \mid 0 \leq t_i < 1 \rbrace の体積である。

定理 7.13(行列式は基底によらない)(b1,…,bn)(b_1, \dots, b_n) と (b1′,…,bn′)(b_1', \dots, b_n') が同じ格子 LL の基底ならば、B′=BUB' = BU をみたす整数行列 UU で det⁡U=±1\det U = \pm 1 となるものがある。特に ∣det⁡B′∣=∣det⁡B∣\lvert \det B' \rvert = \lvert \det B \rvert で、det⁡L\det L は基底の取り方によらない。

証明. 各 bj′b_j' は LL の元なので bj′=∑iuijbib_j' = \sum_i u_{ij}b_i(uij∈Zu_{ij} \in \mathbb{Z})と書け、U=(uij)U = (u_{ij}) とおけば B′=BUB' = BU。同様に B=B′VB = B'V となる整数行列 VV がある。B=BUVB = BUV で BB は正則なので UV=IUV = I。積公式(02-linear-algebra 第4章 定理 4.19)より det⁡Udet⁡V=1\det U \det V = 1 で、どちらも整数なので det⁡U=±1\det U = \pm 1 である。□\square

格子の計算では、グラム–シュミットの直交化(02-linear-algebra 第7章 定理 7.9 の wjw_j)を正規化せずに使う。

b1∗=b1,bi∗=bi−∑j<iμijbj∗,μij=⟨bi,bj∗⟩⟨bj∗,bj∗⟩(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)

b1∗,…,bn∗b_1^{\ast}, \dots, b_n^{\ast} は互いに直交し、b1∗,…,bi∗b_1^{\ast}, \dots, b_i^{\ast} は b1,…,bib_1, \dots, b_i と同じ部分空間を張る(bi∗b_i^{\ast} は一般に格子の元ではない)。

命題 7.14 格子 LL の基底 (b1,…,bn)(b_1, \dots, b_n) について、

  1. det⁡L=∏i=1n∥bi∗∥\det L = \prod_{i=1}^{n} \lVert b_i^{\ast} \rVert。
  2. 00 でない v∈Lv \in L はすべて ∥v∥≥min⁡i∥bi∗∥\lVert v \rVert \geq \min_i \lVert b_i^{\ast} \rVert をみたす。

証明. (1) B=B∗TB = B^{\ast}T(B∗=(b1∗ ⋯ bn∗)B^{\ast} = (b_1^{\ast} \ \cdots \ b_n^{\ast})、TT は対角成分が 11 の上三角行列)なので det⁡B=det⁡B∗\det B = \det B^{\ast}。B∗B^{\ast} の列を正規化した直交行列 QQ について B∗=Qdiag⁡(∥b1∗∥,…,∥bn∗∥)B^{\ast} = Q\operatorname{diag}(\lVert b_1^{\ast} \rVert, \dots, \lVert b_n^{\ast} \rVert) で、det⁡Q=±1\det Q = \pm 1 である。(2) v=∑iaibiv = \sum_i a_ib_i(ai∈Za_i \in \mathbb{Z})で aj≠0a_j \neq 0 となる最大の jj をとる。i<ji < j の bib_i は bj∗b_j^{\ast} と直交し、⟨bj,bj∗⟩=∥bj∗∥2\langle b_j, b_j^{\ast} \rangle = \lVert b_j^{\ast} \rVert^2 なので ⟨v,bj∗⟩=aj∥bj∗∥2\langle v, b_j^{\ast} \rangle = a_j\lVert b_j^{\ast} \rVert^2。コーシー–シュワルツの不等式より ∣aj∣∥bj∗∥2≤∥v∥∥bj∗∥\lvert a_j \rvert \lVert b_j^{\ast} \rVert^2 \leq \lVert v \rVert \lVert b_j^{\ast} \rVert で、∣aj∣≥1\lvert a_j \rvert \geq 1 だから ∥v∥≥∥bj∗∥\lVert v \rVert \geq \lVert b_j^{\ast} \rVert。□\square

格子点 v=Bav = Ba の係数 a=B−1v∈Zna = B^{-1}v \in \mathbb{Z}^n は vv の一次式なので、長さが一定以下の格子点は有限個しかない。よって 00 でない格子点の長さの最小値 λ1(L)\lambda_1(L) が存在する。

定義 7.15(格子問題)基底が与えられたとき、∥v∥=λ1(L)\lVert v \rVert = \lambda_1(L) となる v∈Lv \in L を求める問題を最短ベクトル問題 (SVP)、0<∥v∥≤γλ1(L)0 < \lVert v \rVert \leq \gamma\lambda_1(L) となる v∈Lv \in L を求める問題を γ\gamma-近似 SVP という。基底と点 t∈Rnt \in \mathbb{R}^n から ∥t−v∥\lVert t - v \rVert が最小の v∈Lv \in L を求める問題を最近ベクトル問題 (CVP) という。

定理 7.16(ミンコフスキー)L⊂RnL \subset \mathbb{R}^n を格子とすると、λ1(L)≤n(det⁡L)1/n\lambda_1(L) \leq \sqrt{n}(\det L)^{1/n} である。

証明. ミンコフスキーの凸体定理(15-algebraic-number-theory 第3章 定理 3.4。主張だけを使う)によれば、原点対称なコンパクト凸集合 XX が vol⁡(X)≥2ndet⁡L\operatorname{vol}(X) \geq 2^n\det L をみたせば、XX は LL の 00 でない点を含む。r=(det⁡L)1/nr = (\det L)^{1/n} として X=[−r,r]nX = [-r, r]^n に適用すると、各座標の絶対値が rr 以下の 0≠v∈L0 \neq v \in L があり、∥v∥≤nr\lVert v \rVert \leq \sqrt{n}r である。□\square

SVP と CVP を厳密に解く問題は NP 困難である(CVP はファン・エムデ・ボアス, 1981 年。SVP は乱択帰着のもとでアイタイ, 1998 年。主張のみ)。暗号の根拠になる、近似倍率 γ\gamma が nn の多項式程度の近似 SVP は、NP 困難かどうかは知られていないが、古典・量子のどちらでも知られている最良のアルゴリズムは nn について指数時間かかる。

7.6 2 次元のガウス簡約

2 次元では、ユークリッドの互除法と同じ考え方で最短ベクトルが求まる(ラグランジュとガウスによる二元二次形式の簡約理論にさかのぼる)。基底 (b1,b2)(b_1, b_2) が

∥b1∥≤∥b2∥,∣⟨b1,b2⟩∣≤12∥b1∥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

をみたすとき、簡約されているという。

ガウス簡約(Gauss reduction) 入力は R2\mathbb{R}^2 の一次独立なベクトル b1,b2b_1, b_2 とする。

  1. ∥b1∥>∥b2∥\lVert b_1 \rVert > \lVert b_2 \rVert なら b1b_1 と b2b_2 を入れ替える。
  2. μ=⟨b1,b2⟩/∥b1∥2\mu = \langle b_1, b_2 \rangle/\lVert b_1 \rVert^2 とする。∣μ∣≤1/2\lvert \mu \rvert \leq 1/2 なら (b1,b2)(b_1, b_2) を出力して終わる。
  3. μ\mu に最も近い整数を mm とし、b2←b2−mb1b_2 \leftarrow b_2 - mb_1 とする(割り算の余りにあたる)。
  4. ∥b2∥≥∥b1∥\lVert b_2 \rVert \geq \lVert b_1 \rVert なら (b1,b2)(b_1, b_2) を出力して終わる。そうでなければ b1b_1 と b2b_2 を入れ替えて 2 に戻る。

定理 7.17(ガウス簡約)

  1. ガウス簡約は有限回の操作で終わり、出力は入力と同じ格子 LL の簡約された基底である。
  2. 格子 LL の基底 (b1,b2)(b_1, b_2) が簡約されていれば ∥b1∥=λ1(L)\lVert b_1 \rVert = \lambda_1(L) であり、b1b_1 と一次独立な v∈Lv \in L はすべて ∥v∥≥∥b2∥\lVert v \rVert \geq \lVert b_2 \rVert をみたす。

証明. (1) 入れ替えと b2←b2−mb1b_2 \leftarrow b_2 - mb_1 は、逆の操作(入れ替えと b2←b2+mb1b_2 \leftarrow b_2 + mb_1)も整数係数なので、生成する格子を変えない。2 に来るたびに ∥b1∥≤∥b2∥\lVert b_1 \rVert \leq \lVert b_2 \rVert が成り立つ(最初は 1 により、2 回目以降は 4 の入れ替えによる)ので、2 で終われば簡約されている。3 のあとでは ∣⟨b1,b2−mb1⟩∣=∣μ−m∣∥b1∥2≤12∥b1∥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 なので、4 で終わっても簡約されている。4 で入れ替えて 2 に戻るとき、新しい b1b_1 は古い b1b_1 より真に短い 00 でない格子点である。長さが最初の ∥b1∥\lVert b_1 \rVert 以下の格子点は有限個なので、入れ替えは有限回しか起こらない。

(2) v=a1b1+a2b2≠0v = a_1b_1 + a_2b_2 \neq 0(a1,a2∈Za_1, a_2 \in \mathbb{Z})とすると、簡約されていることから

∥v∥2=a12∥b1∥2+2a1a2⟨b1,b2⟩+a22∥b2∥2≥(a12−∣a1a2∣)∥b1∥2+a22∥b2∥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

である。a2=0a_2 = 0 なら ∥v∥=∣a1∣∥b1∥≥∥b1∥\lVert v \rVert = \lvert a_1 \rvert \lVert b_1 \rVert \geq \lVert b_1 \rVert。a2≠0a_2 \neq 0(vv が b1b_1 と一次独立)のとき、∣a1∣≥∣a2∣\lvert a_1 \rvert \geq \lvert a_2 \rvert なら第 1 項は 00 以上なので ∥v∥2≥a22∥b2∥2≥∥b2∥2\lVert v \rVert^2 \geq a_2^2\lVert b_2 \rVert^2 \geq \lVert b_2 \rVert^2。∣a1∣<∣a2∣\lvert a_1 \rvert < \lvert a_2 \rvert なら第 1 項の係数は 00 以下なので、∥b1∥≤∥b2∥\lVert b_1 \rVert \leq \lVert b_2 \rVert を使って

∥v∥2≥(a12−∣a1a2∣+a22)∥b2∥2≥∣a2∣(∣a2∣−∣a1∣)∥b2∥2≥∥b2∥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∥≥∥b1∥\lVert v \rVert \geq \lVert b_1 \rVert がつねに成り立ち、a2≠0a_2 \neq 0 なら ∥v∥≥∥b2∥\lVert v \rVert \geq \lVert b_2 \rVert である。□\square

例 7.18 b1=(42,29)b_1 = (42, 29), b2=(55,37)b_2 = (55, 37) で生成される格子 LL(det⁡L=41\det L = 41)を簡約すると、m=1,3,2m = 1, 3, 2 の引き算で (13,8)(13, 8), (3,5)(3, 5), (7,−2)(7, -2) が順に現れ、簡約された基底 (3,5),(7,−2)(3, 5), (7, -2)(内積は 11≤34/211 \leq 34/2)が得られる。定理 7.17 より λ1(L)=34\lambda_1(L) = \sqrt{34} で、行列式は ∣3⋅(−2)−5⋅7∣=41\lvert 3 \cdot (-2) - 5 \cdot 7 \rvert = 41 のまま、ほとんど平行だった入力(なす角は約 0.70.7 度)が直交に近い基底(約 7575 度)に変わる。

7.7 LLL アルゴリズム

次元 nn が大きいとき、nn の多項式時間で最短ベクトルを求める方法は知られていない。1982 年にレンストラ・レンストラ・ロヴァースは、有理数係数の多項式の因数分解のために、最短ベクトルを指数的な近似倍率で求める多項式時間のアルゴリズムを与えた。

定義 7.19(LLL 簡約, LLL-reduced)1/4<δ<11/4 < \delta < 1 とする。格子の基底 (b1,…,bn)(b_1, \dots, b_n) が次の 2 条件をみたすとき、δ\delta について LLL 簡約されているという(原論文では δ=3/4\delta = 3/4)。

  1. (サイズ簡約)すべての j<ij < i について ∣μij∣≤1/2\lvert \mu_{ij} \rvert \leq 1/2。
  2. (ロヴァースの条件)すべての 2≤i≤n2 \leq i \leq n について ∥bi∗∥2≥(δ−μi,i−12)∥bi−1∗∥2\lVert b_i^{\ast} \rVert^2 \geq (\delta - \mu_{i,i-1}^2)\lVert b_{i-1}^{\ast} \rVert^2。

ロヴァースの条件は ∥bi∗+μi,i−1bi−1∗∥2≥δ∥bi−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 と同値で(bi∗⊥bi−1∗b_i^{\ast} \perp b_{i-1}^{\ast})、左辺は bi−1b_{i-1} と bib_i を入れ替えたときの新しい bi−1∗b_{i-1}^{\ast} の長さの 2 乗である(n=2n = 2, δ=1\delta = 1 なら 7.6 節の「簡約されている」になる)。

定理 7.20(LLL 簡約基底の性質)(b1,…,bn)(b_1, \dots, b_n) を格子 LL の、δ=3/4\delta = 3/4 について LLL 簡約された基底とすると、

∥b1∥≤2(n−1)/2λ1(L),∥b1∥≤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}

が成り立つ。一般の δ\delta については、α=1/(δ−1/4)\alpha = 1/(\delta - 1/4) とおき、二つの不等式の 22 を α\alpha に置き換えたものが成り立つ(δ=3/4\delta = 3/4 なら α=2\alpha = 2)。

証明. サイズ簡約より μi,i−12≤1/4\mu_{i,i-1}^2 \leq 1/4 なので、ロヴァースの条件から ∥bi∗∥2≥(δ−1/4)∥bi−1∗∥2=∥bi−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 で、繰り返すと ∥b1∥2=∥b1∗∥2≤αi−1∥bi∗∥2\lVert b_1 \rVert^2 = \lVert b_1^{\ast} \rVert^2 \leq \alpha^{i-1}\lVert b_i^{\ast} \rVert^2(1≤i≤n1 \leq i \leq n)。α>1\alpha > 1 なので ∥bi∗∥≥α−(n−1)/2∥b1∥\lVert b_i^{\ast} \rVert \geq \alpha^{-(n-1)/2}\lVert b_1 \rVert がすべての ii で成り立ち、命題 7.14 (2) より λ1(L)≥α−(n−1)/2∥b1∥\lambda_1(L) \geq \alpha^{-(n-1)/2}\lVert b_1 \rVert。また i=1,…,ni = 1, \dots, n について掛け合わせると、命題 7.14 (1) より ∥b1∥2n≤αn(n−1)/2(det⁡L)2\lVert b_1 \rVert^{2n} \leq \alpha^{n(n-1)/2}(\det L)^2。□\square

LLL アルゴリズム 入力は基底 b1,…,bnb_1, \dots, b_n と δ\delta。k=2k = 2 とし、k≤nk \leq n の間、次を繰り返して、k=n+1k = n + 1 になったら (b1,…,bn)(b_1, \dots, b_n) を出力する。

  1. (サイズ簡約)j=k−1,…,1j = k - 1, \dots, 1 の順に、μkj\mu_{kj} に最も近い整数 mm をとって bk←bk−mbjb_k \leftarrow b_k - mb_j とする(bk∗b_k^{\ast} と μkl\mu_{kl}(l>jl > j)は変わらず、μkj\mu_{kj} は mm だけ減るので、終わると ∣μkj∣≤1/2\lvert \mu_{kj} \rvert \leq 1/2 となる)。
  2. ロヴァースの条件 ∥bk∗∥2≥(δ−μk,k−12)∥bk−1∗∥2\lVert b_k^{\ast} \rVert^2 \geq (\delta - \mu_{k,k-1}^2)\lVert b_{k-1}^{\ast} \rVert^2 が成り立てば k←k+1k \leftarrow k + 1、成り立たなければ bk−1b_{k-1} と bkb_k を入れ替えて k←max⁡(k−1,2)k \leftarrow \max(k - 1, 2) とする。

各段階の始めに b1,…,bk−1b_1, \dots, b_{k-1} が LLL 簡約されていること(帰納的に確かめられる)から、出力は LLL 簡約された基底である。

定理 7.21(LLL アルゴリズムの計算量。主張)成分が整数の基底を入力すると、δ=3/4\delta = 3/4 の LLL アルゴリズムは nn と log⁡max⁡i∥bi∥\log \max_i \lVert b_i \rVert の多項式時間で終わる。

証明の要点は、b1,…,bib_1, \dots, b_i の内積を並べた行列の行列式 di=∏j≤i∥bj∗∥2d_i = \prod_{j \leq i}\lVert b_j^{\ast} \rVert^2(正の整数)の積が、サイズ簡約では変わらず、入れ替えのたびに δ\delta 倍未満になることである(詳細は Hoffstein–Pipher–Silverman)。実際の LLL は定理 7.20 の評価よりずっと短いベクトルを出力することが多い。小さなブロックごとに最短ベクトルを求める BKZ はより良い近似を与えるが、ブロックを大きくすると計算時間が指数的に増える。格子暗号の安全性の見積もりはこの計算量に基づく。

7.8 格子簡約による攻撃

部分和問題(ナップサック問題)は、正の整数 a1,…,ana_1, \dots, a_n と SS から ∑ixiai=S\sum_i x_ia_i = S となる x∈{0,1}nx \in \lbrace 0, 1 \rbrace^n を求める問題で、一般には NP 困難である。これを使う暗号が公開鍵暗号の最初期に提案された。

例 7.22(メルクル–ヘルマン暗号, 1978 年)秘密の列 r=(3,5,11,20,41,83,167,331)r = (3, 5, 11, 20, 41, 83, 167, 331) は、各項がそれより前の項の和より大きい(超増加列)。M=673>∑iri=661M = 673 > \sum_i r_i = 661 と、gcd⁡(W,M)=1\gcd(W, M) = 1 となる W=113W = 113 も秘密にし、ai=Wri mod Ma_i = Wr_i \bmod M を公開鍵とする: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) の暗号文は S=∑ixiai=1807S = \sum_i x_ia_i = 1807 である。正規の受信者は 113−1≡405(mod673)113^{-1} \equiv 405 \pmod{673} を使って 405⋅1807≡284≡∑ixiri405 \cdot 1807 \equiv 284 \equiv \sum_i x_ir_i を得る。0≤∑ixiri≤6610 \leq \sum_i x_ir_i \leq 661 なので 284=∑ixiri284 = \sum_i x_ir_i で、大きい項から貪欲に引けば xx が決まる(284=167+83+20+11+3284 = 167 + 83 + 20 + 11 + 3)。

攻撃者は W,MW, M を知らないが、格子で xx を求められる。Rn+1\mathbb{R}^{n+1} のベクトル

bi=(2ei,Nai)(i=1,…,n),bn+1=(1,…,1,NS)b_i = (2e_i, Na_i) \quad (i = 1, \dots, n), \qquad b_{n+1} = (1, \dots, 1, NS)

(eie_i は Rn\mathbb{R}^n の第 ii 単位ベクトル、NN は正の整数)で生成される格子を考える(2S≠∑iai2S \neq \sum_i a_i なら一次独立)。∑ixibi−bn+1=(2x1−1,…,2xn−1,0)\sum_i x_ib_i - b_{n+1} = (2x_1 - 1, \dots, 2x_n - 1, 0) は成分がすべて ±1\pm 1 の長さ n\sqrt{n} の格子点である。一方、最後の成分が 00 でない格子点は、その成分が NN の 00 でない整数倍なので長さ NN 以上である。N>nN > \sqrt{n} にとれば、短い格子点は最後の成分が 00 のものに限られ、±(2x−1,0)\pm(2x - 1, 0) が LLL で見つかることが期待できる。実際、N=10N = 10 としてこの 9 次元の格子を LLL アルゴリズム(δ=3/4\delta = 3/4、有理数で厳密に計算)で簡約すると、最初のベクトルは (−1,1,−1,−1,1,−1,−1,1,0)=−(2x−1,0)(-1, 1, -1, -1, 1, -1, -1, 1, 0) = -(2x - 1, 0) となり、秘密鍵なしに平文が復元される(計算機で確かめた。この公開鍵では 256 通りの平文すべてで復元できる)。定理 7.20 の保証は ∥b1∥≤24λ1(L)\lVert b_1 \rVert \leq 2^4\lambda_1(L) までだが、実際には最短ベクトル(長さ 8\sqrt{8})が見つかっている。シャミアは 1982 年に基本的なメルクル–ヘルマン暗号を多項式時間で破り、その後、格子簡約は多くのナップサック型の暗号を破った。上の格子では、密度 n/log⁡2max⁡iain/\log_2 \max_i a_i が約 0.94080.9408 未満のほとんどすべての部分和問題が、最短ベクトルを求めるオラクルで解けることも証明されている(コスター・ジュー・ラマッキア・オドリズコ・シュノア・スターン, 1992 年。主張のみ。例 7.22 の密度は約 0.860.86)。最悪の場合に難しい問題でも、暗号が実際に生成する問題が難しいとは限らない。

偏ったナンス 第4章の ECDSA の署名 s=k−1(z+rd) mod ns = k^{-1}(z + rd) \bmod n から、ナンスは秘密鍵 dd の既知の一次式 ki≡tid+ui(modn)k_i \equiv t_id + u_i \pmod{n}(ti=si−1rit_i = s_i^{-1}r_i, ui=si−1ziu_i = s_i^{-1}z_i)で表せる。ナンスがいつも 0≤ki<K0 \leq k_i < K(上位 ℓ\ell ビットが 00 なら KK は n/2ℓn/2^{\ell} 程度)をみたすなら、neine_i(i=1,…,mi = 1, \dots, m), (t1,…,tm,K/n,0)(t_1, \dots, t_m, K/n, 0), (u1,…,um,0,K)(u_1, \dots, u_m, 0, K) で生成される格子は、成分の絶対値がすべて KK 以下の点 (k1,…,km,dK/n,K)(k_1, \dots, k_m, dK/n, K) を含み、これを LLL などで見つければ dd が求まる(第4章の隠れた数の問題。必要な ℓ\ell と署名の数 mm はヒューリスティックな見積もりになる)。

7.9 LWE 問題とレゲフの暗号方式

連立一次方程式は消去法で解けるが、右辺に小さな誤差を加えるだけで急に難しくなる。消去の過程で誤差も拡大されるからである(問題 7.4)。以下、a,s∈(Z/qZ)na, s \in (\mathbb{Z}/q\mathbb{Z})^n について ⟨a,s⟩=∑jajsj∈Z/qZ\langle a, s \rangle = \sum_j a_js_j \in \mathbb{Z}/q\mathbb{Z} とする。

定義 7.23(LWE 問題, learning with errors)n,m,q≥2n, m, q \geq 2 を整数、χ\chi を絶対値の小さい整数の上の確率分布(誤差分布)とする。秘密 s∈(Z/qZ)ns \in (\mathbb{Z}/q\mathbb{Z})^n を一様に選び、i=1,…,mi = 1, \dots, m について ai∈(Z/qZ)na_i \in (\mathbb{Z}/q\mathbb{Z})^n を一様に、eie_i を χ\chi に従って(すべて独立に)選び、bi=⟨ai,s⟩+eib_i = \langle a_i, s \rangle + e_i とする。組 (ai,bi)i=1m(a_i, b_i)_{i=1}^{m} から ss を求める問題を探索 LWE、この組と bib_i を Z/qZ\mathbb{Z}/q\mathbb{Z} から一様に選び直した組とを見分ける問題を判定 LWE という。

誤差分布には、正規分布を整数に離散化した離散ガウス分布や、{−η,…,η}\lbrace -\eta, \dots, \eta \rbrace に値をとる二項分布(ML-KEM が使う)などを使う。ある xx について yi≡⟨ai,x⟩(modq)y_i \equiv \langle a_i, x \rangle \pmod{q}(すべての ii)となる y∈Zmy \in \mathbb{Z}^m の全体は格子で、(bi)i(b_i)_i はその格子点 (⟨ai,s⟩)i(\langle a_i, s \rangle)_i から誤差だけずれた点だから、探索 LWE は CVP の特別な場合である。

定理 7.24(レゲフ, 2005 年。主張)qq を nn の多項式程度の大きさの素数とし、誤差分布を標準偏差が n\sqrt{n} 程度以上の離散ガウス分布とする。LWE を平均的に(無視できない確率で)解く効率的なアルゴリズムがあれば、nn 次元の任意の格子について、近似倍率が nn の多項式程度の近似 SVP(の変種)を解く効率的な量子アルゴリズムが存在する。

ナップサック暗号とは対照的に、ランダムな LWE は最悪の場合の格子問題より(量子計算機にとって)易しくはない。ただし規格のパラメータは、この帰着ではなく BKZ などの最良の攻撃の計算量から決められている。

定義 7.25(レゲフの暗号方式) パラメータ n,m,q,χn, m, q, \chi を定める。

  • 鍵生成:秘密鍵は s∈(Z/qZ)ns \in (\mathbb{Z}/q\mathbb{Z})^n、公開鍵は LWE の組 (ai,bi)i=1m(a_i, b_i)_{i=1}^{m}(bi=⟨ai,s⟩+eib_i = \langle a_i, s \rangle + e_i)。
  • 暗号化(平文 μ∈{0,1}\mu \in \lbrace 0, 1 \rbrace):{1,…,m}\lbrace 1, \dots, m \rbrace の部分集合 SS を一様に選び、u=∑i∈Saiu = \sum_{i \in S} a_i, v=∑i∈Sbi+μ⌊q/2⌋v = \sum_{i \in S} b_i + \mu\lfloor q/2 \rfloor として、(u,v)(u, v) を暗号文とする。
  • 復号:w=v−⟨u,s⟩w = v - \langle u, s \rangle の代表 w′w' を −q/2<w′≤q/2-q/2 < w' \leq q/2 の範囲にとり、∣w′∣<q/4\lvert w' \rvert < q/4 なら 00、そうでなければ 11 を出力する。

定理 7.26(復号の正しさ)誤差 eie_i を整数とみて E=∑i∈SeiE = \sum_{i \in S} e_i とおく。∣E∣<⌊q/2⌋/2\lvert E \rvert < \lfloor q/2 \rfloor/2 ならば、復号の出力は μ\mu に一致する。特に qq が偶数なら、誤差の総和の絶対値が q/4q/4 未満であれば正しく復号される。

証明. h=⌊q/2⌋h = \lfloor q/2 \rfloor とおく。bi−⟨ai,s⟩=eib_i - \langle a_i, s \rangle = e_i なので、Z/qZ\mathbb{Z}/q\mathbb{Z} で w=∑i∈S(bi−⟨ai,s⟩)+μh=E+μhw = \sum_{i \in S}(b_i - \langle a_i, s \rangle) + \mu h = E + \mu h である。整数 xx に対し、xx と法 qq で合同な整数の絶対値の最小値を ∣x∣q\lvert x \rvert_q と書く(−q/2<x′≤q/2-q/2 < x' \leq q/2 となる代表 x′x' について ∣x∣q=∣x′∣\lvert x \rvert_q = \lvert x' \rvert)。∣x+y∣q≤∣x∣q+∣y∣q\lvert x + y \rvert_q \leq \lvert x \rvert_q + \lvert y \rvert_q, ∣x∣q≤∣x∣\lvert x \rvert_q \leq \lvert x \rvert であり、0≤h≤q/20 \leq h \leq q/2 より ∣h∣q=h\lvert h \rvert_q = h である。

μ=0\mu = 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 なので 00 が出力される。μ=1\mu = 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 である。qq が偶数なら h/2=q/4h/2 = q/4 なので ∣w′∣>q/4\lvert w' \rvert > q/4。qq が奇数なら h/2=(q−1)/4h/2 = (q - 1)/4 なので 4∣w′∣>q−14\lvert w' \rvert > q - 1 で、4∣w′∣4\lvert w' \rvert は整数だから 4∣w′∣≥q4\lvert w' \rvert \geq q。いずれも ∣w′∣≥q/4\lvert w' \rvert \geq q/4 で、11 が出力される。□\square

注意 7.27 条件 ∣E∣<⌊q/2⌋/2\lvert E \rvert < \lfloor q/2 \rfloor/2 はレゲフの原論文の補題と同じで、q≡1(mod4)q \equiv 1 \pmod{4} では ∣E∣<q/4\lvert E \rvert < q/4 に緩められない(q=13q = 13, μ=1\mu = 1, E=−3E = -3 なら w′=3<13/4w' = 3 < 13/4 で 00 と復号される)。q=4t+1q = 4t + 1 では ∣E∣<q/4\lvert E \rvert < q/4 をみたす整数 EE が 2t+12t + 1 個あり、2(2t+1)>q2(2t + 1) > q だから平文 00 と 11 から生じうる ww の集合が交わるので、どんな復号規則でも誤りうる。

パラメータの関係 誤差の絶対値がつねに BB 以下なら ∣E∣≤mB\lvert E \rvert \leq mB なので、mB<⌊q/2⌋/2mB < \lfloor q/2 \rfloor/2 ならつねに正しく復号できる。誤差が離散ガウス分布などなら、EE は独立な小さい数の和として 00 の近くに集中し、誤差の標準偏差 σ\sigma について q/4q/4 が σm/2\sigma\sqrt{m/2} より十分大きければ誤る確率はきわめて小さい。一方、安全性のために σ\sigma は小さくしすぎられない(定理 7.24 では n\sqrt{n} 程度以上)ので、qq は nn の多項式の大きさにとる(レゲフの原論文では n2n^2 と 2n22n^2 の間の素数)。また定数 ε>0\varepsilon > 0 について m≥(1+ε)(n+1)log⁡2qm \geq (1 + \varepsilon)(n + 1)\log_2 q なら、判定 LWE が難しいという仮定のもとでこの方式は IND-CPA 安全(第2章 2.10 節)であることが、(u,v)(u, v) がほぼ一様に分布することを示す残余ハッシュ補題を使って証明されている(主張のみ)。

例 7.28 n=4n = 4, q=97q = 97, m=20m = 20 で誤差が {−1,0,1}\lbrace -1, 0, 1 \rbrace に値をとるなら、∣E∣≤20<⌊97/2⌋/2=24\lvert E \rvert \leq 20 < \lfloor 97/2 \rfloor/2 = 24 なので復号はつねに正しい。ただし 974≈8.9×10797^4 \approx 8.9 \times 10^7 通りの ss の総当たりで破れるので、実用の方式では次元を数百以上にする。

7.10 加群 LWE と ML-KEM

レゲフの方式は公開鍵が m(n+1)m(n + 1) 個、1 ビットの暗号文が n+1n + 1 個の元からなり、効率が悪い。実用の方式は多項式環の構造を使う。nn を 2 のべきとし、

Rq=(Z/qZ)[x]/(xn+1)R_q = (\mathbb{Z}/q\mathbb{Z})[x]/(x^n + 1)

とおく(積は xn=−1x^n = -1 として計算する。FIPS 203 はこの環を Zq[X]/(Xn+1)\mathbb{Z}_q[X]/(X^n + 1) と書くが、本教材の Zq\mathbb{Z}_q は qq 進整数環なので使わない)。a∈Rqa \in R_q を掛ける写像は係数ベクトルの上の nn 次正方行列なので、RqR_q の一つの元が nn 本の LWE の式の役割を果たす。成分が RqR_q の一様な k×kk \times k 行列 AA と係数の小さい s,e∈Rqks, e \in R_q^k から t=As+et = As + e を作り、(A,t)(A, t) から ss を求める問題を加群 LWE (module-LWE) という。

ML-KEM(FIPS 203)は CRYSTALS-Kyber から作られた、加群 LWE に基づく鍵カプセル化メカニズム (KEM) で、公開鍵から共有鍵とその「カプセル」を作り、秘密鍵でカプセルから共有鍵を取り出す。パラメータは n=256n = 256, q=3329q = 3329, k∈{2,3,4}k \in \lbrace 2, 3, 4 \rbrace で、AA を 32 バイトの種 ρ\rho から SHAKE128 で生成し、(t,ρ)(t, \rho) を公開鍵、ss を秘密鍵とする。256 ビットの μ\mu は、係数の小さい y,e1∈Rqky, e_1 \in R_q^k, e2∈Rqe_2 \in R_q を選んで u=A⊤y+e1u = A^{\top}y + e_1, v=⟨t,y⟩+e2+1665μv = \langle t, y \rangle + e_2 + 1665\mu と暗号化し、係数を圧縮して送る(A⊤A^{\top} は転置で、02-linear-algebra の tA{}^tA と同じもの。μ\mu のビットを係数とみなし、16651665 は q/2q/2 を四捨五入した値)。復号では

v−⟨s,u⟩=⟨e,y⟩−⟨s,e1⟩+e2+1665μv - \langle s, u \rangle = \langle e, y \rangle - \langle s, e_1 \rangle + e_2 + 1665\mu

(と圧縮による誤差)の各係数が 00 と 16651665 のどちらに近いかでビットを決める。誤差の項がレゲフの方式の EE に、yy が部分集合 SS にあたる。これに藤崎–岡本変換(暗号化の乱数を μ\mu と公開鍵のハッシュ値から作り、復号した側が暗号化し直して確かめる変換)をほどこして KEM にしており、ML-KEM は IND-CCA2 安全であると考えられている。なお 256∣q−1256 \mid q - 1 なので Z/qZ\mathbb{Z}/q\mathbb{Z} は 1 の原始 256 乗根(たとえば 1717)を含み、RqR_q の積は数論的変換で高速に計算できる。

ML-KEM-512 ML-KEM-768 ML-KEM-1024
kk 22 33 44
安全性のカテゴリー 1 3 5
カプセル化鍵(バイト) 800 1184 1568
暗号文(バイト) 768 1088 1568
復号に失敗する確率 2−138.82^{-138.8} 2−164.82^{-164.8} 2−174.82^{-174.8}

カテゴリー 1・3・5 は、破るのにそれぞれ AES-128・AES-192・AES-256 の鍵の総当たり以上の計算資源を要するという意味で、NIST は ML-KEM-768 を既定として推奨している。失敗確率はハッシュ関数を理想化した仮定のもとでの見積もりである。

7.11 量子計算機の影響

定理 7.29(ショア, 1994 年。主張)量子計算機の上で、整数 NN の素因数分解と、元を一意的に表せて群演算が効率よく計算できる巡回群((Z/pZ)×(\mathbb{Z}/p\mathbb{Z})^\times や楕円曲線の点の群を含む)の離散対数問題を、入力のビット長の多項式時間で、高い確率で解くアルゴリズムが存在する。

定理 7.30(グローバー, 1996 年。主張)f ⁣:{0,1}k→{0,1}f\colon \lbrace 0, 1 \rbrace^k \to \lbrace 0, 1 \rbrace が f(x)=1f(x) = 1 となる xx をただ一つもつとき、ff を量子回路として O(2k/2)O(2^{k/2}) 回呼び出して、その xx を高い確率で求める量子アルゴリズムが存在する。ff を中身の見えない関数として扱う限り、Ω(2k/2)\Omega(2^{k/2}) 回の呼び出しが必要である(ベネット・バーンスタイン・ブラッサール・ヴァジラニ, 1997 年)。

対象 古典計算機での最良の攻撃 量子計算機での攻撃 対策
RSA・有限体の DH・DSA 準指数時間(数体ふるい法) 多項式時間(ショア) 耐量子暗号へ移行
ECDH・ECDSA・EdDSA 群の位数の平方根程度(ρ\rho 法) 多項式時間(ショア) 耐量子暗号へ移行
共通鍵暗号(kk ビットの鍵) 約 2k2^k 回 約 2k/22^{k/2} 回(グローバー) 256 ビットの鍵を使う
ハッシュ関数の原像(出力 nn ビット) 約 2n2^n 回 約 2n/22^{n/2} 回(グローバー) 出力を十分長くする

ショアのアルゴリズムに対しては、鍵を長くしても多項式時間のままなので方式を取り替えるしかない。グローバーのアルゴリズムに対しては鍵を 2 倍の長さにすれば元の手間に戻るうえ、並列化の効果が小さく、量子回路で AES を評価すること自体も重いので、実際の影響は「鍵の長さが半分になる」より小さいと考えられている。衝突探索には約 2n/32^{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 問題は、与えられた AA について Az≡0(modq)Az \equiv 0 \pmod{q} となる短い z≠0z \neq 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,TZ, T から鍵導出関数で K=KDF⁡(Z∥T)K = \operatorname{KDF}(Z \mathbin{\Vert} T) を作る。鍵導出関数を適切に選べば、どちらか一方が安全である限り KK は安全である。TLS 1.3 向けには、X25519 と ML-KEM-768 を組み合わせた X25519MLKEM768 などが RFC 10024(2026 年 8 月)で規格化された。

クリプトアジリティ(暗号方式を取り替えやすい設計)も重要である。どこでどの暗号を使っているかを棚卸しし、方式を切り替えられるようにし、鍵や署名の大きさを決め打ちしない(X25519 の公開鍵 32 バイトに対し、ML-KEM-768 のカプセル化鍵は 1184 バイト)。データを秘密にしておきたい期間 xx と移行にかかる期間 yy の和が、実用的な量子計算機の出現までの期間 zz を超えれば手遅れになる(x+y>zx + y > z。モスカの不等式と呼ばれる)。今の通信を記録して将来解読する攻撃がありうるので、長期の秘密を運ぶ鍵共有から先に移行する。署名は検証の時点で安全なら足りることが多いが、長く使うルート証明書などは早めに移行する。

ヒント

実務では 耐量子暗号は自作せず、FIPS 203・204・205 に対応した実績のあるライブラリを使い、鍵共有ではまずハイブリッド鍵交換を検討する。共通鍵暗号は AES-256、ハッシュ関数は SHA-256 以上を選べば量子計算機に対しても余裕がある。規格や推奨は改訂が続くので、NIST の FIPS・SP、IETF の RFC、CRYPTREC の暗号リストの最新版を確認すること。

まとめ

  • 衝突困難性は第 2 原像困難性を導き、十分に圧縮する関数では原像困難性も導く。誕生日の限界により、出力 nn ビットのどんな関数も約 1.18⋅2n/21.18 \cdot 2^{n/2} 回の計算で確率ほぼ 1/21/2 以上で衝突が見つかる。
  • メルクル–ダムガード構成は衝突困難性を保つが長さ拡張を許すので、H(k∥m)H(k \mathbin{\Vert} m) ではなく HMAC を使う。
  • 格子の行列式は基底によらず ∏i∥bi∗∥\prod_i \lVert b_i^{\ast} \rVert に等しく、min⁡i∥bi∗∥≤λ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}。
  • 2 次元ではガウス簡約が最短ベクトルを与え、LLL は指数的な近似倍率で短いベクトルを多項式時間で見つけ、ナップサック暗号や偏ったナンスの ECDSA を破る。
  • LWE は最悪の場合の格子問題からの(量子)帰着をもつ。レゲフの暗号方式は ∣E∣<⌊q/2⌋/2\lvert E \rvert < \lfloor q/2 \rfloor/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−910^{-9} 以下にしたい。ID は何ビットあればよいか(定理 7.5 の上界を使え)。

解答

(1) N=232N = 2^{32}, k=105k = 10^5 で k(k−1)/(2N)=9999900000/8589934592≈1.164k(k-1)/(2N) = 9999900000/8589934592 \approx 1.164 なので、確率は 1−e−1.164≈0.6881 - e^{-1.164} \approx 0.688 以上である(正確な値もほぼ 0.6880.688)。32 ビットの乱数では一意性を保てない。

(2) k=109k = 10^9 で k(k−1)/(2N)≤10−9k(k-1)/(2N) \leq 10^{-9} となるには N≥109⋅k(k−1)/2≈5×1026≈288.7N \geq 10^9 \cdot k(k-1)/2 \approx 5 \times 10^{26} \approx 2^{88.7} であればよいので、89 ビットあればよい(ランダムな 122 ビットをもつバージョン 4 の UUID なら、上界は約 9.4×10−209.4 \times 10^{-20})。

問題 7.2 ★★(この実装のどこが危ないか)ある Web API は、利用者と共有した 16 バイトの秘密 kk を使い、リクエストの本文 mm に t=H(k∥m)t = H(k \mathbin{\Vert} m)(HH は SHA-256)を添えて送らせ、サーバー側で同じ値を計算して == で比べている。正規のリクエスト (m,t)(m, t) を 1 つ盗聴した攻撃者は何ができるか。どう直すべきか。

解答

攻撃者は k∥mk \mathbin{\Vert} m の長さ ℓ\ell(16 バイトと本文の長さの和)を知っているので、命題 7.10 により、好きな XX(金額を書き換えるパラメータなど)について m∥pad⁡(ℓ)∥Xm \mathbin{\Vert} \operatorname{pad}(\ell) \mathbin{\Vert} X の正しいタグを tt から作れる。pad⁡(ℓ)\operatorname{pad}(\ell) の部分は意味のないバイト列だが、それを無視したり後のパラメータを優先したりするサーバーは少なくない。直し方:タグを HMAC-SHA256 にし(定義 7.11)、照合は hmac.compare_digest のような処理時間が一定の比較で行う(== では応答時間の差からタグを推測されうる)。盗聴した (m,t)(m, t) の再送も、タイムスタンプなどを本文に含めて防ぐ。

問題 7.3 ★ 基底 b1=(9,16)b_1 = (9, 16), b2=(11,21)b_2 = (11, 21) で生成される格子 LL について、ガウス簡約を実行して λ1(L)\lambda_1(L) を求め、det⁡L\det L を簡約の前後の基底で計算して一致を確かめよ。

解答

∥b1∥2=337<∥b2∥2=562\lVert b_1 \rVert^2 = 337 < \lVert b_2 \rVert^2 = 562 なので入れ替えはない。μ=435/337\mu = 435/337 より m=1m = 1 で b2−b1=(2,5)b_2 - b_1 = (2, 5)(長さの 2 乗 2929)を得て入れ替え、μ=98/29\mu = 98/29 より (9,16)−3(2,5)=(3,1)(9, 16) - 3(2, 5) = (3, 1)(1010)を得て入れ替え、μ=11/10\mu = 11/10 より (2,5)−(3,1)=(−1,4)(2, 5) - (3, 1) = (-1, 4)(17≥1017 \geq 10)を得て終わる。出力 (3,1),(−1,4)(3, 1), (-1, 4) は ∣⟨b1,b2⟩∣=1≤5\lvert \langle b_1, b_2 \rangle \rvert = 1 \leq 5 をみたし、定理 7.17 より λ1(L)=10\lambda_1(L) = \sqrt{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 で一致する。

問題 7.4 ★★ q=17q = 17, n=2n = 2 の LWE で、a1=(1,3)a_1 = (1, 3), a2=(2,7)a_2 = (2, 7), a3=(4,1)a_3 = (4, 1), a4=(3,5)a_4 = (3, 5), (b1,b2,b3,b4)=(5,1,14,3)(b_1, b_2, b_3, b_4) = (5, 1, 14, 3) が与えられた。誤差は −1,0,1-1, 0, 1 のどれかである。(1) 誤差を無視して最初の 2 式から ss を求め、3 番目の式と矛盾することを確かめよ。(2) 172=28917^2 = 289 通りの ss を計算機で総当たりし、4 つの式すべてで bi−⟨ai,s⟩b_i - \langle a_i, s \rangle が −1,0,1-1, 0, 1 のどれかと合同になる ss を求めよ。

解答

(1) 最初の 2 式の係数行列の行列式は 11 で、

(1327)−1=(7−3−21)\begin{pmatrix} 1 & 3 \\ 2 & 7 \end{pmatrix}^{-1} = \begin{pmatrix} 7 & -3 \\ -2 & 1 \end{pmatrix}

なので s′=(7⋅5−3⋅1,−2⋅5+1)≡(15,8)s' = (7 \cdot 5 - 3 \cdot 1, -2 \cdot 5 + 1) \equiv (15, 8)。3 番目の式では ⟨(4,1),(15,8)⟩=68≡0\langle (4, 1), (15, 8) \rangle = 68 \equiv 0 だが b3=14≡−3b_3 = 14 \equiv -3 で、差が誤差の範囲に入らない。

(2) 条件をみたすのは s=(5,11)s = (5, 11) だけで、誤差は (1,−1,0,1)(1, -1, 0, 1) である(最初の 3 式だけでは (2,7)(2, 7) も条件をみたす)。s′−s=(10,−3)s' - s = (10, -3) は誤差 (1,−1)(1, -1) に逆行列を掛けたもので、小さな誤差が消去で拡大されている。nn が数百なら qnq^n 通りの総当たりは不可能である。

問題 7.5 ★★(ランポートの 1 回署名)HH を nn ビットのハッシュ関数とする。秘密鍵を 2ℓ2\ell 個のランダムな nn ビット列 xi,cx_{i,c}(1≤i≤ℓ1 \leq i \leq \ell, c∈{0,1}c \in \lbrace 0, 1 \rbrace)、公開鍵を yi,c=H(xi,c)y_{i,c} = H(x_{i,c}) とし、ℓ\ell ビットのメッセージ m=(m1,…,mℓ)m = (m_1, \dots, m_\ell) の署名を (x1,m1,…,xℓ,mℓ)(x_{1,m_1}, \dots, x_{\ell,m_\ell}) とする(検証では各成分の HH の値が yi,miy_{i,m_i} に等しいことを確かめる)。(1) 署名を一つも見ていない攻撃者が偽造するには何が必要か。(2) 同じ鍵で異なる 2 つのメッセージ m,m′m, m' に署名すると、何通りのメッセージの署名が作れるようになるか。

解答

(1) 各 ii についてランダムな xi,mix_{i,m_i} の像 yi,miy_{i,m_i} の原像が必要で、原像困難性を破らなければならない。

(2) mi≠mi′m_i \neq m_i' となる位置の個数を dd(≥1\geq 1)とすると、その位置では xi,0,xi,1x_{i,0}, x_{i,1} の両方が、ほかの位置では xi,mix_{i,m_i} が公開されている。よって、ほかの位置で mm と一致し dd 個の位置を自由に選んだ 2d2^d 通りのメッセージの署名が作れ、そのうち 2d−22^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 の原像探索も量子計算機で約 21282^{128} 回の評価を要するので、使い続けられる。また格子暗号は公開鍵暗号で、データ本体の暗号化は ML-KEM で共有した鍵を使う AES などが引き続き担う。署名にはハッシュ関数に基づく SLH-DSA という選択肢もある。

この章を読み終えたら

「読了」にすると、学習記録と地図に反映されます。

この章の誤りを報告GitHub で見る