pari/gpの話 @ ph/shh/bin ctf勉強会lt
Post on 12-Aug-2015
509 Views
Preview:
TRANSCRIPT
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とかに任せたほうが良い
6
Wonderland (解法)
サーバは
上で有効か確認していない.(右辺が平方非剰余なら解なし)
が
存在しない を与えた時に返ってくる値は,実は
上の群における演算結果になっている.
が小さい素数の積
上で離散対数問題が解ける
もし
とは言ったものの……
7
解くためにやる必要のあること
1.楕円曲線上の元の位数を求める
2.位数を素因数分解
3.楕円曲線上の離散対数問題を解く
実装めんどくさい
Schoof's algorithm
Pollard's rho algorithm,p-1 algorithm, p+1 algorithm...
Baby-step giant-step
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
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進数も同じ)
top related