第0回 RSAへのAttack ~RSAってなに~

どうも。duckです。
RSAへのAttackの記事を書くことにしました。

今回の流れ
RSA暗号の仕組み
Attackの成功条件
Attackする場所



RSA暗号の仕組み

公開:N,e,C
秘密:p,q,d

暗号化
(0)暗号化したい平文mを準備する。
(1)素数p,qを用意する。(N=pqとおく)
(2){\phi(N)}=(p-1)(q-1)と互いに素な自然数eを用意する。
(3)ed \equiv 1 \pmod {\phi(N)}となるdを計算する。
(4)C \equiv m^e \pmod Nが暗号文となる。

復号
C ^ d \bmod Nを計算するとそれが平文となる。
つまりm \equiv C ^ d \pmod N

順に仕組みをみていく。
(0)平文mの数字化
CTFではpythonのライブラリのCrypto.Util.numberの中の関数
bytes_to_longを用いられることが多い。

(1)素数p,qの生成
CTFではpythonのライブラリのCrypto.Util.numberの中の関数
getPrime(ビット数)関数が用いられることが多い。
もしくは、秘匿されたファイルから読みだされていることもある。

(2)eの選択
一般的にe=65537(素数)が選ばれることが多い。
e素数であるから{\phi(N)}eの倍数でない限り{\phi(N)}eは互いに素となる。

(3)dの計算
拡張ユークリッドの互除法を用いる。
参考:CTFで使う数学 前編 - CTFと共に生きる

(4)特になし。

復号できる理由
本質:オイラーの定理に基づく。
参考:CTFで使う数学 後編 - CTFと共に生きる

ed \equiv 1 \pmod {\phi(N)}より、ある整数kを用いて
ed=k{\phi(N)}+1と書ける。

よって
 C ^d \equiv {(m ^e)}^d \equiv m ^{ed} \equiv m ^ {k{\phi(N)}+1}  \equiv m \times {(m ^ k) }^ {\phi(N)} \pmod N
オイラーの定理により{(m ^ k) }^ {\phi(N)} \equiv 1 \pmod Nだから
C ^ d \equiv m \pmod N


公開情報N,e,Cのみから平文mを求めるのが目標である。
現実では適切なパラメータ設定が行われていると考えられるため、公開情報N,e,Cのみから平文mを求めることはできない。
しかしCTFでは不適切なパラメータが設定されているので、そこをついて平文mの入手を目指すこととなる。

もう少し具体的に攻撃が成立する条件を見てみよう。


Attackの成功条件

(a)dがわかる。
(b){\phi(N)}がわかる。
(c)pまたはqがわかる。
(d)なぜかいきなりmがわかる。

理由
(a) C ^ d \equiv m \pmod Nからmがわかる。
(b){\phi(N)},公開情報のeから(3)を実行しdが得られる。以下(a)と同様。
(c){\phi(N)}が計算できるため。以下(b)と同様。
(d)そりゃそうだろ。

これらのどれかをめざす。
Attackの成功条件がわかったところで、どこを見ればいいのかを教える。
具体的な攻撃手法については次回以降まとめていく。


Attackする場所

青文字は解くときに特に注意している部分である。
それ以外は最後に紹介する参考サイトのほうが見やすいのでそちらを見ることを推奨する。(じゃあなんで書いた)
(イ)素数p,qの生成
 -素数p,qが小さすぎる
  具体的にはNのbit数が~300bit程度だと素因数分解が可能。(c)に帰着。
  Nのbit数は最低でも1024bit以上がふつう。
 -特殊な素数を使っている
  フェルマー素数メルセンヌ素数など有名な素数を使っている場合それを利用して素因数分解できる。(c)に帰着。
  素数p,qが秘匿されたファイルから読みだされている場合は試す価値あり。
 -p,qの差p-qが小さすぎる
  フェルマー法により素因数分解できる。(c)に帰着。
  具体的には上位数十ビットが等しい場合などは試してみるといいだろう。
 -p,qの差p-qが大きすぎる、またはp,qのうち片方が極端に小さい
  試し割法で素因数分解できる。(c)に帰着。
  ふつうはp,qのビット数は同じとするので、p,qのbit数が違うときは怪しいと思ったほうが良い。
  素因数分解できない場合でもそこが突破口になりやすい。
(ロ)eの選択
 -eが小さすぎる
  中国剰余定理または実数上でのe乗根を求めることでmが直接求まる。(d)に帰着。
  e=2,3ならまず間違いなくとける。
 -eが大きすぎる
  Wieners attackによりdが求まる。(a)に帰着。
  具体的には[tex:N}と大差ないくらいの大きさだと怪しい。
 e \neq 65537のときは、注意すること。
(ハ)平文mの部分情報の漏洩
 mの一部分がわかる場合coppersmithの定理(CTFで使う数学 後編 - CTFと共に生きる)によりmが直接求まる。
 ただし、一部分といっても大半がわからないと解けないことが多い。(mの半分以上がわかっているとか)(d)に帰着。



最初なのでお世話になっているサイトも紹介しておきます。

攻撃が成立するパラメータの不備がよくまとまっていて神
RSA暗号運用でやってはいけない n のこと #ssmjp
実際の攻撃方法を実装していて神
plain RSAに対する攻撃手法を実装してみる - ももいろテクノロジー

いつもありがとうございます!!!!

具体的な攻撃については次回からやっていきます。