LLL and Markle-Hellman Knapsack cryptosystem

Markle-Hellman Knapsack暗号

一般に部分和問題が難しく、超増加列上では簡単であることを用いた公開鍵暗号

部分和問題: 値の組  (a_1 ... a_n)と値 tがあって、 t = a_1x_1 + a_2x_2 + \cdots + a_nx_nを満たす (x_1...x_n)を求めよ

超増加列:  \sum_{i=0}^n < w_{n+1}を満たす数列

Knapsack暗号での暗号化

超増加列 (w_1,...,w_n)秘密鍵 (m_1,...,m_n)をnbitの平文とする。適当な q, rを持ってきて

公開鍵: \beta = (w_0*r \mod q, ..., w_n*r \mod q)

暗号文:  C = \sum m_i\beta_i

LLLでKnapsack暗号を解く

 n次元ベクトル \vec{b}とスカラ値 cが与えられた時、次を満たし、各要素が 0または 1である \vec{u}を考える

 \vec{b}\vec{u}^T = c

このような \vec{u}が存在した時、次式が成り立つ( -cに注意)

 VM = \begin{pmatrix}u_0 & u_1 & ... & u_{n-1} & 1 \end{pmatrix}\begin{pmatrix}1 &  \cdots & 0 &  b_0 \ \vdots & \ddots & \vdots & \vdots \0 & \cdots & 1 & b_{n-1} \0 & \cdots & 0 & -c\end{pmatrix}=\begin{pmatrix}u_0 & u_1 & ... & u_{n-1} & 0 \end{pmatrix}=W

このとき、行列 Mの各行  r_0 ... r_{n}はそれぞれ (1, 0, ..., b_0 ), (0, 1, ..., b_1) ,..., (0, ..., 1, b_{n-1}),(0,...0,-c) という形をしており、1次独立である。

1次独立な n+1個のベクトル \vec{r_0},..., \vec{r_n}はある格子 Lの基底ベクトルとなる( Mは基底行列)(このとき M rが格子 Lを張る/構成すると言ったりしそう)。そして、ベクトル W u_0\vec{r_0} + \cdots + u_{n-1}\vec{r_n-1} + \vec{r_n}という、基底の線型結合で表されるので、 W \in Lである。

ここで ||W|| \le \sqrt{n}(なぜなら Wの各要素は 0または 1だから)であることを思い出すと、 W Lの短いベクトルだということがわかる。 Lの短いベクトルであるなら、 Lの短い基底を求めるアルゴリズムであるLLLで求められるのではないか。

というわけで、 MをLLLにかけて新しい基底 M'を得る。これも Lを構成するが、各ベクトルのノルムは小さくなっている。 Mのベクトルのうちのいずれかが \vec{u}となっていることを、祈る

knapsackへの適用

 C = c,  \beta = \vec{b}で同じ様にやると m = \vec{u}が出てくる

補足

 \vec{u}の要素が0または1のみからなる、って結構大胆な仮定だと思いませんか? 実はそうでもなくてナップザック暗号の場合は必ず0か1です。それ以外の部分和問題ではそうはなりませんが……