ナップサック暗号方式


Q:

 同じ重さの石が一つもない10個の石を考える。それぞれの重さを例えば

X(0) = 125(g)
X(1) = 375(g)
X(2) = 750(g)
X(3) = 1375(g)
X(4) = 2750(g)
X(5) = 2626(g)
X(6) = 2503(g)
X(7) = 2257(g)
X(8) = 2015(g)
X(9) = 156(g)

としよう。

 さて、この時にこの10個の石を適当に選んである重さの塊を作った。 この重さからどの石を使ったのか見つけるにはどうすればよいか。

A:

 魔法の数字を2つ考えます。その2つを P, Q とします。 P, Q は次の条件を満たすようにします。

条件1:P, Q は共に素数である。
条件2:P > Q である。

 さらに、魔法の数字から別の数字 Y を求めます。 Y は『P×Y + Q×Z = 1』となるような数字で、 Y, Z は整数とします。 この時、次のような魔法の現象が起きるのだそうです。

『P, Q を適切に選んでやる。で、次のような変換をする:

x(0) = ( X(0)×Y ) % Q
x(1) = ( X(1)×Y ) % Q
x(2) = ( X(2)×Y ) % Q
x(3) = ( X(3)×Y ) % Q
x(4) = ( X(4)×Y ) % Q
x(5) = ( X(5)×Y ) % Q
x(6) = ( X(6)×Y ) % Q
x(7) = ( X(7)×Y ) % Q
x(8) = ( X(8)×Y ) % Q
x(9) = ( X(9)×Y ) % Q

 そうすると、あら不思議、x(i) は常に x(0) 〜 x(i-1) までの総合計よりも 大きな数字になる、そんな P, Q の組が必ず存在する。こいつはさらに、

X(0) = ( x(0)×P ) % Q
X(1) = ( x(1)×P ) % Q
X(2) = ( x(2)×P ) % Q
X(3) = ( x(3)×P ) % Q
X(4) = ( x(4)×P ) % Q
X(5) = ( x(5)×P ) % Q
X(6) = ( x(6)×P ) % Q
X(7) = ( x(7)×P ) % Q
X(8) = ( x(8)×P ) % Q
X(9) = ( x(9)×P ) % Q

を満たす。 しかも、

x(2)+x(5)+x(7) = (( X(2)+X(5)+X(7) )×Y ) % Q

のように石をそれぞれ足してやった結果は、変換の後もちゃんと成立する。』

 一体そんなことの何がいいのか。

 仮に魔法の数字、P, Q, と Y が見つかったとしよう。 で、全部変換したとしよう。

 この時仮に ( X(2)+X(5)+X(7) ) から 2, 5, 7 を答える必要があるとしよう。 当然( X(2)+X(5)+X(7) ) を変換すると ある魔法の数字 ( x(2)+x(5)+x(7) ) が出来る。

 さて、この数字、 x(i) の持っている特徴から『x(8) よりは小さい』数字にしかならないのだ。 つまり「8と9は絶対答の中に入らない」ことがわかる。

 さらにこの数字、必ず『x(7)よりは大きい』数字になる。 もし X(7), X(8), X(9) を含んでいなければ、 この数字は X(7) よりも必ず小さくなることが条件からわかっているからだ。

 ということはこの塊は、必ず「7」を含んでいることがわかる。

 次にこの「変換後の数字」から x(7) を引く。 すると、今度はこの残った数字が x(5) と x(6) の間の数字であることがわかり、 そこから必ず「5」を含んでいることがわかる。

 同様にすると結局最後まで全部求めることができ、 どの石が使われているかが全部わかるのだ。

 たぶん、ここまでの段階で何となくわかっる人はわかると思うが、 この方法には激しい弱点がある。 P, Q を見つけるのがとんでもなく面倒なのだ。

上の例は P = 6123, Q = 2999, Y = 24 とすると

x(0) = 1
x(1) = 3
x(2) = 6
x(3) = 11
x(4) = 22
x(5) = 45
x(6) = 92
x(7) = 186
x(8) = 376
x(9) = 745

となる。

 なるけれども、求めるのがたった1通りならば P, Q を求めるよりも総当たりをかけた方が圧倒的にはやい。 しかも、P は X() の個数が大きくなるとそれだけでどんどん大きくなる。 当たり前と言えば当たり前だが。

 従って、複数の組合せに関して求める場合は良いかも知れないが、 そうじゃない場合はこの方法が良いとは限らない(悪いとも限らないが)。

 でも、この方法、魔法を使ってるみたいでかっこいいよね。