はまやんはまやんはまやん

hamayanhamayan's blog

CTFのCryptoにおける楕円曲線まとめ [EC, isogeny]

CTFにおけるCrypto入門とまとめの1つです。

体系的に理解できておらず、殴り書きです。何も分からん。

楕円曲線

  • 楕円曲線: 体Kに対して y2+a_1xy+a_3y = x3 + a_2x2+a_4x + a_6 を満たす解の集合を楕円曲線と呼ぶ
    • 数学的には、楕円曲線とは種数1の非特異代数曲線のことを指す。その中でもワイエルシュトラスの標準形が一般的な表現形式の1つ
      • 点の計算方法は楕円曲線(weierstress, edwards, mongomery,...)によって違うが、代数的構造は同じになる
        • 離散対数問題の困難性は同等で、同じレベルのセキュリティを担保できる
        • 実用上用いる楕円曲線によって計算効率が異なったり、mongomery形式はサイドチャネル攻撃に脆弱と言った実装上の差もある
      • 「種数1の非特異代数曲線」とは
        • 代数曲線 -> 多項式方程式 f(x,y) = 0 で定義される曲線
        • 非特異(smooth) -> 特異点がない。つまり、曲線上で偏微分が同時に0になる点(∂f/∂x = 0 かつ ∂f/∂y = 0)がない。尖ってるとダメ。だからsmooth
          • 楕円曲線の計算に接線を用いるものがあるが、その際に接線が一意に定まらない
          • また、「特異楕円曲線では離散対数問題が多項式時間で解ける」
            • Smart攻撃: 特定の特異曲線で効率的に離散対数を計算
            • 以上楕円曲線攻撃: 特異点を利用した鍵回復
        • 種数(genus) -> 種数1:トーラス(ドーナツ型、穴が1個)- 楕円曲線
          • 種数1の曲線のみが自然な群構造を持つ
    • Weierstrass 方程式: y2+a_1xy+a_3y = x3 + a_2x2+a_4x + a_6
    • ワイエルシュトラスの標準形 y^2 = x^3 + ax + b
      • a,bは有限体、x,yはa,bの「代数的閉包」
      • 4 a^3 + 27 b^2 != 0を満たす必要がある
        • これは特異点が存在しないための条件
      • 体Kの標数が2,3でないとき、x,yの線形変換によって2次項を消すことができ、a,b ∈ Kを用いてワイエルシュトラスの標準形に変換可能
      • mod pで素数pは5以上である必要がある
    • 表現方法: アフィン座標(x,y) -> 投影座標[X:Y:Z]
      • 投影座標:楕円曲線上の点を[x:y:1]で、無限遠点Oは[0:1:0]と表現する
        • sagemathもこの形式
        • この形式で計算することで加算公式が無限遠点があっても統一的に書けるし、計算も早いらしい
      • 他にもJacobian座標やProjective座標が使われ、こっちは除算が避けられ、計算効率が良いらしい
      • 多分座標の取り方は単純に実装上の問題だけであり、数学的なアレコレの問題ではない
  • 体Kいろいろ
  • 楕円曲線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 群には格子の構造が入るらしい(???)
  • スカラー倍について
    • 楕円曲線上の点に定数xの逆数x^−1をかけるときは楕円曲線の位数の逆数をとる。つまり、位数が分かっていればスカラー倍で割れる
  • 楕円曲線の位数 #E(Fp): mod p上の楕円曲線上にある点の総数のこと
  • 楕円曲線上の「点Pの位数」とは,rP=Oとなる最小の正整数rである.位数は常に存在し,楕円曲線の位数 #E(Fq)を割り切る
  • Hasse の定理
    • 体の標数が2,3ではない有限体Fq上の楕円曲線E/Fqの位数#E(Fq)について、|#E(Fp) - (q+1)| ≦ 2 sqrt(q) が成り立つ
    • Hasse の定理 |E(Fq)|=q−t+1 の方が正しい?
      • tはフロベニウス写像Φのtraceであり、Φ2-tΦ+p=0を満たす数tである
  • 群構造
    • 楕円曲線はアーベル群
    • 楕円曲線がなす群については、以下のいずれかになる EC.abelian_group()で確認可能
      • 1点集合の群(自明な群) Trivial group embedded in Abelian...
      • 巡回群。Eが全体で巡回群であることはまあまあ多い。実用されている暗号システムでは基本的に素数位数の巡回群になるようにパラメタが選ばれる
      • 巡回群2個の直和
        • BLS12-381の大元となる群は巡回群ではないが、その一部だけを使って巡回群になるようにしている
  • 安全曲線 https://www.fujitsu.com/downloads/JP/archive/imgjp/jmag/vol50-4/paper06.pdf
    1. 曲線の位数が素数、またはほぼ素数であること
    2. 特殊な曲線にならない(特にtraceは0~2にならない)
  • sagemathでx座標から点を求めるときは、 A = E.lift_x([x座標])とする
  • SageMathが曲線を初期化できない -> 曲線が壊れている -> 楕円曲線に置いて壊れているというのは「特異である」ということ
  • 曲線によって、色々な性質が出てきたり、計算が高速化できたりする
  • 色々な楕円曲線
  • 有限体上の楕円曲線は通常曲線と超特異曲線に分類できる
    • 標数p上の超特異曲線は…
      • 約p/12個存在する。つまり、ランダムに曲線を生成したとき超特異である確率はおおよそ1/p
      • 全てFp2上で定義される(これ大事では?)
        • j-不変量を鍵として共有するときサイズは2logpくらい
    • Tateの定理:超特異曲線と同種な曲線は超特異
    • 超特異曲線Eは位数で特徴づけられる
      • #E(Fp) = p+1
      • #E(Fp^2) = (p+1)^2 または (p-1)^2
  • 判別式D、j-不変量が固定であれば、位数と素数の間に固定的な関係があるかも
    • ハッセの定理
    • フロベニウス跡、トレース t を使って、#E(Fp) = p+1-t
  • 色んな情報から、もともとの楕円曲線を導く
  • 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であることを確認する。

