NTRU暗号
さて、次にNTRU暗号をみていきましょう。
NTRU暗号はJ. Hoffstein, J. Pipher, and J.H. Silvermanの3人によって1990年代後半に提案された公開鍵暗号です。 多項式環に基づいており、これまでさまざまな攻撃に耐えてきています。 最近、耐量子計算機暗号が盛り上がっていることもあり、注目を集めています。
暗号方式の定義
では、パラメータ設定を振り返ったあとに、アルゴリズムの定義をみて、実装していきます。
パラメータ設定
正整数, について, と定義します。 また, の部分集合として, 係数多項式のうち係数が丁度個ある多項式の集合をと書きます。
NTRU256.2というのは後で攻撃対象になるパラメータです。 当時のNTRU論文では NTRU263.2 n,p,q,df,dg,dr=[263,2,127,35,35,22] 等のパラメータ集合が提案されています。 約20年前の設定なので数字が小さいですね。
アルゴリズム詳細
以上のパラメータを用いた場合, NTRU論文によると, のときの鍵の作り方は以下です.
とをランダムに選ぶ
がとで逆元を持たない場合、1に戻る
とする
を秘密鍵とする
を公開鍵とする
暗号化はこんな感じです
を平文とする
をランダムに選ぶ
とする
を暗号文とする
復号はこう。
を計算し, をの多項式だと思う
を計算する
なので, が整数上でも成立するなら, として復号できます。 はすべて係数の多項式なので、掛けても足しても小さいということで、が整数上でも成立します.
実装
実装していきましょう。
から 重みの多項式を得られます。 sample(range(n),d)で 集合から個重複無しで選んだリストが生成出来るので、 これを使って, からのランダム元生成を実現できます。 (random_tpoly(d))
m == dとなり, 無事に復号できました。
Coppersmith-Shamir攻撃
NTRUはCRYPTO 1996のランプセッションで公開され、論文自体はANTS1998で出版されています。 CoppersmithとShamirによる攻撃論文が、EUROCRYPT __1997__に採択されています (Lattice Attacks on NTRU | SpringerLink)。
格子
Lattice Attacksというからには Lattice (格子) を使っています。 基底ベクトルを適当な整数係数で足したベクトル全体の集合を格子と呼びます。 すなわち, が格子です。あ、この稿ではベクトルはすべて列ベクトルです。
鍵の関係式
NTRU暗号の鍵をみると, という関係があります。
CoppersmithとShamirは をに対応する巡回行列として, という行列の列ベクトルを基底とする格子を考えたときに, というベクトルがこの格子に含まれることに気づきました。
具体的な計算は以下です。
鍵の関係式から, が成立
なので, あるが存在して,
よって,
これと基底を考えると, より, はが張る格子に含まれる.
LLLやBKZといった格子基底縮小アルゴリズムと呼ばれるアルゴリズムを使うと、 格子の基底を与えられたときに(そこそこ)短いベクトルを探せることが多いです。
を格子基底縮小アルゴリズムに掛けて短いベクトルを探してやると, それがなりであることが期待できます。
これを実装してみましょう。