ROCAと離散対数問題
ROCA
原論文はhttps://acmccs.github.io/papers/p1631-nemecA.pdfです。
RSALibで生成された素数を利用したRSA暗号に関する脆弱性です。
RSALibで生成される素数の特徴
本記事では512bitの例を扱います。RSALibで生成される素数は次のような形をしています。
はを法としたの乗を表します。ここで、は素数を小さい順に39個かけ合わせた数です。
を決定するパラメータは37bitのおよび62bitのだけで、99bitの空間しかなく、512bitの素数全体の空間にくらべ非常に小さいです。
さて、この特徴をもつ素数から生成される公開鍵は次の特徴をもちます。
(特徴)合同式が解をもつ
を解く
本来離散対数問題を解くのはとてもむずかしいのですが、この場合は手元のPythonでも数秒もかからず解けてしまいます。
方針はシンプルで、まずとなる各に対しもとの方程式を分解して
の形の連立合同式にします。
それぞれの合同式は全探索することに簡単に解けます。は非常に小さいですから、を0からまで動かしてみて、と合同になるものを調べていきます。 なお、そのようなが見つからなかった場合、もとの方程式にも解がないことになりますので、その場合はRSALibによって生成された素数からなる公開鍵ではありません。
が見つかったとします(と置きましょう)。次に、65537の位数を調べます。つまり、となるような最小のを探します。は巡回群の性質より必ず存在し、合同式の解はの形で一般化されます。
を探す作業もたかだか回の探索で見つかるので十分高速です。
これらの合同式をそれぞれ解き、最後に中国剰余定理により連立合同式の解が一般に求められます。 が合成数のとき、中国剰余定理が使えないと思うかもしれませんが、の各素因数について、のをそれぞれの素因数に置き換えた合同式が成り立つので、これらで代用すれば中国剰余定理が使えます。
という形になったとします。しかしこのはすべてが
を満たすとは限りません。なぜならがに比べて小さいからです。しかし、ぐらいまでにはもとの合同式を満たすにヒットするので順番にを変えていくことでもとの方程式の解を簡単に調べることができます。
混乱しやすいポイント
連立合同式
を解くとき、法について中国剰余定理を使うと思いがちですが、は法に関して決まるので、ここに注意してください。 また、どうしは一般に互いに素とは限りませんから、中国剰余定理の結果得られる解はよりずっと小さい法に関して決まります。
より大きな入力での離散対数問題
ROCAでは、それぞれの合同式を解く際に全探索でも十分高速ですが、全探索が難しくなってくると、Baby-step Giant-stepアルゴリズムや、Pohlig-Hellmanアルゴリズムが活躍するようになってきます。