格子問題とその基本問題
はじめに
現在広く利用されている暗号技術は、量子コンピュータの登場によって安全性が揺らぐ可能性があると指摘されています。この問題への解決策として二つのアプローチが注目を集めています。一つは、量子コンピュータでも解けない計算問題に基づいた「耐量子計算機暗号(PQC)」 です。もう一つは、量子力学の原理を利用する「量子暗号(QKDなど)」 です。
私はこれらの最先端の暗号技術に強い関心があり、独学で得た知識を体系的に整理するために、記事シリーズとしてまとめています。
本記事では、その中でも特に重要な基盤である格子問題に焦点を当てて整理していきます。
格子問題のイメージや直感的な理解から始め、暗号で重要となるLWE問題やSIS問題にも触れ、最終的にこれらがPQCアルゴリズム(例:ML-KEMやML-DSA)の土台としてどのように応用されているかを整理していきます。
なお、PQCやQKD、従来の暗号技術について詳しく知りたい方は、以下の記事もあわせてご覧ください。
格子とは
格子とは、直感的には「規則正しく並んだ点の集合」です。結晶の中で原子が一定の間隔で並んでいる様子に近いです。
数学的には、格子は以下のように定義されます。
格子の定義
m次元ユークリッド空間
= L ( L , b_1 ,..., b_2 ) := { b_n } , Σ_{i=1}^n a_ib_i :a_i \in Z b_i \in Z^m
※ここでは行を基底ベクトルとして扱います。
これは、m次元 n個のベクトル
特にm = nの時、格子Lは完全階数である、といいます。
階数
格子
重要ポイント
-
整数係数であること
実数係数なら空間全体を埋め尽くしてしまいますが、整数に限定することで格子点が離散的に並びます。 -
基底は一意ではない
一つの格子でも、基底の取り方は複数存在します。
例えば2次元の場合、 を基底にしても、(1,0),(0,1) を基底にしても、生成される格子は同じです。(-1,0),(0,1)
格子の種類
格子にはいくつかの種類があり、それぞれ異なる役割を担っています。
-
上の格子Z^n
これは、最も基本的な格子です。全ての成分が整数であるn次元ベクトルで構成される、点の集合です。 -
双対格子
ある格子 に対して、特別な関係を持つもう一つの格子を双対格子L と呼びます。\hat{L}
双対格子は、元の格子 のベクトルと内積をとると、必ず整数になるようなベクトルの集合です。L ={\hat{L} :<x,y>x \in R^n ,\in Z }∀y \in L Lの基底行列Bに対して、
は双対格子\hat{B} = (B^{-1})^T の基底行列となり、この\hat{L} を双対基底行列と呼びます。m次の単位行列\hat{B} に対し、I_m を満たすので、B\hat{B} = I_m が成り立ちます。vol(L) × vol(\hat{L}) = 1 元の格子
が「密」(基底ベクトルが短い)であるほど、その双対格子L は「疎」(基底ベクトルが長い)になります。後述するカーネル格子とイメージ格子は双対な関係にあります。L^⊥ -
q-ary格子
正の整数
に対しq (格子qZ^m \subseteq L \subseteq Z^m は整数格子L とそのq倍の間にあること)を満たす完全階数m次元格子Z^m をq-ary格子といいます。すなわち、これは剰余環L 上で定義された格子です。Z_q 二つの自然数
に対し、任意の整数m > n とn x m整数行列q > 0 に対して、以下の二つのm次元q-ary格子を定義します。X = {Λ_q(X) } (mody \in z^m:∃s \in Z^n s.t. y ≡ sX )q
= {{Λ_q}^⊥(X) } (mody \in z^m:yX^T ≡ 0 )q このとき、これらの二つの格子は互いに双対な関係にあります。
は「イメージ格子」、Λ_q(X) は「カーネル格子」と呼ばれます。{Λ_q}^⊥(X)
格子問題
格子問題とは、格子上で定義される特定の計算問題を指します。これらの問題の多くは、古典コンピュータでは解くのが非常に難しい(NP困難であると信じられている)一方で、量子コンピュータでも効率的に解くことができないと考えられています。
格子問題には様々な種類がありますが、代表的なものをいくつか挙げます。
-
最短ベクトル問題(SVP:Shortest Vector Problem)
- 完全階数nの格子
の基底{L ,b_1 ,...,b_2 }が与えられたとき、格子上の最短な非零ベクトルb_n (原点から最も近い格子点)を見つけ出す問題。(v \in L を満たす格子ベクトル||v|| = λ_1(L) を見つける)v \in L - 高い階数の格子において、SVPを効率的に解く方法は知られていません。
- 完全階数nの格子
-
最近ベクトル問題(CVP:Closest Vevtor Problem)
- 完全階数nの格子
の基底{L ,b_1 ,...,b_2 }とb_n \w \in R^n が与えられたとき、L に最も近い格子ベクトルw を見つけ出す問題。v \in L - SVPよりもさらに、効率的な解法が知られていません。
- 完全階数nの格子
-
近似最近ベクトル問題(Gap-CVP)
- CVPの近似版で、最近ベクトルが特定の距離内にあるかどうかを判定する問題です。
なぜ、格子問題が暗号に利用されるのか
格子には、非常に手強い数学的難問が隠されています。具体的には、格子点の中から特定の条件を満たす点を見つけることは、非常に難しいとされています。その鍵は、格子の基底にあります。
前述のように、同じ格子でも基底の取り方は複数存在しますが、基底には「良い」ものと、「悪い」ものが存在します。「良い」基底とは、各ベクトルが短く、お互いにほぼ直行していることを指し、「悪い」基底とは、各ベクトルが長く、お互いにほぼ平行であることを指します。悪い基底で定義された格子は、一見すると不規則な点の集まりに見え、目的の点を見つけることが極めて困難になります。
すなわち、この「悪い基底」で隠された、格子の持つ幾何学的な構造を解き明かすことこそが、格子問題の本質であり、その難しさの根源です。
これは攻撃者が暗号を解読しようとする際に用いられるだけでなく、暗号の安全性を評価する上でも不可欠です。もし効率的な簡約アルゴリズムが存在して格子問題を簡単に解けてしまうなら、その暗号は安全とは言えなくなってしまいます。
「悪い」基底から「良い」基底に変換することを 格子基底簡約(ユニモジュラ変換) といいます。
-
グラム・シュミット直交化
格子基底簡約(ユニモジュラ変換)を理解する上で欠かせない基礎が グラム・シュミット直交化 です。これは与えられた複数のベクトルを、互いに直交するベクトル集合へと変換する手法です。
与えられた線形独立なベクトル集合 に対して、直交ベクトル集合B={b_1, b_2,…,b_n} \in \mathbb{R}^m =B^* を構成する手順は次の通りです:{b^*_1,b^*_2,…,b^*_n}
-
b^*_1 = b_1 -
のとき(係数k \geq 2 は内積で定義されます)\mu_{k,j} b^*_k = b_k - \sum^{k-1}_{j=1} \mu_{k,j} b^*_j \mu_{k,j} = \frac{\langle b_k, b^*_j \rangle}{||b^*_j||}
-
代表的な基底簡約アルゴリズム
<LLLアルゴリズム>
LLLアルゴリズムは、最も有名な格子基底簡約アルゴリズムの一つです。
与えられた「悪い」基底を、多項式時間で「ある程度良い」基底に変換することができます。
格子
-
サイズ簡約(Size-reduced)
これは、基底ベクトル間の係数 が小さくなるように調整し、基底がほぼ直行していることを保証する条件です。μ_{i,j}
- 定義:すべての自然数 について、グラムシュミット係数1 ≤ j < i ≤ n が次の条件を満たします。μ_{i,j} |μ_{i,j}| ≤ 1/2 -
Lovász条件
これは、基底ベクトルが長さの昇順に近い順序で並んでいることを保証する条件です。
定義: すべての自然数 について、ある定数1 \le i < n (\delta )を用いて次の不等式が成立します。1/4 < \delta < 1 \left(\delta - \mu^2_{i+1,i}\right) \|\mathbf{b}^*_i\|^2 \le \|\mathbf{b}^*_{i+1}\|^2
LLLアルゴリズムの処理の流れ
LLLアルゴリズムは、上記の条件を満たす基底を得るために、以下の処理を多項式時間で繰り返します。
-
サイズ簡約: すべての
について、サイズ簡約の条件j < i を満たすように、|\mu_{i,j}| \le 1/2 から\mathbf{b}_i の整数倍を引く操作を行います。\mathbf{b}_j -
Lovász条件のチェックと交換:
からi=1 まで順にLovász条件をチェックします。n-1 - 条件が満たされない場合、隣り合うベクトル
と\mathbf{b}_i を交換します。\mathbf{b}_{i+1} - 交換後、グラム・シュミット係数を更新し、前のステップに戻って処理を続行します。
- 条件が満たされない場合、隣り合うベクトル
-
終了: すべての
で両方の条件が満たされたとき、アルゴリズムは終了し、LLL簡約基底が出力されます。i
この処理を繰り返すことで、直交性が高く、短いベクトルを含む新しい基底が得られます。
LLLは計算が比較的速く、SVPやCVPを「近似的に」解くことが可能です。
<BKZアルゴリズム>
BKZ(Block Korkine-Zolotarev)は、LLLをさらに強力にしたアルゴリズムです。
LLLが隣接する2本のベクトルしか考慮しないのに対し、BKZでは基底をいくつかの ブロック に分割し、そのブロック内で最適なベクトルを探索します。
この「ブロック内でSVPを解く」アプローチにより、BKZはLLLよりも大幅に「良い」基底を生成でき、より短いベクトルを見つけられます。
その分計算量は大きくなりますが、BKZは現代の格子暗号の安全性評価で最も重要なベンチマークとなっています。
もしBKZを用いても解読できないほど困難であれば、その暗号は「十分に安全」と考えられます。
LWE問題(Learning With Errors、誤差付き学習)
要素数が素数qの有限体
すなわちLWE問題は、ノイズ(誤差)を含む線型方程式の連立方程式から、元の秘密の係数
nを正の整数、qを奇素数とし、平均0、標準偏差σの
(
) a,b \in {F_q}^n × F_q
≡ < b > + a,s (mod e ) q
次の二つの問題を考えることができます。
-
判定LWE:与えられた組(
)が、確率分布a,b からサンプルされたのか、L_{s,x} 上の一様ランダムに生成されたかを判定する問題。{F_q}^n × F_q -
探索LWE:確率分布
のサンプルから、秘密ベクトルL_{s,x} を復元する問題。s
安全性評価手法としては、判定LWEが使用されます。もし、攻撃者がLWEの出力をランダムなデータと区別できてしまうと、暗号文を「本物」と「偽物」とで区別できてしまい、暗号システムが破られる可能性があるからです。
2005年の論文で、RegevはLWE問題の安全性(困難性)を格子問題の解くことの難しさに帰着できることを示しました。すなわち、 LWE問題を解くことができるなら、SVP、CVP、Gap-CVPといった格子の最悪ケース(最も解くのが難しい格子のケース)も効率的に解けることを意味します。LWE問題の安全性は格子問題の最悪ケースの困難性に支えられています。
別の言い方をすると、SVP、CVP、Gap-CVPといった格子の最悪ケースを効率的に解く方法が存在しないため、LWE問題を解くことは難しいと言われています。
一般に、LWE問題において、確率分布を
≡ < b_i > + a_i,s (mod e_i ) q
: a_i \in A(m × n行列) iは行ベクトル b = (b_1,b_2,..,b_m) :ノイズベクトル e = (e_1,e_2,..,e_m)
を満たすとします。このときm個のLWEサンプルは以下のように表せます。
(
) a,b
≡ b + sA^T (mod e ) q
LWE暗号方式
ここでは、Regevが提案した暗号方式について紹介します。
-
鍵生成
一様ランダムに秘密鍵
を選びます。平均0、標準偏差σのs \in {F_q}^n 上の離散ガウス分布Z と秘密鍵X が定めるs が生成するL_{s,x} 個のLWEサンプル(m )a_i,b_i を公開鍵とします。ただし、{ }_{i=1}^m 、1 ≦ i ≦ M に対し、e_i ← X ≡ <b_i > +a_i,s (mode_i )を満たすとします。q - 公開鍵:(
)a_i,b_i m個のLWEサンプル{ }_{i=1}^m - 秘密鍵:
s \in {F_q}^n
- 公開鍵:(
-
暗号化
集合{1,2,..m}の中から、一様ランダムに選んだ部分集合を とします。そして、平文 $μ \in {0,1} (1ビットのメッセージ)の暗号文を次のように暗号化します。S c = (
Σ_{i \in S} a_i, μ・[q/2] + Σ_{i \in S} b_i) \in {F_q}^n × F_q -
復号
暗号文 に対し、秘密鍵c = (a,b)\in {F_q}^n × F_q を使用して[s を計算します。その値が十分0に近い場合は0を出力し、それ以外の場合は1を出力します。b−⟨a,s⟩]_q
ただし、 は元[t]_q をt \in F_q に収めた値とします。[-q/2,q/2) b−⟨a,s⟩
= μ・[q/2] + Σ_{i \in S} b_i - s(Σ_{i \in S} a_i)^T
= μ・[q/2] + s(Σ_{i \in S} a_i)^T + Σ_{i \in S}e_i - s(Σ_{i \in S} a_i)^T
= μ・[q/2] + Σ_{i \in S}e_i
≒ μ・[q/2] 誤差
が無視できないほど誤差が大きいとき、復号に失敗します。すなわち、Σ_{i \in S}e_i がΣ_{i \in S}e_i より小さい時、非常に高い確率で復号に成功します。q/4
判定LWEの解読
判定LWE問題とSIS問題
LWEサンプルの組(a,b)に対して、n x m行列
(mod <v,b> = <v,sA^T + e> = <vA,s> + <v,e> ≡ <v,e> ) q
が成り立ちます。また、
|<v,e>| \lesssim \quad σ√m||v|| \le σβ√m
となる。ここで、
SVPとSIS問題の関係
SIS問題は、SVPの特殊ケースです。SVPは任意の格子
探索LWEの解読
格子
を満たすとします。このとき、与えられた
探索LWE問題とBDD問題
BDD問題はCVPの特殊ケースです。LWEサンプルの組(a,b)は
CVPとBDD問題の関係
CVPは与えられた
q-ary格子の役割
q-ary格子である
NTRU問題
NTRU問題は多項式を用いた有限環上の格子問題です。
二つの正の整数
すなわち、
係数が小さい二つの多項式
このとき、
NTRU暗号方式
以下では、二つの正の整数
-
鍵生成
- 全ての係数の絶対値が小さい二つの多項式
を選びます。f(x),g(x) \in R は、二つの環f(x) において可逆とします。すなわち、R_p,R_q ,f_p(x) \in R_p が存在し、f_q(x) \in R_q
,f_p(x)・f(x) = 1 \in R_p f_q(x)・f(x) = 1 \in R_q を満たします。具体的には、
を満たす正の整数2d < n に対して、d を選びます。f(x) \in T(d+1,d),g(x) \in T(d,d) = {T(d,e) のa(x) \in R:a(x) 個の係数は1 ,d のe個の係数は-1 , その他の係数は全て0}a(x) - 公開鍵:
h(x) = f_q(x)・g(x) \in R_q - 秘密鍵:
f(x),f_p(x)
- 全ての係数の絶対値が小さい二つの多項式
-
暗号化
-
をランダムに選びます。r(x) = T(d,d) - 平文
と公開鍵m(x) \in R_p に対して、h(x) を使用して暗号文r(x) を生成します。c(x) c(x) = p・r(x)・h(x)+m(x) \in R_q
-
-
復号
- 暗号文
に対し、秘密鍵c(x) \in R_q を用いて復号します。f(x) \in R,f_p(x) \in R_p f_p(x)・[f(x)・c(x)]_q \in R_q
- 暗号文
NTRU問題の解読
係数ベクトルと回転操作
環
rot(a) = (a_{n-1},a_0,a_1,...,a_{n-2})
すなわち、回転ベクトル
NTRU格子
NTRU問題における公開多項式(公開鍵)

Hに

次の

で生成される
実際に、
(mod h(x) ≡ f_q(x)・g(x) ) q
(mod h(x)・f(x) ≡ g(x) ) q
より、
連結ベクトル
LWE問題の応用と安全性
Ring-LWE問題
LWE問題がベクトルと行列を扱うのに対して、Ring-LWE問題は係数が整数の多項式を対象とします。「Ring(環)」という名前の通り、この問題は多項式環上で定義されます。
-
多項式環
の定義R_q
まず、整数環 を法Z で割った環q Z_q=Z/qZ を考えます。
次に、多項式環 を作り、さらにZ_q[x] で割った剰余環をとることで次のように定義されます。z^n+1 R_q=Z_q[x]/(x^n+1) つまり、次数が
未満で、係数がn から0 の範囲に収まる多項式が要素となります。q-1
この環では という関係が成り立つのが特徴です。x^n \equiv -1 -
Ring-LWE問題の定義
LWE問題と同様に、秘密の多項式
を仮定します。s(x) \in R_q ランダムに生成された多項式
と小さなノイズの多項式a(x) \in R_q を使って、次のように多項式e(x) を生成します。b(x) (mod q)b(x)=a(x)s(x)+e(x) 公開されるのは
とa(x) であり、この情報から秘密の多項式b(x) を求めることが Ring-LWE問題の目的です。s(x)
Ring-LWEの意義と利点
Ring-LWEの最大の特徴は、LWEと同等の安全性を保ちながら、実用面で大幅に改善された点にあります。
-
鍵サイズの削減
LWEでは大きな行列
が必要でしたが、Ring-LWEでは公開鍵として わずか1つの多項式A を提示するだけで済みます。a(x)
これにより、鍵のサイズは数千〜数万分の1に縮小され、データ通信が格段に効率化されました。 -
計算速度の向上
Ring-LWEの演算の中心は「多項式の掛け算」です。これは、LWEの行列-ベクトル積よりもはるかに効率的であり、さらにNTT(数論変換)[1]を用いることで大幅に高速化されます。
しかし、Ring-LWEの持つ特定の構造は、安全性をさらに高めるための課題も残していました。この課題を克服するために開発されたのが、次に説明するModule-LWEです。
Module-LWE問題
Ring-LWEの効率性とLWEの柔軟なセキュリティ性を組み合わせるために提案された問題です。
イメージとしては、Ring-LWEが「1つの多項式環」で表現していた世界を、LWEのような「ベクトル・行列の構造」に拡張したものです
-
は、Module-LWEにおける「多項式の数」を表すパラメータです。値が大きいほどセキュリティは高まりますが、その分鍵サイズも大きくなります。k
数式で表すと次のようになります:
b(x) = A(x)s(x) + e(x) \pmod q
:多項式を要素とする行列( A(x) ) k \times k :秘密ベクトル( s(x) )、 k \times 1 s(x)=(s_1(x),...,s_k(x))^T :公開ベクトル( b(x) ) k \times 1 :ノイズベクトル( e(x) ) k \times 1
ここで扱う各要素は、Ring-LWEと同じく多項式環
Module-LWEの意義と利点
1. Ring-LWEと同等の効率性
計算の中心は多項式演算なので、鍵サイズや計算速度の面でRing-LWEと同等のメリットを持っています。
2. LWEに近い安全性
複数の多項式をベクトル・行列で扱う構造を持つため、単一の多項式環に依存するRing-LWEよりも堅牢とされます。
このようにModule-LWEは、効率性と安全性を両立した格子問題として位置づけられており、
NISTが標準化したPQCの標準アルゴリズムの一つであるML-KEM も、このModule-LWEの安全性を基盤にしています。
なお、本記事では、格子問題の理解に焦点を当てているため、Module-LWEがML-KEMでどのように使用されているかを知りたい方は、こちらをご覧ください。
量子コンピュータの登場により、従来の暗号技術が将来的に危殆化すると指摘される中で、格子問題は「量子コンピュータでも効率的に解けない問題」として強い注目を集めています。実際に、格子問題を安全性にしているLWE問題、さらに安全性を高めたModule-LWE問題は、ML-KEMで採用されています。
ML-KEMのより具体的な仕組みについて知りたい方は、ぜひこちらの記事もご覧ください。
参考文献:
- https://www.acompany.tech/privacytechlab/lattice-based-cryptography
- 國廣 昇,安田 雅哉,水木 敬明,高安 敦,高島 克幸,米山 一樹,大原 一真,江村 恵太 (2024)「暗号の理論と技術 量子時代のセキュリティ理解のために」(KS理工学専門書)
Discussion