🍣
SECCON13 final [crypto] DLP+
問題文が短いし簡単そ~と思ったら、意外と大変だった
問題
まず好きな素数
解法
- そもそも離散対数だけでも
にいい条件がないと難しいのに、p なんてまともに扱えるわけがないので、どちらかの位数が小さくないと困りそう。ただどっちも小さいとg^x + h^x を特定するのに十分な情報量がなくなるのでそもそも不可能(あとどっちも小さくするのは難しそう)。x - というわけで、
の位数が小さい、つまりg = (p-1)/2 の位数が小さいような素数2 であって、p を底とする離散対数がそこそこ速く解けるような素数h を取るのを目標にした。p - こうすると、
を全探索できるので、g^x \mod p からh^x = r-g^x を求める離散対数を全部試せば良いx
- こうすると、
-
の位数が小さい素数として思いつくのはメルセンヌ素数、フェルマー素数、あるいは2 や2^n-1 自体が素数じゃなくてもその素因数、とか。2^n+1 - 一方で、
側の離散対数を高速に解きたいため、(Pohlig–Hellman を使いたいので)h の素因数がそこそこ小さい、具体的にはp-1 bit 程度で収まっていてほしい、という要請もある。40 - メルセンヌ素数
なら、p = 2^m-1 がそこそこ素因数分解できると期待できるので色々試していたが、どれも結局かなり大きな素因数も残ってしまうので困っていたところ、kobaさんに「Pohlig-Hellman は要は最後に各(p-1 = 2(2^{m-1}-1) の)素因数p-1 での離散対数を求めて中国剰余定理してるだけなので、q がx bit しかないなら大きい素因数は無視して小さい素因数だけで512 bit 分集まれば良い」と言われて、たしかに~~~となった512 - sage の
trial_division
とかを使って色々試すと、 のp = 2^{2281}-1 bit 以下の素因数だけで33 bit 分集まることがわかったので、これを使うことにした512 - とはいえ、
の位数 (g の位数) は= -(1/2) なので、"2m = 4562 bit 程度の離散対数をいくつか" を33 回解くことになり、余裕で間に合わない4562 - 高速化の一つは、離散対数を baby-giant で解くときに、クエリが大量に来る場合は前計算を重めにしてクエリ時に探索する側を軽くするという競プロでありがちなやつで、これをやると
回解くのに1 秒くらいになった1 - もう一つより大事だったのは、
が素因数p-1 = 2(2^{m-1}-1) を持つことだった(フェルマーの小定理)。なぜこれが嬉しいかというと、m=2281 側の値を全探索する際にg^x の値は分かっているので、e_g := x \mod 2m 側の離散対数で求まったh とこの値が矛盾するならその時点で不適なことがわかる。x \mod m - なので
を fix したあとまずはじめにg^x 側のh の離散対数だけやって、これが矛盾してないときだけ残りの大きい素数たちでも離散対数を解いてx \mod m を復元し、最後に実際に解になってるか判定 とすると、最後まで候補として残るx が数通りくらいにまで減るので、十分高速になったe_g
Discussion