このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
NP とは最適化問題を多く含むなど実用的な問題を多く含む問題のクラスです。 ここに含まれる多くの問題は効率のよい(多項式時間の)解法が見つかってません。 NP に含まれる問題に多項式時間のアルゴリズムが存在するか否かは「P=NP問 題」と呼ばれ、数学の7大問題の一つとして知られています。
NP は非決定性 Turing 機械で多項式時間で計算できる問題のクラスです。 問題一つに対して非決定性 Turing 機械と多項式が一つ対応します。 一方、非決定性 Turing 機械は入力を固定すると入力の長さの多項式の長さの論理式 で記述でき、その充足可能性を調べることで、受理するかどうかを調べること ができます。 つまり、あらゆる NP 問題は論理式の充足可能性問題(SAT)に帰着できるため、 論理式の充足可能性問題(SAT)は NP 完全問題です(Cook の定理)。 NP 完全問題にはナップザック問題、巡回セールスマン問題、三色問題の他、 様々な最適化問題が含まれています。
Diffie Hellman 暗号とは一方向性関数を仮定した暗号モデルです。
シーザー暗号は IBM → HAL など、各文字の順序をいくつかずつずらすもので す。 この場合の暗号の鍵は文字をいくつずらすかという情報です。 これは暗号時の鍵がわかってしまえば復号できてしまいます。
一方、Diffie Hellman 暗号では暗号化鍵がわかっても復号化が難しい暗号を 言います。 例えば、かけ算は入力の長さに対して、 O(n2) でできる一方、そ の逆演算である素因数分解は未だに多項式時間でできるアルゴリズムは知られ ていません。 このような性質(逆演算の計算量が大きい)を持つ演算を利用しようと言うモデ ルがDiffie Hellman 暗号です。 無限個のパラメータ k を許す暗号鍵ek と復号鍵 dk が次の性質を持つとき、 DH対 と言います。
ここで問題なのは 4 番の条件です。 困難であることとは、例えば多項式時間で計算できないことなどが条件として 考えられます。 しかし、 3 番の条件から次の非決定的なプログラムを作ることができます。
つまり、非決定的には復号鍵は多項式時間で得られてしまいます。 これは DH 対の存在を示す(4番の条件を保証する)ことが P≠NP を示すことに帰着す ることを意味します。 このようなこともあり、現在において未だ復号鍵を得るのが困難であることが証明されている DH 対は存在しません。
DH 対を満たす暗号鍵があると従来の暗号(古典暗号)で解決し得な かった問題が解決できます。 例えば、鍵配布問題です。 これは暗号通信を行う際、受信者は復号のための鍵が必要ですが、これをどう やって送信者から受け取るかという問題です。 古典暗号では鍵が漏れれば盗聴により解読されてしまいますから、従来は盗聴されない通信 路を使って鍵を渡す必要がありました。 しかし、この「盗聴されない通信路」があれば、わざわざ盗聴されるような通 信路で暗号通信を行う必要はありません。 つまり、古典暗号論は自己矛盾を含んでいました。 これに対してこの DH 対では次のようにすることで、盗聴される通信路で暗号 通信を可能にできます。 これを公開鍵暗号と呼びます。
DH 対の性質から、盗聴者は ek と暗号文を得ても解読できません。 また、さらに、古典暗号では n 人の相手とやり取りするには n 個の鍵が必要 でしたが、この公開鍵暗号では n 人に同じ暗号鍵を渡しても相互には暗号文 は解読できません。
さらに、復号鍵を持っているのは本人だけという性質を利用して電子署 名というメッセージの認証など、従来の暗号では考えられなかった ようなアプリケーションも多く考案されています。
ここではNP完全問題のナップザック問題を応用して作られた DH暗号 ナップザック暗号を紹介します。
ナップザック問題は以下のような問題でした。
を満たす が存在するか?
ナップザック暗号とはナップザック問題において、送りたい情報(0,1 の列)に 対応して各荷物を入れるか入れないかを決めることでナップザッ クのサイズを決定し、ナップザックのサイズを暗号文として送るものです。 当然、普通にナップザック問題を解く速いアルゴリズムは知られてませんから、 何の工夫もしないと復号を効率よくできません。 そのため、落とし戸(Trapdoor)という特殊な情報を用いて、復号 を効率よくできるようにします。
そこで、Super increasing vector という特殊なナップザック問 題のインスタンスを考えます。
が super increasing vector であるとは、各 ak に対して次が成 り立つことです。
このような super increasing vector に対しては、大きい数から順に入るか 入らないかを決めることで、 O(n) 時間で袋に入る荷物を決定できます。
11=8+2+1
これは以下を満たすので同値関係になります。
ここでは Merkle, HellMan 型のナップザック暗号を紹介します。 Super increasing vector A=(a1,...,an) に対して、 2an< M なる整数 M と、 M と互いに素な数 u、さらに、拡張 ユークリッドの互除法(後述)により を満たす v を用意します。 公開鍵を B=(b1,...,bn) は uai を M で 割った余りを小さい順に並べたものとします。
n 桁の 0,1 の列 (p1,...,pn) をこの暗号で送る場合、 各 pi が 1 の bi を合計したものを送ります。 解読は次のように行います。
この暗号システムは NP 完全問題を利用しているにもかかわらず、 1982 年に Shamir が多項式時間で破るアルゴリズムを与えました。 もともと、真の NP 完全問題であるナップザック問題が解ければ、この暗号は 破れますが、逆は言えてませんでした。つまり reducibility としては しか言えてませんでした。 つまり、ナップザック暗号はナップザック問題より易しいことしかわかってま せん。 ですから、このタイプのナップザック暗号が解読されることと P=NP 問題が未 解決なのとはなんら矛盾することはありません。
Shamir のアルゴリズムは公開鍵 B から u と M に拘らず、暗号解読可能な条 件を満たす別の super increasing vector を計算により求めるというも のです。
列ベクトル X∈{0,1}n を平文と考えます。 暗号文 c は鍵と平文の内積 BX と考えます。 この時、法 M の下で次が成り立ちます。
Super increasing vector に対するナップザック問題は O(n) で解け、解は唯 一です。また、 AX の値は M 未満なので、 だけではなく、 が成り立ちます。
暗号文が最終的にもともとの super increasing vector でナップザック問題 が唯一解で解けるということは、公開されている鍵においても常に唯一解が存 在するということを意味しています。 これは、公開鍵に対して、別の係数と法で全く異なる super increasing vector に変換しても性質は変わりません。 Shamir のアイディアは公開鍵に対して、別の super increasing vector に変 換する係数 u と法 M を見つけようと言うものです。 super increasing vector の要素は少なくとも法 M の 1/2 以下でなければな らず、他にも厳しい制約があります。 従って、もし、適切な u と M が見つかれば uB の各要素は M/2 より小さい はずです。 ここで、各要素を u 倍して M で割った余りを求めると、原点から 傾き bi の直線が M まで伸びては下からまた伸びるというのこぎ り型のグラフになります。 これが n 本書けますが、注目したいのは n 本とも下の方にいるような場 合です。 ここで、さらに super increasing vector の一部もまた super increasing vector ですので、狭い範囲に集中するか否かという候補を見つけるのに、 n 本すべてに注目せずに、定数個の要素に注目しても同様の議論ができます。
次にグラフを 1/M に縮小することを考えます。 つまり係数 x として、 0 から 1 までの実数を考え、各 bi に対 して bix の小数部分の値を考えるようにします。 すると、 u, M という二つのパラメータを、 x のみの一つのパラメータにで きます。 この x に対して、各 bix が 0 付近にかたまるところをみつけ、 その付近の値に対して super increasing vector の 条件が成り立つ不等式を満たすかどうかを整数線形計画法で解きます。
B=(3,6,7,12) に対して、3u が折り返してきて 0 の付近に来るのは、u=M/3, 2M/3 の時になります。 候補として、 u=M/3 を考えると、 6u, 7u, 12u とも 0 に近い値になります。 次に、 1/M に縮小した状況を考えます。 x=1/3 近辺では 3x-1, 6x-2, 7x-2, 12x-4 がのこぎり型の斜辺の式になりま す。 ここで x=0.35 とすると、 0.05, 0.1, 0.45, 0.2 と super increasing vector の条件を満たします。 u/M=0.35 となる整数の組 (u,M) として (7, 20) と置きます。 すると と確かに super increasing vector となります(但し、元の super increasing vector とは大小関係は対応しているが異なる)。 これを使うと、暗号文に対して 7 倍して、 20 で割った余りを求め、この super increasing vector を使うことで解読できます。
結局このナップザック暗号は super increasing vector という厳しい制約と、 係数をかけて余りを求めるだけという単純な手法により、解読されてしまいま した。 この後も、ナップザック問題を利用した暗号は開発されていますが、優れたも のはできていません。
RSA 暗号とは次のようなものです。 ふたつの大きな素数 p,q に対して、積を n とします。 また、φ(n)=(p-1)(q-1) とし、 φ(n) と互いに素な任意の数 e を選 びます。 さらに となる数 d を求めます。 公開する鍵は e と n で、復号鍵は d と n です。 これも DH 暗号になります。
平文 x を暗号化するには xe を n で割った余り c を求め、この c を送ります。 復号は cd を n で割った余りを求めると、 x になります。 これはオイラーの定理によるものです。
n の素因数分解を とするとき、オイラー関数を次のように定義する。
このとき、 n と互いに素な任意の数 x に対して次が成り立つ。
なので、ある y に対して、 ed=yφ(n)+1 となります。 したがって以下が成り立ちます。
これにより RSA 暗号が正しく復号されることが分かります。 また、現時点で e と n から d を求める方法は n を素因数分解することによ り求められますので、 となることは分かります。 しかし、この n の素因数分解以外に d を求めるのに有効な方法が知られてませんので、 今のところ安全に利用できます。
ユークリッドの互除法は入力のふたつの自然数 x, y に対して、相互に割り余 りを求めていくと gcd(最大公約数) が求まるというアルゴリズムです。 例えば、 48 と 27 の場合、次のようになります。
48 / 27 = 1 ... 21 27 / 21 = 1 ... 6 21 / 6 = 3 ... 3 6 / 3 = 2 ... 0
この余りが 0 になる直前の余り 3 が 48 と 27 の gcd になるというもので す。 ここではこのユークリッドの互除法の性質について調べます。 以下 (x>y) を仮定します。
(x と y の gcd) と ((x を y で割った余り) と y の gcd) は等しい
x と y の gcd を d と置く。 x を y で割った時、商が a、余りが b だった時次のように表せる。
x が d で割り切れるので右辺は d で割り切れる必要がある。 一方、 y も d で割り切れるので、右辺が d で割り切れるには b が d で割 り切れなければならない。
(x を y で割った余り) と y が共に d で割り切れることが分かったが、 次に、この d が最大であることを示す。 もし、共に d より大きな数 e で両方共割り切れたと仮定する。 y も b も e で割り切れる。 したがって、 x=ay+b より右辺は e で割り切れるので、 x も e で割り切れてしまう。 そのため、 x と y の gcd が d であるという仮定に矛盾する。
ユークリッドの互除法の時間計算量は x と y の長さに比例した時間 (O(n))
x を y で割った時、余りは必ず x/2 以下となります。 つまり、毎回扱う数は二進数で少なくとも一桁ずつ減っています。 したがって、プログラムの実行時間は高々 x と y の長さになります。
ユークリッドの互助法の手順を書き下すと以下のようになります。
y / x = a ... b x / b = c ... d b / d = e ... f ... p / q = r ... gcd
これを余りを主体にして書き直すと次のようになります。
y - ax = b x - cb = d b - ed = f ... p - qr = gcd
これを上から b, d, f へと順々に代入していきます。
y - ax = b x - c(y - ax) = d (y - ax) - e(x - c(y - ax)) = f ... Ax + By = gcd
各式は(余り)-(古い余り)(新しい商)=(新しい余り) という形になっています。 各余りが x と y の線型結合で書けるとすると、新しい余りも又、 x と y の 線型結合になります。 結局最終的に Ax + By = gcd という式が得られます。 もし、 x と y が互いに素であれば、これは法を y とすることで、次の A が 得られたことになります。
このようにかけて 1 になる値は、法 y における x の逆元を求めることとな り重要です。 これは RSA 暗号の復号鍵を求める以外にもさまざまな応用があります。 このようにユークリッドの互除法の計算結果を記憶しておいて、入力値の線型 結合で gcd を表すための係数を求める計算を 拡張ユークリッドの互除 法と言います。
本来暗号の安全性を示すには、与えられた資源での解読の不能性を示すべきで すが、計算の不能性を示すのは Lower Bound を示すことであり、非 常に難しい問題です。 そのため、別のアプローチが取られます。 それは難しい問題からの reducibility です。 つまり、もし、対象となる暗号に対して解読機が作られたと仮定した時、そ の解読機を使うと別の難しい問題を解くことが可能になることを示します。 これが示せれば、暗号の解読がその別の難しい問題と同程度以上であることが 示せます( )。
しかし、 RSA に関してはこのようなことは示されていません。 これからお話することは、RSA の暗号の 1 bit の解読の難しさです。 これは 1 bit だけを解読する解読機があったと仮定すると、 RSA を解読でき ることを示します。 一部だけ解ければ、全体が解けるという結果は、脆弱なように見えますが、実 際は reducibility により、 を示していることになります。 は自明なので、 を示していることになります。 つまり、 RSA が安全である限り、 1 bit だけ情報が洩れることが無いことを 示します。
公開暗号鍵 E(x)=xe mod N に対して、 E(x) から x の上位 1 bit が分かると仮定して、乱数を使って RSA 暗号が高い確率で解読できるア ルゴリズムを示します。
暗号文 y=E(x) (x は秘密) が与えられたとします。 このとき、乱数 a を選び、 aey mod N = yE(a) は計算できます。 これは実際には E(ax) を求めていることになります。 ここで、1bit 解読機を使って、 a1, a2 を ax mod N の上位が 0 となるように選びます。
証明のアイディアは a1x と a2x の gcd を拡張ユー クリッド互除法により求めることにより、 x を求めます。 以下、 RSA の暗号鍵越しにユークリッドの互除法を行う方法を示します。
これにより、暗号文に y に対して、 1bit 解読機があれば a1x を a2x で割った商が求まり、余りは暗号化した 状態で求まります。 これを繰り返すことで、最終的に gcd が暗号化された形で求まります。 これが 1 かどうかは 1 や 0 の暗号文は用意に求まりますので、簡単に判定 できます。 結局、拡張ユークリッドの互除法を使うと高い確率で A a1x + B a2x = 1 となる A, B は平文のまま求まり ます(割算の商は暗号化せずに求まるため)。 つまり次の式が成り立ちます。
このうち、 A a1 + B a2 は実際に求められるので、再度この値と N とで拡張ユークリッドの互除法を 通常の方法で行うことで、 x を求めることができます。