楕円曲線暗号: ECC: Elliptic Curve Cryptography と楕円曲線上の離散対数問題 ECDLP: Elliptic Curve Discrete Logarithm Problem

  • ECC: Elliptic Curve Cryptography
  • CurveBall CVE-2020-0601: Q=dPでQとPが固定のときdを解くのは難しいが、Qが与えられてdとPを自由に決められるなら、等式を満たすdとPをQから決めるのは簡単。d=2とかにしてP=Q/dすればいい。

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くらい?
  • 勉強してみたお気持ち: そのままWeil PairingをQ=rPに使おうとすると線形性があるのでem(P,rP)=em(P,P)r=1となってしまって進まないので拡大体に一回映してねじれ群を増やして線形独立な点を探してきて使うことでem(P,B)!=1にしてうまくWeil Pairingによって乗法巡回群に落とし込んでいる?
  • 実用的には...
    1. 埋め込み次数kの計算 p^k-1 = 0 mod #E(Fp)を満たす最小のkを計算
    2. k≦6ならMOV攻撃可能!
    3. https://zenn.dev/hk_ilohas/articles/3c7ff88cb319fc からmov_attackを借りて使う 他実装 https://www.hackthebox.com/blog/movs-like-jagger-ca-ctf-2022-crypto-writeup
  • 埋め込み次数 k
    • k=1のとき、つまり、位数がp+1のとき、楕円曲線はSupersingularであると言う
      • E.is_supersingular()でsupersingularか判定できる
  • MOV attack 有限体の上の離散対数問題になる -> Weil-paringを使う
    • E(GF(p)) ≅ E(GF(p**k)) ≅ GF(p**k)×
  • Frey-Rück Reduction (同上, Tate-pairingを用いる)
  • 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

Invalid Curve Attack / Small-Subgroup Attack

他、資料

ECDH鍵共有: ECDH, 楕円ElGamal暗号

  • ECDH鍵共有: ECDH
    1. 最初に、楕円曲線E/FpとベースポイントP ∈ E/Fpを作成し、共有する
    2. [Alice] 乱数aを用意して、aGを計算して、送る
    3. [Bob] 乱数bを用意して、bGを計算して、送る
    4. [Alice] 貰ったbGから、abGを計算する
    5. [Bob] 貰ったaGから、abGを計算する
    6. S=abGという共通鍵が生成できた
      • Sのx座標をハッシュ化して共通鍵とすることもある?
  • 楕円ElGamal暗号
    1. [両者] ECDH鍵共有で共通鍵 abGを生成する
    2. [Alice] 送りたいメッセージ M を用意して、M+abGを計算して送る
    3. [Bob] 貰ったM+abGから-abGをしてMを復元する
    4. 楕円曲線の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署名

攻撃手法

https://furutsuki.hatenablog.com/entry/2020/05/05/112207 https://eprint.iacr.org/2023/305.pdf

他メモ

楕円ペアリング

モンゴメリー曲線 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)
    • アフィン空間での座標(x,y)に対してx=X/ZとなるようにX,Zを取り、モンゴメリー座標 P=(X:Z) で表すことができる
      • 変換方法は色々ありそうだが、P(x,y) → P(x:1)
    • モンゴメリー座標に変換して計算することでy座標が無くても高速に計算が可能になる
  • モンゴメリ曲線とツイステッドエドワーズ曲線とは双有理同値

楕円曲線暗号

同種写像 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

SIDH

CSIDH

CTF

巻末資料