pari/gpの話 @ ph/shh/bin ctf勉強会lt

20
1 PARI/GPの話 ytoku 2015-07-09 @ Ph/shh/bin CTF 勉強会 LT1

Upload: ytoku

Post on 12-Aug-2015

509 views

Category:

Software


0 download

TRANSCRIPT

1

PARI/GPの話

ytoku

2015-07-09 @ Ph/shh/bin CTF勉強会 LT1

2

Speaker

徳重佑樹 a.k.a. ytoku● 電気通信大学 M2● 研究分野: Cryptography● Team: MMA, Tokyo Westerns

● Twitter: __ytoku

MMA

Tokyo Westerns = MMA + tuat_mcc

+ CureSecure

3

PARI/GP?

● 計算機代数システム● 整数論に強い

– 因数分解– 代数的数論– 楕円曲線– ...

● PARI: 計算ライブラリ

● GP: スクリプト言語

※1

※1: 本当に硬い合成数の素因数分解はGMP-ECMとかに任せたほうが良い

4

Many equations and algorithms...

5

Wonderland (BkP CTF 2015: Crypto 600)

Serverの挙動:

十分に大きい素数を位数に含む→楕円曲線上の離散対数問題としては絶望的

として 上で演算

6

Wonderland (解法)

サーバは

上で有効か確認していない.(右辺が平方非剰余なら解なし)

存在しない を与えた時に返ってくる値は,実は

上の群における演算結果になっている.

が小さい素数の積

上で離散対数問題が解ける

もし

とは言ったものの……

7

解くためにやる必要のあること

1.楕円曲線上の元の位数を求める

2.位数を素因数分解

3.楕円曲線上の離散対数問題を解く

実装めんどくさい

Schoof's algorithm

Pollard's rho algorithm,p-1 algorithm, p+1 algorithm...

Baby-step giant-step

8

確かに攻撃できるね!それで、時間内にお兄ちゃんに実装できるのかな?

司令官、私がいるじゃない!

9

楕円曲線のセットアップ

p = 2^160 + 7;A = 40638;

E = ellinit([0, -A, 0, 1, 0] * Mod(1, p));

10

楕円曲線の位数

Gx = 5;G = [Gx, ellordinate(E, Gx)[1]];

orderG = ellorder(E, G)

なる元の

点 の位数を求める

? orderG = ellorder(E, G)%6 = 730750818665451459101842825589656562369324838380

11

素因数分解? factor(orderG)%7 = [ 2 2]

[ 5 1]

[ 7 1]

[ 31 1]

[ 5857 1]

[ 3280967 1]

[ 68590573243 1]

[308648791439 1]

[413879086189 1]

12

楕円曲線上の離散対数

x = -サーバから帰ってきた値;Q = [x, ellordinate(E, x)[1]];r = elllog(E, Q, G, orderG)

ここで をサーバに送信し,

を得る.

elllogの所要時間: 10秒程度

13

lift(chinese(Mod(0, 2), Mod(r, orderG)))lift(chinese(Mod(0, 2), Mod(-r, orderG)))

フラグを得られるように調整

● 最後に次の二点を調整してフラグが得られる– Gの位数 が E'の位数/2 だった

– y座標が±yどちらなのかわからない● サーバからの返答にはy座標が含まれない

Modを外しているだけ Chinese Reminder Theorem

14

攻撃法は知ってるけど原理は知らないって……

ね、簡単でしょう?

ちゃんとアルゴリズムも勉強しておきましょう

15

PARI/GPにだって……できないことぐらい……

16

16進数リテラル対応してねぇ!

17

[本題]PARI/GPに対する

16進数リテラルの実装

ytoku

2015-07-09 @ Ph/shh/bin CTF勉強会 LT1

18

やったこと

● yylex:– 0xで始まるトークンをKHEXに

● parse.y: – KHEXトークンを構文木でCSThexに

● compile.c, anal.c:– CSThexから多倍長整数に読み取り

● ようするに

– 10進数の処理をコピペして16進数に対応させただけ

19

16進数 入力できます!

? p = 0x100000000%1 = 4294967296? p = 0xfffffffffffffffff%2 = 295147905179352825855

? p = 0 x f f f f%3 = 65535

実はGPの仕様上変なところにスペースが入っても大丈夫(10進数も同じ)

20

パッチの入手はこちらから

https://goo.gl/Qab0N0URLは後でTwitterにでも

PARI/GPで素敵な暗号解読ライフを.ご清聴ありがとうございました.

逆引き辞典「CTFと現代暗号のためのPARI/GP」もよろしくhttps://wiki.mma.club.uec.ac.jp/CTF/Toolkit/PariGP