Merkle-Hellmanナップサック暗号

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

Merkle-Hellmanナップサック暗号とは、1978年ラルフ・マークルマーティン・ヘルマンが発表したナップサック問題(正確には部分和問題)を利用した公開鍵暗号の一つである。 この暗号方式は、秘匿用途の方式であり、認証(デジタル署名など)を目的としたものではない。

公開鍵暗号の提案は1976年であり、比較的初期に提案された方式である。 1982年に解読方法が発見されたため、現在は使用されていない。 近年になり、鍵の生成に量子コンピュータを用いることにより、量子コンピュータでも解けない暗号として機能することが示され、ふたたび注目を浴びている。

概要[編集]

Merkle-Hellmanナップサック暗号は部分和問題ナップサック問題の特別なインスタンス)に基づいている。

部分和問題は、整数の列(a1,...,an)と目標となる整数(t)を入力とし、\sum_{i\in S}a_i=tとなる部分集合S \subseteq \{1,2,...,n\}を求める問題(aitを合成する問題)である。

一般の部分和問題は、NP完全であることが知られている。しかし、超増加列と呼ばれる数列を用いた場合には、簡単に解けることが分かっている。Merkle-Hellmanナップサック暗号は、合成が簡単にできる超増加列を、見かけ上は合成がむずかしい整数列に変換し、また逆に戻せることに基づいている。超増加列とは、各数がそれまでの整数の和よりも大きい数列のことである。

超増加列の例: (1,2,4,8,16)

この暗号方式は発表時から安全性に疑問をもたれていたが、1982年にアディ・シャミア (Adi Shamir) によって一般的解読方法が発見された。これは部分和問題自体を解いたのではなく、超増加列を変換した数列を用いた場合には、どのように変換しても元の超増加という性質が残り、容易に解けることを示したものである。

シャミアの解読以降、多くのナップサック暗号の変形版が提案されているが、そのほとんどが解読可能であることが判明している。

用語については、暗号の用語および暗号理論の用語を参照のこと。

暗号方式[編集]

鍵生成[編集]

nビットの平文を暗号化するために、まずn個の数からなる超増加列

w = (w1, w2, ..., wn)

を生成する(nはセキュリティパラメータであり、100ビット以上の数にすることが推奨されている)。

次に、整数qq ≥ \sum_{i = 1}^n w_i を満たすようにランダムに選ぶ。 更に、整数 r を gcd(r,q) = 1となるようにランダムに選ぶ。 整数qは、qの剰余を取ったときに暗号文が一意に定まるように選ばなければならない。そうしないと二つの平文から同じ暗号文が生成されることになり、復号できなくなる。またrqと互いに素な整数でなければならない。これは復号時にrの逆元を使うためである。

βi = r wi (mod q)

とし、数列

β = (β1, β2, ..., βn)

を得る。

公開鍵はβ、秘密鍵は(w, q, r)である。

暗号化[編集]

nビットの平文

α = (α1, α2, ..., αn)

を暗号化する。ここで、各 αi は第iビットを表す (αi ∈{0,1})。

c = \sum_{i = 1}^n  \alpha_i \beta_i

を計算し、cを暗号文とする。

復号[編集]

暗号文cを受け取った後、 c' = c * r-1 (mod q) を計算する。

すると、c'wの部分和になっている。wは超増加列なので、{1,2,...,n}の部分集合Sを次のようにして簡単に求めることができる。

まず、c'wnの大小を比較し、もしc'wn以上の場合には、平文の第nビットは 1 であり、小さい場合には、0 である。c' が大きい場合にはwnを減算して、次にwn-1との大小を比較し、同様に第n-1ビットを決める。これを第1ビットまで繰り返せばよい。

具体的なアルゴリズムは、次のとおりになる。

入力: w (超増加列), c'
出力: {1,2,...,n}の部分集合S

  • sをc'とし, Sを空集合とする。
  • i = n, n-1, ..., 2, 1 について次文を繰り返す。
    • s≥wi ならば、s=s-wi とし、S=S∪{i} とする。
  • sが0ならばSを, 0でないならば⊥を出力する。

安全性[編集]

Merkle-Hellmanナップサック暗号は、シャミアにより多項式時間で解読できることが示されている。

シャミアの攻撃法[編集]

シャミアの攻撃法では、公開鍵β = (β1, β2, ..., βn)から、超増加列w' = (w' 1, w' 2, ..., w' n)を求める。正しい超増加列wとシャミアの攻撃法で求めたw' は異なることが多いが、正しく解読できる。 詳しくは参考文献のAdi Shamir, "A Polynomial Time Algorithm for Breaking the Basic Merkle-Hellman Cryptosystem"を参照のこと。

低密度攻撃[編集]

密度が低い場合、高確率で格子の最短ベクトルを求める問題 (最短ベクトル問題, Shortest Vector Problem, SVP) へ帰着できる。最短ベクトル問題は、ユークリッド距離ではRandomized帰着の元でNP困難な問題であることが知られているが、格子の次元が低い場合、LLLアルゴリズムを用いて解けることが多い。 (stub)

参考文献[編集]

  • Ralph Merkle, Martin Hellman, "Hiding Information and Signatures in Trapdoor Knapsacks", IEEE Trans. Information Theory, 24(5), September 1978, pp.525–530.
  • Adi Shamir, "A Polynomial Time Algorithm for Breaking the Basic Merkle-Hellman Cryptosystem", CRYPTO'82, pp.279–288, 1982. (PDF)

関連項目[編集]