CTFにおけるCrypto入門とまとめの1つです。
- 楕円曲線
- 楕円曲線暗号: ECC: Elliptic Curve Cryptography と楕円曲線上の離散対数問題 ECDLP: Elliptic Curve Discrete Logarithm Problem
- 楕円ペアリング
- モンゴメリー曲線 Montgomery
- 超楕円曲線暗号
- 同種写像 isogeny
- 巻末資料
体系的に理解できておらず、殴り書きです。何も分からん。
楕円曲線
- 楕円曲線: 体Kに対して y2+a_1xy+a_3y = x3 + a_2x2+a_4x + a_6 を満たす解の集合を楕円曲線と呼ぶ
- 数学的には、楕円曲線とは種数1の非特異代数曲線のことを指す。その中でもワイエルシュトラスの標準形が一般的な表現形式の1つ
- Weierstrass 方程式: y2+a_1xy+a_3y = x3 + a_2x2+a_4x + a_6
- ワイエルシュトラスの標準形
y^2 = x^3 + ax + b - 表現方法: アフィン座標(x,y) -> 投影座標[X:Y:Z]
- 体Kいろいろ
- 体の標数 ch(K): 1を何回足したら0になるのかという数。どんな数も標数倍すると必ず0になる
- 体Fとその演算+と演算*について
- 演算+に関してFは群であり、かつ任意の要素a,bに関してa+b=b+a(可換群)
- 演算*に関してFは+の単位元0を除くと可換群であり、0には逆元が無い
- *と+に対して分配法則が成り立つ。つまり、
(a+b)*c=a*c+b*cでありc*(a+b)=c*a+c*b
- 有限体 GF(q): mod qの整数のみで構成した体
- 素体 Fp: 素数mod
- 剰余環の表記を使ってZ/Zpみたいに書いたりする?
- mod 素数はガロア体になる?
- 確かに自然に受け入れていたが、素数modの有限体であれば、楕円曲線の加法の性質が全て保存される https://leonahioki.medium.com/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E3%81%AE%E5%A4%A2%E3%81%AE%E5%9B%BD%E3%81%AB%E4%BD%8F%E3%82%82%E3%81%86-12dcc675995a
- これは有限体であれば全てそうなんだろうか。それとも、有限体の中でも条件がある?体であればいい?
- 拡大体 Fpn
- フロベニウス写像:有限体に存在する重要な準同型写像
F(r) = r^pF(rs)=F(r)F(s)であり、また、mod q上にあるので、F(r+s)=F(r)+F(s)でもある- よって、これは環準同型である
- Fp上の種数1の非特異射影代数曲線である楕円曲線Eは
Y^2 = X^3 + aX + b (a,b ∈ Fp, 4a^3+27b^2 != 0)と書けて、
- 素体 Fp: 素数mod
- Zmod(p*q)とかでもいける。何でもいいの? https://qiita.com/kusano_k/items/1e90d8a0840c7e23ef75#43-show-me-your-private-key-crypto-200-points
- これは体ではないくない?
- 有理数Q上の楕円曲線 https://chocorusk.hatenablog.com/entry/2023/04/23/183504#dice-vs-kymn-crypto
- 実数R上の楕円曲線もある?
- ちなみに、整数は乗法逆元が無いので体にならない(有理数は体)
- 楕円曲線E上の点に対して特殊な演算を定義して、無限遠点を足すと群になる
- この楕円曲線上の二点A,Bに対してA+Bの足し算を定義する(無限遠点を0として定義すると、交換法則・結合法則が成り立つ。可換群)
- A(x,y)に対する逆数は-A(x,-y)とx座標で反転させた点になる
- A(x1,y1) + B(x2,y2) = C(x3,y3)
- x3 = φ2 - x1 - x2
- y3 = -φ x3 - ψ
- φ = (y2 - y1) / (x2 - x1)
- ψ = (y1 x2 - y2 x1) / (x2 - x1)
- 可換群であるため、掛け算が定義可能になる
- 3R = R + R + R
- 同様の定義で楕円曲線の有理点のなす群と考えたものをMordell-Weil群という(?)
- 楕円曲面の Mordell-Weil 群には格子の構造が入るらしい(???)
- スカラー倍について
- 楕円曲線の位数 #E(Fp): mod p上の楕円曲線上にある点の総数のこと
- この、楕円曲線上の全ての点は特殊な加法を導入することで群を成す
- Schoof法:楕円曲線E/Fqの位数#E(Fq)をO(log8q)で求めるアルゴリズム
- sagemathだと
EC.order()で計算可能EllipticCurve(GF(p^3, 'x'), [a,b]).order()のように'x'と明記すると計算が早くなるらしい https://github.com/hackthebox/cyber-apocalypse-2025/tree/main/crypto/Kewiri
- なお、楕円曲線の一般的な位数計算は未解決問題
- 楕円曲線上の「点Pの位数」とは,rP=Oとなる最小の正整数rである.位数は常に存在し,楕円曲線の位数 #E(Fq)を割り切る
- 位数は「巡回群の位数」から来ており、gn=e(単位元)となるnのことを巡回群の位数と呼ぶ
- n-等分点: 楕円曲線Eの点Pについてn倍したら単位元OとなるPの呼び方
- ねじれ群:
- n-等分点の集合をn-ねじれ群E[n]という
E[n] = {P ∈ E | nP=O} - 等分多項式: 楕円曲線の加法公式から計算できるn-ねじれ点のx座標を根に持つ多項式
- https://en.wikipedia.org/wiki/Division_polynomials
- sagemathだとn-等分多項式は
E.division_polynomial(n)で計算可能 - Ricerca CTF 2023 dice-vs-kymn
- https://ricercasecurity.blogspot.com/2023/06/ricerca-ctf-2023-writeup-crypto.html
- 等分多項式は
division_polynomial(a, b, x, n)のような入力から計算するので、x,nが既知のとき、それを使ってa,bを計算することができる。 - n=6固定でxは与えられる状態からa,bを特定したいので、a,b,xを変数として多項式を作って、xを入力して根となるa,bを求めたいので、出てきた多項式を因数分解して、xの解がn=6以上のものを採用して、そこから無茶苦茶頑張ってa,bをxで表現する(分からん)
- a,bは整数Zのものだが、気にせず計算していいっぽい
- sagemath https://doc.sagemath.org/html/en/reference/arithmetic_curves/sage/schemes/elliptic_curves/ell_torsion.html
- torsion_subgroup()
- torsion_orderみたいなやつもあったはず
- n-等分点の集合をn-ねじれ群E[n]という
- 楕円曲線の位数を割り切るので、逆言うと特定の位数を持つ点を期待するのであれば、楕円曲線の位数はその数の倍数である必要がある(ラグランジュの定理)
- 楕円曲線上には様々な位数を持つ点が存在する
- 第一の生成元: 位数が最大の巡回部分群を生成する基準点の1つを返す
- sagemathだと
E.gens()で全ての生成元を取ってこれる。E.gen(0)と書くとそこから1つ取れる
- sagemathだと
- 特定の位数oの点を得るには、ランダムに点を取り×(楕円曲線の位数/o)を計算して0でなければ、位数oの点が得られる
- Hasse の定理
- 群構造
- 安全曲線 https://www.fujitsu.com/downloads/JP/archive/imgjp/jmag/vol50-4/paper06.pdf
- sagemathでx座標から点を求めるときは、
A = E.lift_x([x座標])とする - SageMathが曲線を初期化できない -> 曲線が壊れている -> 楕円曲線に置いて壊れているというのは「特異である」ということ
- 曲線によって、色々な性質が出てきたり、計算が高速化できたりする
- 規格化されたものはここにまとまっている https://neuromancer.sk/std/nist/P-256
- BLS12-381曲線 a=0,b=4、つまり、y2 = x3 + 4
- AlpacaHack Round 3: A Dance of Add and Mul
- https://hackmd.io/@benjaminion/bls12-381#Motivation
- secp256k1 a=0,b=7としてy2=x3+7
- curve25519
EllipticCurve(GF(2^255-19),[0,486662,0,1,0])- montgomery形式だが楕円曲線
- ed25519 ツイストエドワーズ曲線
- 位数が2256程度の群。正確には楕円曲線ではないらしい
- paring friendly curves
- BN254 (also called alt_bn_128 or BN128)
- BLS12-381
- NIST P-256: ecdsa-sha2-nistp256で使われる。これも位数が2256程度の群
- 楕円曲線DB https://www.lmfdb.org/EllipticCurve/Q/?jinv=-3375&surj_quantifier=include&count=100
- 色々な楕円曲線
- ワイエルシュトラス
y^2+a_1xy+a_3y = x^3 + a_2x^2+a_4x + a_6かy^2 = x^3 + ax + bで定義され座標は(x,y) - モンゴメリー曲線 Montgomery
y^2=x^3+Ax^2+x - Edwards形式 x2 + y2 = 1 + dx2y2
- sageでやるとき。p,c2,d
PR.<x, y> = PolynomialRing(GF(p)) f = y^2 - (x - c^4*d - 1) * (x^2 - 4*c^4*d) EC = EllipticCurve(f) P_EC = EC(Px, Py) S_EC = EC(Sx, Sy) s = P_EC.discrete_log(S_EC) - P,Q,sP,tQの点からEdwards curveのパラメタを頑張って求められる https://blog.y011d4.com/20210801-crypto-ctf-writeup#rohald
- sageでやるとき。p,c2,d
- ツイストエドワーズ曲線
- バイナリエドワーズ曲線
- Hessian形式
- ねじれたヘッセ曲線
- ヤコビ四次関数
- ハフ曲線
- 他にも https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E6%9A%97%E5%8F%B7%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF にある
- sagemathの楕円曲線の定義の仕方
EllipticCurve([a1,a2,a3,a4,a6])Weierstrass標準形の係数から作成EllipticCurve_from_j(j0)j-不変量の値から作成EllipticCurve('label')Cremona databaseと呼ばれる楕円曲線のデータベース上に登録されたラベルから作成- https://www.lmfdb.org/EllipticCurve/Q/910c1/ なら"910c1"を入れる
EllipticCurve_from_cubic3次曲線から構成- 戻り値はECではなく、双有理写像が与えられる
- ワイエルシュトラス
- 有限体上の楕円曲線は通常曲線と超特異曲線に分類できる
- 標数p上の超特異曲線は…
- 約p/12個存在する。つまり、ランダムに曲線を生成したとき超特異である確率はおおよそ1/p
- 全てFp2上で定義される(これ大事では?)
- j-不変量を鍵として共有するときサイズは2logpくらい
- Tateの定理:超特異曲線と同種な曲線は超特異
- 超特異曲線Eは位数で特徴づけられる
#E(Fp) = p+1#E(Fp^2) = (p+1)^2 または (p-1)^2
- 標数p上の超特異曲線は…
- 判別式D、j-不変量が固定であれば、位数と素数の間に固定的な関係があるかも
- ハッセの定理
- フロベニウス跡、トレース t を使って、
#E(Fp) = p+1-t
- 色んな情報から、もともとの楕円曲線を導く
- 加法計算と倍数計算が分かっているとき -> idekctf 2025 - Sadness ECC Revenge https://giapppp.github.io/posts/idekctf-2025/
- dy/dxを導く | dy/dx=2x/3(y-1337)2
- 分数をなくす | 2xdx = 3(y-1337)2dy
- 積分 | ∫2xdx = ∫3(y-1337)2dy
- x2 = (y-1337)3 + C
- サンプルを使ってCを特定
- 計算を書き下して連立方程式とかgcdとか方程式とか https://blog.y011d4.com/20210801-crypto-ctf-writeup#double-miff
- 加法計算と倍数計算が分かっているとき -> idekctf 2025 - Sadness ECC Revenge https://giapppp.github.io/posts/idekctf-2025/
- sagemathでP(x,y)から定数倍をしたときのQの多項式表現が得られる
E.multiplication_by_m(2)とすると((x^4 + 2*x^2 - 24*x + 1)/(4*x^3 - 4*x + 12),(8*x^6*y - 40*x^4*y + 480*x^3*y - 40*x^2*y + 96*x*y - 568*y)/(64*x^6 - 128*x^4 + 384*x^3 + 64*x^2 - 384*x + 576))が得られる。x座標はxの多項式になり、次数はk2になるE.multiplication_by_m(2, x_only=True)とすればx座標のみ得られる- https://github.com/ImaginaryCTF/ImaginaryCTF-2025-Challenges/blob/main/Crypto/scalar-division/solve2.sage
poly = E.multiplication_by_m(k,1)でk倍した表現を得て、定数倍した後のx座標Qxが分かっているので、poly = poly.numerator()-Qx*poly.denominator()という多項式が得られて、R.<x> = PolynomialRing(GF(p))のように多項式環を作ってpoly = R(poly)と変換し、mod pなのでpoly2 = pow(x,p,poly)-xも同様に成り立ち、これでfinal = poly.gcd(poly2)のように多項式のGCDをして簡約してroots = final.roots()のように根を取れば元々のxが分かる
- j-不変量
F = GF(p)でE = EllipticCurve(F, [1, 2])のとき- F(1728) * F(4*1) ** 3 / F(E.discriminant())で計算- 楕円曲線の同型類を考えるためのもの
- 性質の良い楕円曲線を探す https://github.com/Sarkoxed/ctf-writeups/blob/master/trx-2025/magic_curves/solve.py
- 以下の条件を満たす(p,a,b)を探す例
- Fp上の2つの楕円曲線、y2=x3+ax+bとy2=x3+bx+aが同型である
- 同型であるということは位数が等しいということだが、その位数がsmoothである
- 写像x→λxを使って色々変形すると、b/λ2=aかつa/λ3=bを満たせばよく、これはλ5=1を満たすλを選べば、この条件が満たされる。λ5=1を満たすλを見つけるためにはFpの位数が5の倍数である必要があるため、p-1が5の倍数であるpを最初に選択している。それで1の5乗根を取ってλとして、Fp乗の適当な元をaとして、そこからλを使ってb=a/λ3で計算し、あとは生成した楕円曲線の位数がsmoothであることを確認する。
- 以下の条件を満たす(p,a,b)を探す例
楕円曲線暗号: ECC: Elliptic Curve Cryptography と楕円曲線上の離散対数問題 ECDLP: Elliptic Curve Discrete Logarithm Problem
- ECC: Elliptic Curve Cryptography
- 楕円曲線を使う暗号プリミティブを総称して楕円曲線暗号方式と呼ぶ
- ECDLPを背景とした、元々の離散対数問題を背景とした方式を拡張したもの
- DH鍵共有 -> ECDH鍵共有
- Union CTF human server
- 鍵交換に不要なnonceのxorを追加したせいで壊れた例
- https://blog.y011d4.com/20210222-unionctf-writeup#human-server
- https://words.filippo.io/telegram-ecdh/
- Union CTF human server
- ElGamal暗号 -> 楕円ElGamal暗号
- DSA署名 -> ECDSA署名
- DH鍵共有 -> ECDH鍵共有
- 以下の楕円曲線と生成元を公開パラメタとして使う
- CurveBall CVE-2020-0601: Q=dPでQとPが固定のときdを解くのは難しいが、Qが与えられてdとPを自由に決められるなら、等式を満たすdとPをQから決めるのは簡単。d=2とかにしてP=Q/dすればいい。
ECDLP 楕円曲線における離散対数問題
- ECDLP: 楕円曲線上の点P,QについてQ=dPという関係があるとき、P,Qからdを求めることが難しい
- 以下、解き方
- 楕円曲線の位数が小さいのでsageのdiscrete_logで殴ると解けます sG=Qならば
s = G.discrete_log(Q)- CSAW CTF Qualification Round 2019 Supercurve https://furutsuki.hatenablog.com/entry/2020/05/05/112207
log(A,G)でも殴れる。discrete_logとの違いは分からないが、logだとSSSA Attackを自動でやってくれるっぽい?- いや、discrete_logはdepricatedな書き方で中身は同じっぽい?
- BSGS: Baby-step-giant-step, 平方根法
- 楕円曲線の位数が小さいときに使える。位数N=#Eであり、m=sqrt(N)とすると、d=am+bと書くことができ、
Q=(am+b)PでQ-bP=a(mP)と変形でき、左辺右辺を0≦a,b<mの範囲で全探索して一致するものを探す- sagemathであればdiscrete_logを使えば自動でPohlig–Hellman法+BSGSしてくれる
- が、進捗が見えないので、tqdmで進捗を可視化した例がこちら https://github.com/Sarkoxed/ctf-writeups/blob/master/trx-2025/magic_curves/solve.py
- Pollardのρ法、λ 法 (kangaroo-algorithm) ?
- PHS法: Pohling-Hellman-Silverman法
- 曲線の位数が小さい素因数の積の形に分解できる、つまり、位数が Smooth numberであれば適用可能。楕円曲線暗号の楕円曲線の位数は細かく素因数分解できることが多いので RSA とかと違って実用的な手法らしい。
#E=p1^e1 p2^e2 ... pk^ekとなるとき、O(ei sqrt(pi))でECDLPが解ける- https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#pohlig-hellman が無茶苦茶分かりやすい
G=xPであり、#E=A*BのときG'=B*GしてP'=B*Pして、G'.discrete_log(P')で離散対数して、k'を得る- 同様にk''を得る
CRT(k', k'', A, B)で答えを得る
- https://chocorusk.hatenablog.com/entry/2024/09/16/001208#A-Dance-of-Add-and-Mul
- picoCTF 2017 ECC2 https://furutsuki.hatenablog.com/entry/2020/05/05/112207
- Index Calculus Algorithm https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#index-calculus-algorithm
- SSSA(:Semaev-Smart-Satoh-Araki) Attack: Fp上の楕円曲線Eについて#E=pである、つまり、Anomalous な曲線(アノマラス曲線)であれば適用可能で、Fp+上(有限体の加法群上)のDLPに帰着できる
- SSSA Attack, Smart Attack
- 攻撃手順 アノマラス曲線E(Fp)と、その上の点P,Q、また、Q=nPであるときのnを求めることを考える
- p進数への持ち上げ: Fp上の点PとQをp進数体Qp上の楕円曲線上E'の点P'とQ'に持ち上げる。(Hensel Lift, Henselの補題などを使って行う)
- 持ち上げ後はp進数上の楕円曲線であり、これは拡大体とは異なり、p進体Qp(または、p進整数環Zp)上で定義された楕円曲線
- 拡大体は a0 + a1 x みたいな式だったが、そうではなく普通に[0, p2)みたいに純粋に累乗modとして考えたもの(多分)
- 拡大体はGF(pn)で、p進数はZmod(pn)
- p進数はa= a0 + a1p + a2p2 + ...という形の無限級数で表現されるもの。Smart AttackではFp上の曲線を同型のZp上の曲線に持ち上げる
- 持ち上げるときの精度はp2の精度で十分。Smart Attackの目的は形式群を使って離散対数を計算することで、そのためにはmod p-2の情報があれば十分
- 楕円曲線の点のHensel Lifting
- つまりは、mod pをmod p2に変換する。Fp上の点P=(x0, y0)をZp上の(mod p2の)点P'=(X, Y)に持ち上げる。mod p2と2乗で止めているのは近似的であるらしいがmod pで計算する場合はこの精度で問題ないとのこと。
- mod p2で定義する。 X=x0+tp (mod p2), Y=y0+sp (mod p2)とする。これならmod pで元々の点Pと一致する
- 持ち上げられた点はY2=X3+AX+B (mod p2)を満たす必要があるので、代入して整理し、mod pに変換して計算していくと、sとtの関係式を作ることができ、片方を固定すれば片方が決まり、s,tを決定できる。具体的には s = (3x02+A)t/(2y0) mod p
- 別の方法 https://mslc.ctf.su/wp/polictf-2012-crypto-500/ (上の式間違ってない?)
- X=x0 mod p2のままにして、Y=y0 + tp mod p2としてtを計算する(上のやり方で片方を0にしているだけ)
- fr = y2 - (x3 + Ax + B)としたとき t = -fr/(2yp) mod p
- つまりは、mod pをmod p2に変換する。Fp上の点P=(x0, y0)をZp上の(mod p2の)点P'=(X, Y)に持ち上げる。mod p2と2乗で止めているのは近似的であるらしいがmod pで計算する場合はこの精度で問題ないとのこと。
- 2番目の写像Φが同型である持ち上げ写像を利用する必要があり、そのためにAnomalousな曲線である必要がある? https://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1814-10.pdf
- ちゃんと持ち上げをしなくても適当に(x,y) → (x,py)と変換してしまって、それに合うようにA,Bを作り直すという方法もある https://mslc.ctf.su/wp/polictf-2012-crypto-500/
- 持ち上げ後はp進数上の楕円曲線であり、これは拡大体とは異なり、p進体Qp(または、p進整数環Zp)上で定義された楕円曲線
- 形式群への写像: p進楕円曲線から加法群への同型写像Φを構築する。Φ:E'(Qp) → p Zpという準同型写像を使う
- 具体的には、点P(x,y)のとき、Φ(P)=-x/y mod p2 とする。←なんか違う? Claudeが出してきたやつ
- あんこさん https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#anomalous-%E3%81%AA%E6%9B%B2%E7%B7%9A%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84-(sssa-attack)
- Φ(P) = (xp-1 - x1)/(p(yp-1 - y1)) mod p2
- hellmanさんもいっしょ https://mslc.ctf.su/wp/polictf-2012-crypto-500/
- Kobaさん https://github.com/koba-e964/code-reading/tree/master/algorithm/smart-attack
- Φ(P) = pPを計算したときのx座標?なんも分からん
- https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/smart_attack.py と一緒で Φ(P)はpPとしてx/y?
- Φ(P) = pPを計算したときのx座標?なんも分からん
- これが以下を満たす。この写像がミソなんだと思うが、どういう難しさをクリアしているのかすらわからん
- 準同型性: Φ(P+Q) = Φ(P) + Φ(Q)
- 出力は常にpの倍数: Φ(P) ∈ p Zp
- pねじれ点との交わりは無限遠のみ kerΦ ∩ E[p] = {0}
- p進数体Qp上の楕円曲線E'に付随した形式群の対数関数を用いて、Z/pZへの同型写像λEを構成している。ということらしい
- 離散対数の計算: Φ(P')=a, Φ(Q')=bとすると、Φ(Q')=nΦ(P') mod p2が成立する。つまり、b=na mod p2であり、逆数を取ればn=b/a mod p2でnが求まる
- https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/smart_attack.py の実装を見ると上をやってる
- p進数への持ち上げ: Fp上の点PとQをp進数体Qp上の楕円曲線上E'の点P'とQ'に持ち上げる。(Hensel Lift, Henselの補題などを使って行う)
- SSSA Attackの説明で
0 → ker π → E(Qp) -π→ E(Fp) → 0というのがある - shihoさんの説明「 pべきでmodを取っていることからp進数体に持ち上げる攻撃が最も高速です. すなわち, Nを mod p上での 楕円曲線 y2=x3+ax+bの位数とするとき, N倍写像の像はその楕円曲線の形式群に含まれますから, 形式対数を取って割ればECDLPは解けます」https://gmo-cybersecurity.com/blog/ierae-ctf-2024-writeup-crypto/
- あまりよく分かっていないが p進数体 とは?
- p進数体は、通常の10進数や2進数のような数の表し方ですが、基数がpで、特に「pで割り切れる回数」に注目します。
- 距離の概念が少し違うらしい
- 攻撃実装例
- やるだけならライブラリでシュッとできる https://hackmd.io/@FurgjSzLSjeQo0q8zgTaqQ/HJT3Raboyx#Customizable-EC
- O((logp)3)で解ける
- https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#anomalous-%E3%81%AA%E6%9B%B2%E7%B7%9A%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84-(sssa-attack)
- 多分理論を最も分かりやすく書いているであろう日本語の論文 https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/61761/1/1026-15.pdf
- Easy? ECDLP -> modpで見ると楕円曲線の位数がちょうどpになっているので、SSSA attackでsecret modpが求まる。あとはzer0pts ctf 2021 pure divisionと同様にmodp4にliftできる https://hackmd.io/@mitsu/ByhK-tZX_
- ecpyにソルバーがある https://furutsuki.hatenablog.com/entry/2020/05/05/112207#ptr-yudai%E3%81%AE%E7%99%BA%E8%A1%A8:~:text=print(m)-,TJCTF%202016%20Curvature2,-Anomalous%E3%81%AA%E6%9B%B2%E7%B7%9A https://github.com/elliptic-shiho/ecpy/tree/master
- TJCTF 2016 Curvature2 https://furutsuki.hatenablog.com/entry/2020/05/05/112207
- 実装例 https://gist.github.com/saitenntaisei/d6c05c10276aaf3865fefd18fb331ccd
- ガチすぎる。助けて https://github.com/koba-e964/code-reading/tree/master/algorithm/smart-attack
- https://blog.y011d4.com/20221207-crypto-highlight#hitcon-ctf-2022-chimera
- zer0pts pure division
- https://www.nayuki.io/page/elliptic-curve-point-addition-in-projective-coordinates
- https://www.cryptrec.go.jp/exreport/cryptrec-ex-3001-2020.pdf
- Anomalous curveの生成 https://github.com/koba-e964/code-reading/tree/master/algorithm/gen-anomalous
- [類題] 似たような話として、楕円曲線E(Z/p2Z)やE(Z/q2Z)上では、解がp,q以下の場合、簡単に離散対数問題が解けるということがある。zer0pts 2021 - pure division
- 作問者writeup https://mitsu1119.github.io/blog/p/zer0pts-ctf-2021-writeup-%E6%97%A5%E6%9C%AC%E8%AA%9E/
- Z/p3Z上での楕円曲線でECDLPする問題
- Z/pnZは精度n桁のQpを見ることができる。この問題はSSSA Attackの持ち上げ後からスタートと考えればいい?違いそう。
- これはSSSA Attackと似たような整理なのでなんとなく分かる:還元写像πをP2(Qp)→P2(Fp)、εをEの形式群、Φ: ker π ∋ (x,y) ↦ -x/y ∈ P2(Q)とすれば、
ker π -Φ→ ε(pZp) -logε→ pZpという同型写像が構成可能 - 分からん: P ∈ E(Qp)に対して N=#Ef(Fp)とすれば、NP ∈ kerπなので、E(Qp) → ker π → pZp
- 分からん: pZp ≃ Fp+なので、同型写像で変換していくことでFp上の問題に帰着でき、後は割り算でECDLPが解ける。
- hellman https://affine.group/writeup/2021-01-Zer0pts#pure-division
Fp = Zmod(p**3)のようにZ/p3Zが定義されていて、E = EllipticCurve(Fp, [a1, a2])のようにECを作っているordp = E.change_ring(GF(p)).order()のようにGF(p)に変換して位数を計算する。(が、これはブログを見ると分かるが#E(Fp) != pである- ここで、普通のSSSA Attackのように、つまり、Z/p3Z上での楕円曲線を持ち上げ後の楕円曲線として考えて、
ordp*Sをしてみると、エラーになる(pで割り切れるらしい) - なので、
Z/p^3Zではなく、Qpにringを変換してやって、同様のことをする。 EQp = E.change_ring(Qp(p))として、pS = EQp(S)*ordpとpT = EQp(T)*ordpのようにしてやる。これならうまくいく- これは、SSSA Attackの時にもあった、持ち上げ後に零写像になってしまうことがあり、その場合は持ち上げのやり方を変えてやれば成功する的な話だろうか
- あとは、同様に形式対数を取って、Fp上に同型写像して、割ればいいので、
sol = ZZ((pT[0] / pT[1]) / (pS[0] / pS[1]))で解ける- このパートが一番良く分からんくて、anomalousな曲線ではないと思うのだが、これがうまくいく理由が分からない
- sagemathだと
Bin(sol).bytesとすればint2bytesできるらしい。知らんかった
- https://rkm0959.tistory.com/213
- 作問者writeup https://mitsu1119.github.io/blog/p/zer0pts-ctf-2021-writeup-%E6%97%A5%E6%9C%AC%E8%AA%9E/
- [類題] IERAE CTF 2024 - Heady Heights
- [類題] TSGCTF2024 - Easy? ECDLP
- Zp4でのECDLPを解く問題。
#E(Fp)=pであり、SSSA Attackが使える - https://hackmd.io/@yu1hpa/Hk_1GznV1l#Easy-ECDLP
- SSSA Attackを使う。Zp4をQp4に変換し、ヘンゼルリフトでQp5に変換し、Fpでの解を得る。
- そこから、Fpでは情報量が足りないのか、p4に戻している。なぜできるのかはよく分かってないが、https://mitsu1119.github.io/blog/p/zer0pts-ctf-2021-writeup-%E6%97%A5%E6%9C%AC%E8%AA%9E/ を見ると、p進展開を利用しているように見える
- https://x.com/nuo_chocorusk/status/1868193798322639193 も同様
- https://www.youtube.com/watch?v=G0bHFyFWhL0
- Zp4をQp8にヘンゼルリフトで変換して、SSSA Attackして、同様に諸々計算した結果がZp4でいる(#E(Zp4)=p4ということだろうか)kurenaifさんはライブラリ化していた。
- [類題] TSGCTF2024 - Easy?? ECDL
- スピードが求められる Smart Attackで使ったライブラリ
- Zp4でのECDLPを解く問題。
- 解説シリーズ
MOV / FR Reduction
- MOV / FR Reduction: Fp上の楕円曲線Eについて#E=p±1である、つまり、Supersingular な曲線であれば適用可能で、埋め込み次数kを用いてFpk+上の DLP に帰着できる。ECDLPをFFDLPに変換可能
- 唯一日本語で細かく解説されている https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve
- https://risencrypto.github.io/WeilMOV/
- MOV Attackができると、
E(GF(p))をGF(p^k)×に、もっと言うとGF(p)×上での離散対数問題に帰着させることができる - この時、112ビットセキュリティを担保するには、RSA,DHだと2048bitsの鍵長が必要になるが、ECDHであれば224bitsの鍵長で済む
- よって、同じGF(p)上での離散対数問題であってもECDHをDHに変換できるだけで、必要な計算量を各段に減らすことができている
- 線形写像 linear map「f:V→W」において、「f(v1+v2)=f(v1)+f(v2)」かつ、「f(av)=af(v)」である
- 双線形写像 Bilinear map「f:U×V→W」において、「f(u1+u2,v)=f(u1,v)+f(u2,v)」かつ「f(u,v1+v2)=f(u,v1)+f(u,v2)」かつ「f(au,v)=af(u,v)=f(u,av)」である
- Fpの元は全部p-1乗すると1になる。その拡大体のFptでは全部
p^t-1乗すると1になる(最小ではなくp^t-1を割り切るらしいが、今後の理論には関係しなさそう)- この式が埋め込み次数kと関係する
- 埋め込み次数k: 素体Fq上の楕円曲線Eについて、Pを位数mの点、mが素数でありqと互いに素である場合に、
q^k=1 mod mが成り立つ最小のkを埋め込み次数と呼ぶ - 位数mの点、つまりmP=Oを満たすPをm-ねじれ点といい、全てのm-ねじれ点の集合(m-ねじれ群)の部分集合をm-ねじれ部分集合という
- m-ねじれ部分集合(m-ねじれ集合?) E(Fq)[m] = {P∈E: mP=O}
- ここで、埋め込み次数kを使った、素体Fqの拡大体Fqkを考える
- 拡大体Fqkはベースの体Fqよりも大きいため、m-ねじれ群もまた大きくなる
- よって、この拡大体では、より多くのmねじれ点を追加しないFqkよりもより大きい拡大体になる(?)
- よって、E(Fqk)[m]はfull m-ねじれ群と呼ばれる
- Full Torsion Group、全ねじれ群は複数の部分群をもち、そのうちの2つをWeil Pairingでは使う
- G1: E(Fq)上にある点の部分集合
- G2: E(Fq)上にはないがE(Fqk)にはある点の部分集合。複数考えられるが、どれを選んでも問題ない
- Weil Pairing
- 埋め込み次数の定義から
q^k-1=0 mod mということはq^k-1=mxということになる - また、
Fq^k上での乗法群を考えると0以外の全ての要素はq^k-1乗すると1になる。1つ上の定義からq^k-1はmで割り切れるため、巡回群の基本的な定理より、位数がmである一意の部分群GTが存在することになる m∤(q−1)、つまり、mが(q-1)を割り切らないとき、G1×G2→GTとなるWeil pairingを構築可能(なぜ?)- em: G1×G2 → GT
- このWeil Paringでは、EC側(左辺)は加算群であるが、GT側は乗法群となる。この写像は以下のような性質を持つ
- 双線形写像
- em(A1+A2,B)=em(A1,B)*em(A2,B)
- em(A,B1+B2)=em(A,B1)*em(A,B2)
- em(aG1,bG2)=em(bG1,aG2)=em(abG1,G2)=em(G1,abG2)=em(G1,aG2)b=em(G1,G2)ab
- Identity: em(A,A)=1 for all A ∈ E[m]
- Alternation: em(A,B)=em(B,A)-1
- 非退化 Non-Degeneracy: em(A,O)=1 for all A∈E[m] であり、逆にem(A,B)=1でB∈E[m]であればA=O
- 双線形写像
- 埋め込み次数の定義から
- MOV Attack:
- Fq上の楕円曲線Eで、素数位数mを持つ2点P,Qがあり、Q=rPという関係にあるとする。P,Q∈G1である
- n = #E(Fqk)を計算する。m|nになるはず
- E(Fqk)上にある位数がmの点Sを取得する
- ランダムにT∈E(Fqk)を取る。T∉E(Fq)である必要がある
- S=(n/m)Tを計算する。S=OならTを取り直す。こうするとmS=nTになる
- Tの位数をtとすると、ラグランジュの定理より、tは#E(Fqk)を割り切る。つまり、t|n。よってdをつかってn=dtと書ける。こうすると、mS=dtTとなる
- tはTの位数なのでdtT=dO=Oとなる。つまり、mS=Oとなり、Sの位数はmになる
- https://furutsuki.hatenablog.com/entry/2022/12/13/131802 にあるテク
- これでP,rP∈G1, S∈G2が手に入ったのでWeil Pairingをする
- u=em(P,S)
- v=em(rP,S)=em(P,S)r
- u,v∈Fqk、かつ、v=urを満たすu,vが手に入り、これでECDLPからDLPへの変換が成功した
- qkが大きすぎなければ、u=vrはIndex Calculusで解け、rが求まる。このrはECDLP上でのrの値と一致している
- kは20以下でないことを確認するように推奨している。CTFでは2か、大きくても6くらい?
- MOV Attackができると、
- 勉強してみたお気持ち: そのままWeil PairingをQ=rPに使おうとすると線形性があるのでem(P,rP)=em(P,P)r=1となってしまって進まないので拡大体に一回映してねじれ群を増やして線形独立な点を探してきて使うことでem(P,B)!=1にしてうまくWeil Pairingによって乗法巡回群に落とし込んでいる?
- 実用的には...
- 埋め込み次数kの計算
p^k-1 = 0 mod #E(Fp)を満たす最小のkを計算 - k≦6ならMOV攻撃可能!
- https://zenn.dev/hk_ilohas/articles/3c7ff88cb319fc からmov_attackを借りて使う 他実装 https://www.hackthebox.com/blog/movs-like-jagger-ca-ctf-2022-crypto-writeup
- 埋め込み次数kの計算
- 埋め込み次数 k
- k=1のとき、つまり、位数がp+1のとき、楕円曲線はSupersingularであると言う
E.is_supersingular()でsupersingularか判定できる
- k=1のとき、つまり、位数がp+1のとき、楕円曲線はSupersingularであると言う
- MOV attack 有限体の上の離散対数問題になる -> Weil-paringを使う
E(GF(p)) ≅ E(GF(p**k)) ≅ GF(p**k)×
- Frey-Rück Reduction (同上, Tate-pairingを用いる)
- https://gist.github.com/mcieno/f0c6334af28f60d244fa054f5a1c22d2
- MOV Attackと比較して単純にペアリングパートでTate-pairingを使っただけ
- https://github.com/jvdsn/crypto-attacks/blob/master/attacks/ecc/frey_ruck_attack.py
- https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#supersingular-%E3%81%AA%E6%9B%B2%E7%B7%9A%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%81%AF%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84-(mov-%2F-fr-reduction)
- 楕円曲線上のペアリングを利用して、楕円曲線のDLPを有限体の乗法群上のDLPへ帰着。特にEが超特異曲線のときに有効
Singular Curve Point Decompression Attack
E = EllipticCurve(GF(p), [a,b])をしたときにSingularな曲線ならエラーになる4a^3+27b^2=0 mod pであれば特異点を持つSingular曲線- 楕円曲線の判別式
Δ=4a^3+27b^2 - 特異な曲線であることから、この判別式を使ってaからbを求める問題 https://writeups.thebusfactoris1.online/posts/2025-07-28-FaultyCurve-writeup
- 楕円曲線の判別式
- sageで
f = x^3 + a*x + bとしてf.factor()すればcuspかnodeか分かる
- Singularな曲線、特異点を持つ曲線、特異曲線の性質を利用するもの
- cusp カスプ型 -> y2=(x-a)3の形で表現できる
- 尖っている楕円曲線 https://en.wikipedia.org/wiki/Cusp_%28singularity%29
- どんなカスプ型楕円曲線も平行移動や線形変換でy2=x3の形になる
- non-singular点が丁度p個存在し、Fpの加算群への効果的な写像がある
- f: E/Fp → Fp+ という同型写像が常に存在。群同型になっている。尖端曲線上において、非特異点群は加法群と同型。
- 手順
- idekctf 2025 - Sadness ECC Revenge https://giapppp.github.io/posts/idekctf-2025/
- node ノード型 ->
y^2=(x-α)^2(x-β)と表現できる- 平行移動や線形変換でy2=x2(x-1)に変換する
- p+1個かp-1個の点があるため、Fp2上での乗法群への効果的な写像がある
- Fp2だと位数はp2-1でp2-1=(p+1)(p-1)で約数に持つため
- 「節曲線上で、非特異点群は乗法群(GF(p), )と同型である」という説明も見た。
GF(p)*って何だろう。*は×、乗法を指していそうだが... https://writeups.thebusfactoris1.online/posts/2025-07-28-FaultyCurve-writeup
- p+1個かp-1個の点があるため、Fp2上での乗法群への効果的な写像がある
- E(Fp)上のECDLPをFp×のFFDLPに変換して解く
- GF(p)上でやるとp-1でPohlig-Hellmanだと思うが、p+1でPohlig-Hellmanもできるみたい
- https://chocorusk.hatenablog.com/entry/2023/11/11/035738#crypto-Delta-Force だとp+1でPohlig-Hellmanしてる
- https://blog.y011d4.com/20210801-crypto-ctf-writeup
- 平行移動や線形変換でy2=x2(x-1)に変換する
- singular curve: 楕円曲線の判別式 Δを計算すると0の曲線
- singularな楕円曲線には、nodeとcuspの2種類がある
- Singular Curve Point Decompression Attack
- https://chocorusk.hatenablog.com/entry/2023/11/11/035738
- https://blog.y011d4.com/20210801-crypto-ctf-writeup#tiny-ecc
- Singular な曲線 Δ(E/Fp)=0 のとき、Fp+やFp×,Fp2×F上の DLP に帰着できる
- Singularな楕円曲線は準同型なほかの構造にうつして解ける
- 特異点を持つ楕円曲線は写像を通して FFDLP に落ちます。
- https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E4%B8%8A%E3%81%AB%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%AA%E3%81%84%E7%82%B9%E3%82%84%E4%BD%8D%E6%95%B0%E3%81%AE%E5%B0%91%E3%81%AA%E3%81%84%E7%82%B9%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84-(invalid-curve-attack-%2F-small-subgroup-attack)
- Easy?? ECDLP
- chocoruskさん: 楕円曲線の方程式とP,Qの座標がちょうどZ_pの元になるように(x',y')=(p2x,p3y)の変換をすると、modpで見たときに楕円曲線がsingularになる。cuspの場合は簡単、nodeの場合は位数がp2-1の約数になるので、p-1とp+1の素因数がどちらも小さくなるようにpを決めれば、secret modpが求まる。(SECCON 2023 Finals DLP4.0と同様)https://github.com/y011d4/my-ctf-challenges/tree/main/2023-SECCONCTF-Final/crypto/dlp-4.0/solution あとは同様にliftする。singularな楕円曲線の問題、楕円曲線が独自実装されてたりして丸わかりなことが多いけど、これはパッと見わからなくて面白かった
- nullcon HackIM 2019 Singular https://furutsuki.hatenablog.com/entry/2020/05/05/112207
Invalid Curve Attack / Small-Subgroup Attack
- 楕円曲線上であることを確認しないまま計算が行われると、別の楕円曲線上で計算されていることになり、想定よりも位数の少ない点を使ってしまうことがある
- CodeGATE 2024 Baby Login
- secp256r1: y2=x3-3x+0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b という楕円曲線上で計算しているつもりが、楕円曲線上にあることを確認しないまま計算することで、座標の計算にはy2=x3+ax+bの楕円曲線のaしか使われないため、別のbの楕円曲線上で計算が進んでしまうことになる
- つまり、y2=x3-3x+b(bは[0,p)の任意の数)上で計算が進んでしまう
- 任意の点を選ぶとbが決まるかというと、多分(というか大体?)Yesで、aが同じでbが異なる楕円曲線というのは上下の平行移動になるため、平行移動してその点に重なるbって2通りしかなさそう?(上側と下側)
- よって、天下り的にbをランダムに選んで計算が移った先の楕円曲線を作って、そこからランダムな点を選び、更に
tmp_E.gens()[0] * (tmp_n // tmp_p)みたいに「生成元×楕円曲線の位数÷求めたい素数位数」とやって点を求めることで、求めたい素数位数の点を見つけてくることができる - こうやって見つかった座標はaは共通しているがbは違うので元々の楕円曲線上には無く、また、Invalid Curve Attackで計算されたときに位数が小さくて便利という感じである
- CodeGATE 2024 Baby Login
- https://github.com/ashutosh1206/Crypton/blob/master/Diffie-Hellman-Key-Exchange/Attack-Invalid-Curve-Point/README.md
- https://zenn.dev/kurenaif/articles/9cf509d9a15815
- 楕円曲線上に存在しない点や位数の少ない点を指定できるとき、さまざまな少ない位数の点を収集して中国剰余定理できる https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E4%B8%8A%E3%81%AB%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%AA%E3%81%84%E7%82%B9%E3%82%84%E4%BD%8D%E6%95%B0%E3%81%AE%E5%B0%91%E3%81%AA%E3%81%84%E7%82%B9%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84-(invalid-curve-attack-%2F-small-subgroup-attack)
- tiramisu (Google CTF)
- Montgomery-Ladder Fault (Montgomery-Ladder法を用いて乗算処理を行う際, Invalid-curve Attackを用いて存在しない点に対して処理を行わせるとある別の楕円曲線での計算結果に帰着できる. もし, この曲線でPohlig-Hellman Attackのような別の攻撃を用いれる場合, ECDLPは間接的に解けてしまう. )
- https://safecurves.cr.yp.to/twist.html の Invalid-curve attacks against ladders?
- モンゴメリ曲線上にない入力xは、必ずねじれた曲線にあることが保証される
- 別の楕円曲線はどうなんだろう
- ねじれ曲線は
E.quadratic_twist(d)で得られる- dの指定を省略するとランダムなねじれ曲線が得られる
- dは非平方剰余な数で
dy^2=x^3+Ax^2+x mod pが構築される
- claudeによると...
- 不正なxは全て単一のTwist曲線上に乗る
- 別のねじれ曲線を用意するのではなく元の体を拡大することで解が存在する楕円曲線に移すことで解けたりする
- GF(p)上で解が無いが、GF(p**2)上なら解が作れる
- つまり、もともと
E1 = EllipticCurve(GF(p), [a, b])であれば、E2 = EllipticCurve(GF(p**2), [a, b])を楕円曲線として使うことで異なる位数上で同一の計算が行える
- TJCTF 2015 Curvature https://furutsuki.hatenablog.com/entry/2020/05/05/112207
- x座標だけを受け取って検証をしない場合は、x3+ax+bが平方剰余であればyが存在するので有効な点であり、非平方剰余であれば有効でない点になる
- この有効でない点は、quadratic twist(2次ねじれ)の曲線E'上の点として振る舞い、
#E(Fp)+#E'(Fp)=2p+2が成り立つ- quadratic twistは
E.quadratic_twist()で得られる
- quadratic twistは
- https://cryptopals.com/sets/8/challenges/60.txt
- この有効でない点は、quadratic twist(2次ねじれ)の曲線E'上の点として振る舞い、
- P256, P244
- CodeGATE 2024 Baby Login https://blog.y011d4.com/20240602-codegate-writeup
- golang 1.19未満ではelliptic.P256().ScalarMultが与えられた座標がP256の上にあるか検証してない
- Google CTF 2021 TIRAMISU https://blog.y011d4.com/20210719-google-ctf-writeup#tiramisu
- CodeGATE 2024 Baby Login https://blog.y011d4.com/20240602-codegate-writeup
他、資料
- Weil-Descent Attack (有限体の n次拡大体の上の楕円曲線のECDLPをDLPへ帰着し, Index-calculus法を併用してECDLPを解く. )
- Xedni-Calculus法 (特定条件下の楕円曲線におけるIndex-Calculusの効率化. XedniはIndexの逆.)
- Yasuda-Attack (p進展開を利用したp進数体・有理数体におけるECDLP解法, 名前は特に付けられていないようなので発案者の安田氏の名前とした)
- Small-Subgroup Attack (位数の少ない点を指定し, それぞれについて何度も小さなECDLPを解き, 中国人剰余定理を用いてECDLPを解く. )
- https://elliptic-shiho.hatenablog.com/entry/2016/12/02/051931
- https://elliptic-shiho.hatenablog.com/entry/2016/07/20/084509
- https://tex2e.github.io/blog/crypto/DLP
- https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#pohlig-hellman
- https://github.com/elikaski/ECC_Attacks?tab=readme-ov-file#The-curve-is-supersingular
ECDH鍵共有: ECDH, 楕円ElGamal暗号
- ECDH鍵共有: ECDH
- 最初に、楕円曲線E/FpとベースポイントP ∈ E/Fpを作成し、共有する
- [Alice] 乱数aを用意して、aGを計算して、送る
- [Bob] 乱数bを用意して、bGを計算して、送る
- [Alice] 貰ったbGから、abGを計算する
- [Bob] 貰ったaGから、abGを計算する
- S=abGという共通鍵が生成できた
- Sのx座標をハッシュ化して共通鍵とすることもある?
- 楕円ElGamal暗号
- [両者] ECDH鍵共有で共通鍵 abGを生成する
- [Alice] 送りたいメッセージ M を用意して、M+abGを計算して送る
- [Bob] 貰ったM+abGから-abGをしてMを復元する
- 楕円曲線のFp 有理点E(Fp)は巡回群 or 二つの巡回群の直積らしい https://mitsu1119.github.io/blog/p/%E7%BE%A4%E3%81%A7%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B-elgamal/
ECDSA署名
- 署名作成手順
- 楕円曲線のパラメタa,bを求める
- 計算するときに使うmod pのpはもう決まった値があるっぽい
- a,bはベストプラクティスがあるっぽい
- ベースとなる座標Gを決める
- 圧縮方式ではx座標しか書かれていないし、非圧縮方式ではy座標も書いてある
- 確かにx座標があればy座標は2択まで絞れるな
- ベースポイントの位数nを求める
0 = nGとなるn
- 秘密鍵d(整数)をランダムに決める
- 乱数でn以下の数字で決める
- Q = dGを求める
- 繰り返し二乗法が使える
- nonceのkをランダムに決める(秘密鍵dは共通だが、kは毎回作り直す?)
- r := kGのx座標を求める (mod n?)
- s := (h(m) + rd) / k mod nを求める
- (r,s)が署名値で(G,Q)が公開鍵
- このとき、1≦r,s<nになっているはずなので、署名値はこれを満たしているか検証する必要がある
- 検証しなかった脆弱性が CVE-2022-21449 https://blog.y011d4.com/20221011-cyber-security-rumble-writeup
- このとき、1≦r,s<nになっているはずなので、署名値はこれを満たしているか検証する必要がある
- 楕円曲線のパラメタa,bを求める
- 検証手順
- (h(m)/s)G + (r/s)Qのx座標はrかどうかを判定する(mod n?)
- Polynonce: An ECDSA Attack and Polynomial Dance
- https://media.defcon.org/DEF%20CON%2031/DEF%20CON%2031%20presentations/Nils%20Amiet%20Marco%20Macchetti%20-%20Polynonce%20An%20ECDSA%20Attack%20and%20Polynomial%20Dance.pdf
- https://eprint.iacr.org/2023/305.pdf
- nonceがLCGのような単純なものが使われているとき、また、N個の署名を集め、N個のnonceが最大N-3次帰納関係に従っている場合はECDSAに対してキー回復攻撃が実行可能であるらしい https://research.kudelskisecurity.com/2023/03/06/polynonce-a-tale-of-a-novel-ecdsa-attack-and-bitcoin-tears/
攻撃手法
https://furutsuki.hatenablog.com/entry/2020/05/05/112207 https://eprint.iacr.org/2023/305.pdf
- dが漏洩すれば、どんな平文でも署名を偽造可能
- kが分かるとdが計算可能
d = (sk - h)/r mod n- 署名の手順6が
s = (h(m) + rd) / k mod nで、未知数がdのみになり、dを計算可能になる
- 署名の手順6が
- kが使いまわされていると復元可能 / nonce再利用攻撃
- kが共通な2つの署名付きメッセージが手に入るとkが得られる
k = (h1 - h2)/(s1 - s2) mod n - Crypto failures in the wild
- kが共通な2つの署名付きメッセージが手に入るとkが得られる
- 位数n
- invalid curve attack
- 楕円曲線の位数が素因数分解できる場合に、Pohlig-Hellman attackができるよ、という問題です。この問題も楕円曲線のパラメータbを求めるステップがあり、PolynomialRingのrootsで殴ります
- Biased Nonce Sense Lattice Attack https://www.youtube.com/watch?v=6ssTlSSIJQE
- 生成されるkが小さい場合に複数の署名を収集することでdをLLLで計算できるかも
h1/s1 = - r1/s1 * d + k1 mod nであり既知部分をA1,B1として整理するとA1 = B1 * d + k1 mod nとなる- これを複数個用意して、LLLを使ってApproximate-GCD問題を解くことでdが求まる?
- 資料のYoutubeではCVPに帰着させて解いていた
- kの大きさと必要サンプル
- (#samples,log|k|) = (2,128), (3,170), (4,190), (20,242), (40,248)
- Nonceがbiasedであればkの不明箇所のサイズを下げることができ、LLLで解けるようになる
- Shared unknown prefixes:k1-k2を計算することで共通しているprefixが消えてサイズが小さくなる
- Shared unknown suffixes: 上とほぼ同様であり(k1-k2)/2^-tを計算する
- k,dが小さいとHidden Number Problemに帰着させ、LLLで解ける
- kの一部が分かっているとHNPに帰着できる
- 生成されるkが小さい場合に複数の署名を収集することでdをLLLで計算できるかも
- CVE-2020-0601 Qが未検証だったた生じた脆弱性で自由に動かすことができ、Q=Gにすることができた
- CVE-2024-31497
- PuTTYにおいてP-521のECDSA鍵を使っていると乱数の偏りが原因で、署名を60個程度集めれば秘密鍵が復元できてしまう
- P-521は名前の通り法に521ビットの素数を使うわけですが、当時のPuTTYはkの生成にSHA512を使っていて、つまり、521ビットに対して512ビットのkを使っていて差分の9ビットは常に0になる
- PoC https://github.com/HugoBond/CVE-2024-31497-POC
- PREDICTING THE ELLIPTIC CURVE CONGRUENTIAL GENERATOR https://arxiv.org/pdf/1609.03305
- https://connor-mccartney.github.io/cryptography/ecc/PrivateCurve-0xl4ughCTF2024
P=G*flagで、P, P+G, P+2G, ..., P+6Gのx座標が与えられたときにflagが復元できる
他メモ
- RSA+ECC https://ce-automne.github.io/2019/12/22/Watevr-CTF-2019-Crypto-WriteUp/
- よくわからん多次元の何かが実はECで、色々やると解けるみたいな問題 https://hxp.io/blog/110/hxp-38C3-CTF-alcoholic_variety-writeup/
- Dual EC DRBG: 楕円曲線暗号を用いて実装されたCSPRNG
- 2006にNISTの標準規格として採用されたが、2014年には削除されている。バックドアがあったため
- UTCTF 2021 Sleeves https://ctftime.org/writeup/26410
- 楕円曲線LCG: 安全でないので使ってはいけない
- RCTF 2022 - IS_THIS_LCG? https://ctftime.org/writeup/36034
楕円ペアリング
- ペアリング:楕円曲線上で定義される関数であり,楕円曲線上の 2点を入力とし,ある有限体の元を出力とする双線形関数 https://sehermitage.web.fc2.com/cmath/pairing_1.html
- 抽象的には
e:G1×G1 → Grの写像のうち 双線型性 と 非退化性 の両方を満たす写像をペアリングという - Weilペアリング
em(P,Q)ペアリング暗号において最初に用いられたペアリングの1つで計算量が非常に大きい- e: E[m]×E[m]→μm: m-ねじれ群のとある点同士を入れるとmの乗法巡回群が得られる
- とある点P, Qがあり、P=kQであることを確かめたいときに、
em(P,Q)=1であることを判定するというやり方がある https://furutsuki.hatenablog.com/entry/2024/09/15/201136#A-Dance-of-Add-and-Mul- これは、
em(P,P)=1, ∀P∈E[m]と、em(kP,Q)=em(P,kQ)=em(P,Q)^kから言える
- これは、
- sagemathで計算するときは
G1.weil_pairing(R, o1)のようにする- o1はG1の位数であるが、https://yu212.hatenablog.com/entry/2024/09/15/180420 だと、
r = 0x5f19672fdf76ce50d28e776116d47d5841f8c5f1fba8d33881bfa40089fc5bffd1ffffff00010001と定数を使っていた。何なのかよく分からない
- o1はG1の位数であるが、https://yu212.hatenablog.com/entry/2024/09/15/180420 だと、
- Tateペアリング: Weilペアリングよりも計算効率の高い双線形写像
- Ateペアリング: Tateペアリングを改良し、計算効率がよりよい
- BN(:Barreto-Naehrig)ペアリング: Barreto-Naehrig 曲線と呼ばれる特定の種類の楕円曲線上で定義される特別な種類のペアリング
- ペアリング全体で満たす性質
e(P,aQ+bQ)=e(P,aQ)e(P,bQ)e(aP+bP,Q)=e(aP,Q)e(bP,Q)e(P,Q+R)=e(P,Q)e(P,R)e(P+Q,R)=e(P,R)e(Q,R)
- 抽象的には
- ペアリングはそもそもPairing Friendly Curveでしか使えない
- Pairing Friendly Curve: 埋め込み次数が小さい(6以下?)。逆に埋め込み次数が小さいと必ずペアリングが定義できる?
- BN254: Barreto-Naehrig曲線の一種で、ペアリングベース暗号に特化した楕円曲線
- y2=x3+3(有限体Fp上)
- 素数p = 36u⁴ + 36u³ + 24u² + 6u + 1 ここで u = 4965661367192848881
- ペアリング構造 e: G1×G2 -> GT
- G1: y2=x3+3(有限体Fp上)上の点の部分群
- G2: ツイスト曲線上の点(FQ2拡張体)
- Fp2上の楕円曲線のツイスト曲線上の点
- G1を拡張体Fp2に持ち上げると、点の数が足りない問題が起きる。そこで使うのがツイスト曲線。y² = x³ + 3/ξ (Fp²上)
- ξ(クサイ)は拡張体Fp²の特別な元
- G1と同じ位数rを持ち、標準的な生成元がある
- G2として使われるのはツイスト曲線上の部分群になる
- よって、部分群として適したものを使わないとペアリングの性質が破れる
- Alpacahack Round 13 - Jerr0-day https://soon.haari.me/alpacahack-round-13/
- 公式解説では適さない点を探すのに曲線上のランダムな点を取得してペアリングが成立するかを角印することでガチャっている
- Fp2上の楕円曲線のツイスト曲線上の点
- GT: FQ12拡張体(ペアリング結果)
- 性質
- 双線形性
- e(aP, bQ)=e(P,Q)ab
- e(P1+P2,Q)=e(P1,Q)×e(P2,Q)
- e(P,Q1+Q2)=e(P,Q1)×e(P,Q2)
- 非縮退性
- G1,G2の生成元P,Qに対してe(P,Q)≠1
- 双線形性
- y2=x3+3(有限体Fp上)
- ペアリングを理解するには因子 divisor という概念を理解する必要があるらしい https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve#supersingular-%E3%81%AA%E6%9B%B2%E7%B7%9A%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%81%AF%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84-(mov-%2F-fr-reduction)
- ペアリングがどう使えるか?
- 楕円曲線上の離散対数問題 Q=aPについて、ペアリングを計算したとき、
e(P,Q)=e(P,aP)=e(P,P)^aとなり、普通の離散対数問題に帰着させられる
- 楕円曲線上の離散対数問題 Q=aPについて、ペアリングを計算したとき、
- 楕円曲線を使った鍵共有方式 https://crypto-writeup-public.hatenablog.com/entry/%25E3%2583%259A%25E3%2582%25A2%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0
- https://project-euphoria.dev/blog/36-pairing/
- https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve
- https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve
- 転用
- 鍵共有 ID-NIKS
- 公開鍵暗号 BF方式、SK方式
- 署名 短い署名、グループ署名
- ECDDHP: 楕円曲線上の楕円曲線決定Diffie-Hellman問題、安全じゃないっぽい?
- 資料 https://static1.squarespace.com/static/5fdbb09f31d71c1227082339/t/5ff394720493bd28278889c6/1609798774687/PairingsForBeginners.pdf
- https://ptr-yudai.hatenablog.com/entry/2023/03/11/233340#mitsu-%E3%83%8D%E3%82%B3%E3%81%A1%E3%82%83%E3%82%93%E5%BC%8F%E5%AE%89%E5%85%A8%E3%81%AA%E6%9B%B2%E7%B7%9A%E3%81%AE%E7%94%9F%E6%88%90
モンゴメリー曲線 Montgomery
y^2=x^3+Ax^2+x- Aはモンゴメリ係数
- sagemathだと
EllipticCurve(F, [0, A, 0, 1, 0])
- wikipediaでは
By^2=x^3+Ax^2+xとして、パラメタをA,B(B(A^2-4)≠0を満たす)だった - 単一座標系を持つ。つまり、座標はx座標のみで表現される。yは無視される
- これにより効率的なスカラー倍演算が可能になる
- モンゴメリー座標 P = (X:Z)
- モンゴメリ曲線とツイステッドエドワーズ曲線とは双有理同値
超楕円曲線暗号
- 超楕円曲線 hyperelliptic curve とは y2=f(x) の代数曲線のこと
- 曲線の種数 g
- f(x)の次数からを求めることができる。具体的には 次数 2g+1と2g+2の多項式で定義される超楕円曲線は種数g
- つまり3次,4次ならg=1で種別1の楕円曲線(正確には特別な一点を付加する)。つまり、1<gなら超楕円曲線
- 次数が 2g + 1 のとき、虚超楕円曲線 imaginary hyperelliptic curve
- 次数が 2g + 2 のとき、実超楕円曲線 real hyperelliptic curve
genus = floor((f.degree()-1) / 2)こんな感じに計算してたら種数を計算している- gは穴の数を表す位相的不変量。曲線のリーマン面における「穴」の数(楕円曲線はトーラスなのでg=1なのか)
- Mumford表現: 超楕円曲線での点の表現。多項式のペア (U,V)
- U: 次数≦gのモニックな多項式
- V: Uを法とした剰余
- https://mitsu1119.github.io/blog/p/%E8%B6%85%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E6%9A%97%E5%8F%B7%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%9E/#mumford-%E8%A1%A8%E7%8F%BE
- 楕円曲線では点で群を成せたが、超楕円曲線では点のタプル的なものを使うが、それを多項式で表現したもの
- Harley加算などの高速な加算アルゴリズムも見つかり、計算機的にも嬉しい
- 直線は曲線と5点で交わるため、楕円曲線に通常適用する通常の方法は使えません。なぜなら、選択できる点が多数あるからです。これを克服するために、単一の点ではなく、因子と呼ばれる小さな点のペアを用います。これらのペアは、曲線のヤコビアンとして知られる整然としたアーベル群を形成します。大まかに言えば、2つの点が直線を決定し、その直線を曲線に代入すると、もう一つの交点を与え、それを折り返して次数を小さく保つ。これはカントールのアルゴリズムと呼ばれる https://people.cs.nycu.edu.tw/~rjchen/ECC2012S/Elliptic%20Curves%20Number%20Theory%20And%20Cryptography%202n.pdf の13.3章
- これを使うと、f(x) = v(x)2 mod u(x) が成立するらしい
- idekCTF 2025 - Happy ECC Revenge https://giapppp.github.io/posts/idekctf-2025/
- 曲線の位数は約 pg (pは体の大きさ)
- 種数2の超楕円曲線の位数計算の方法 -> https://giapppp.github.io/posts/idekctf-2025/
- mitsuさんのどでか資料 https://mitsu1119.github.io/blog/p/%E8%B6%85%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E6%9A%97%E5%8F%B7%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%9E/
- https://www.iisec.ac.jp/proc/vol0002/iisec_proc_002_p043.pdf
同種写像 isogeny
https://mitsu1119.github.io/blog/p/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97%E5%BF%9C%E5%8B%9F%E8%AA%B2%E9%A1%8C%E6%99%92%E3%81%97-2023-l1-%E6%9A%97%E5%8F%B7%E5%8C%96%E9%80%9A%E4%BF%A1%E3%82%BC%E3%83%9F/ https://project-euphoria.dev/blog/35-yoshicamp-2022-winter-sidh/ https://giapppp.notion.site/Isogeny-based-cryptography-aec3e90af4d14ca1a3db8be7ffd0794a
- 同種写像 isogeny
- 同種写像暗号 / Isogeny型の暗号 https://joint.imi.kyushu-u.ac.jp/wp-content/uploads/2022/08/220802_03aikawa.pdf
- Alice
(E,Φ)を定義 - Bob
(E,Φ(E))を定義- Φ(E)は同種写像の像となる曲線で、公開情報
- (一般)超特異同種写像問題: 同種な超特異楕円曲線 E1 と E2 が与えられたとき、同種写像 f:E1 → E2 を求めよ
- この問題の困難性を背景とした暗号
- 超特異同種写像グラフを利用する
- CGL-ハッシュ関数
- SIDH鍵共有
- SQISign署名 https://joint.imi.kyushu-u.ac.jp/wp-content/uploads/2022/08/220802_05onuki.pdf
- アーベル多様体の同種写像グラフ
- CGL-ハッシュの類似
- グラフの局所的な記述や拡張性の研究 などなど
- イデアル類群の群作用を利用する
- CRS鍵共有: 通常曲線を利用し、実装性を伴わない
- CSIDH鍵共有: 超特異曲線を利用し、効率的な方式
- CSI-FiSh: CSIDHベースのデジタル署名
- SiGamal, SimS: CSIDHベースの暗号化
- 楕円曲線とその同種写像を用いた方式
- 2022年7月にCastryckとDecruにより、同種写像暗号の1つであるSIKEに対する攻撃が示された
- 同種写像計算問題の困難性を利用
- Alice
資料
同型 isomorphic
- ある体K上の2つの楕円曲線が本質的に同じ構造を持つ、正確にはある体K上の2つの楕円曲線E1, E2にK上の以下の条件を満たす準同型写像 Φ:E1→E2が存在するとき、E1とE2は同型であると言う
- Weierstrass標準形では
Φ:(x,y)→(u^2x+r,u^3y+s)とすると同型に変換可能Φ:x→λxも同型になる?書き方が分からんがΦ:(x,y)→(λ^2x,λ^3y)と同じな気がする https://github.com/Sarkoxed/ctf-writeups/blob/master/trx-2025/magic_curves/solve.py
- 同型に関する性質
- Eのj-不変量
jE = 1728 * 4a^3 / (4a^3 + 27b^2)とすると、E1とE2が同型であることと、jE1=jE2は同値 - 同型な楕円曲線は基本的な性質が同じのため、暗号観点ではセキュリティ強度が同じと考えられる。つまり、とある楕円曲線をより簡潔な同型の楕円曲線に変換することで、強度を保ちつつ計算を簡略化可能
- 群構造: 楕円曲線上の点の加法が同じ形で保たれる
- 位数や位数分布: 有限体上の点の個数(#E(Fp)など)が一致する
- トーション部分群: ねじれ部分群(有限位数の点の集合)が一致する
- ランク(有理点の自由部分の次元): 有理点のランクも不変
- ある曲線と同型なMontgomery曲線やEdwards曲線に変換することもできるっぽい
- Eのj-不変量
- 同種写像暗号の歴史 https://csidh.isogeny.org/index.html
- Couveignes-Rostovtsev-Stolbunov方式: 1997年 Couveignesが提案した素体Fq上での通常の楕円曲線上で、同型写像をしてDHするもの
- 2004年にRostovtsevとStolbunovにより独立に再発見された
- これは2010年に、アーベル隠れシフト問題の例を解くことに相当するため、時間計算量がLqの量子アルゴリズムが存在することが示された https://arxiv.org/abs/1012.4019
- SIDH: Supersingular Isogeny Diffie–Hellman
- 2011年に自己準同型性の完全な環が四元数代数の順序である超特異楕円曲線を仕様した同方式のDHを提唱(と書いたが、ただ単に置き換えただけのものではないらしい)
- SIDHをカプセル化(つまりは基盤とした)したSIKEというのもある
- 2022年7月 深刻な鍵復元攻撃が提唱された https://k-nomoto1728.github.io/homepage/pdf/research/CSS2022.pdf
- 2011年に自己準同型性の完全な環が四元数代数の順序である超特異楕円曲線を仕様した同方式のDHを提唱(と書いたが、ただ単に置き換えただけのものではないらしい)
- CSIDH
- SQISign
- Couveignes-Rostovtsev-Stolbunov方式: 1997年 Couveignesが提案した素体Fq上での通常の楕円曲線上で、同型写像をしてDHするもの
SIDH
- SIDH
- https://triodelzx.github.io/2025/02/26/%E5%90%8C%E6%BA%90%EF%BC%881%EF%BC%89%E2%80%94%E2%80%94SIDH/
- https://triodelzx.github.io/2025/03/03/%E5%90%8C%E6%BA%90%EF%BC%882%EF%BC%89%E2%80%94%E2%80%94SIDH%E9%80%9A%E8%A7%A3/
- https://ptr-yudai.hatenablog.com/entry/2022/12/13/235034#theoremoon-%E7%8C%AB%E3%81%A8%E5%AD%A6%E3%81%B6%E5%90%8C%E7%A8%AE%E5%86%99%E5%83%8F%E6%9A%97%E5%8F%B7
- 2022年に完全に破られたらしい https://triodelzx.github.io/2025/02/26/%E5%90%8C%E6%BA%90%EF%BC%881%EF%BC%89%E2%80%94%E2%80%94SIDH/
CSIDH
- CSIDH: 虚⼆次体のorder Oに付随するイデアル類群の, ある超特異楕円曲線のFp-同型類の集合ℰℓℓp(O)への作⽤に基づく鍵共有⽅式
- 有限可換群の超特異楕円曲線の同型類の集合への作用 [15] に基づいた同種写像暗号の鍵共有方式
- 問題の困難性は、同型性発見問題に依存する
- 超特異楕円曲線
- Montgomery曲線っぽい?わからん
- Edwards曲線を利用したCSIDH https://www.i.u-tokyo.ac.jp/edu/course/mi/master/2019/a/moriya.pdf
- Hesse曲線を利用したCSIDH https://k-nomoto1728.github.io/homepage/pdf/research/CSS2022.pdf
- 超特異楕円曲線
- 資料
- 有限可換群の超特異楕円曲線の同型類の集合への作用 [15] に基づいた同種写像暗号の鍵共有方式
- SIKE: SIDHのKey Encapsulation https://speakerdeck.com/mitsu1119/castryck-decru-attack-nitiyotutohong-retemiru
- 使う曲線は固定
- NIST Round1: y2 = x3+x
- NIST Round 2..: y2 = x3 + 6x2 + x
- 使う曲線は固定
- 実装
CTF
- N1CTF - Seashells
- TRX2025 - Lepton2
- https://github.com/Sarkoxed/ctf-writeups/tree/master/trx-2025/lepton2
- Kernelを使った問題で良い感じにisogenyで変換すると、条件によって入力を単位元になったり、ならなかったりして、単位元になるときは
.xy()を呼ぶと例外が発生するのでそれをオラクルとして良い感じに復元する - https://magicfrank00.github.io/writeups/writeups/trxctf/trxctf-crypto/#lepton2---writeup
- 0CTF 2024 - ZKPQC1
- ker_phi.codomain()とEAのj-invariantが一致するようなkernelで、weil pairingが互いに1でない(1次独立な)ものを3つ見つけるところが問題
- 2-isogenyでy2=x3-xに移して(x,y)->(-x,iy)することで、y2=x3+6x2+x上で2i倍写像が作れる(これ https://eprint.iacr.org/2020/439 の4.1)
- E0->EAのkernelをKとしたとき、[i]Kと[1+i]Kをkernelとするisogenyも高確率でcodomainが同じj-invariantになった(謎)
- TSG Live CTF 14
巻末資料
- 読んだ入門資料
- https://note.com/kokeshim0chi
- https://leonahioki.medium.com/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E3%81%AE%E5%A4%A2%E3%81%AE%E5%9B%BD%E3%81%AB%E4%BD%8F%E3%82%82%E3%81%86-12dcc675995a
- https://qiita.com/kobae964/items/e3927b57f1bf91f4caf6?utm_campaign=post_article&utm_medium=twitter&utm_source=twitter_share
- https://www.youtube.com/watch?v=jxmN8LqyTR4
- https://furutsuki.hatenablog.com/entry/2021/03/16/095021#%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E6%9A%97%E5%8F%B7
- https://furutsuki.hatenablog.com/entry/2020/05/05/112207#ptr-yudai%E3%81%AE%E7%99%BA%E8%A1%A8
- https://zenn.dev/anko/articles/ctf-crypto-ellipticcurve
- https://qiita.com/rinr0q/items/c1180bf2bc8ab9c7e62e
- https://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1814-10.pdf
- kurenaifさんオススメ本 https://www.amazon.co.jp/dp/462106343X/ref=cm_sw_r_tw_dp_CSSMANPTYEESMYPKW6TG
- kurenaifさんオススメ本 https://www.amazon.co.jp/dp/4621064533/ref=cm_sw_r_tw_dp_M9RBNDZYSFAMRXXK95BW
- http://www4.math.sci.osaka-u.ac.jp/~ogawa/documents/papers/1997SummerSchool/ellcur.pdf
- http://mathweb.sc.niigata-u.ac.jp/~hoshi/WatanabeNiigataMasterThesisSlide2024.pdf
- https://github.com/jvdsn/crypto-attacks/tree/master/attacks/ecc
- https://www.cryptrec.go.jp/exreport/cryptrec-ex-3001-2020.pdf
- https://safecurves.cr.yp.to/equation.html
- yoshi-campの同種写像暗号回 https://ptr-yudai.hatenablog.com/entry/2022/12/13/235034#theoremoon-%E7%8C%AB%E3%81%A8%E5%AD%A6%E3%81%B6%E5%90%8C%E7%A8%AE%E5%86%99%E5%83%8F%E6%9A%97%E5%8F%B7