CTFにおけるCrypto入門とまとめの1つです。
DLP: 離散対数問題
- https://tex2e.github.io/blog/crypto/DLP
- 離散対数問題
y=g^x mod pでy,g,pが既知で、xを計算するのが難しいという問題 - CDH仮定
- DH問題, DDH: 後述するDH鍵共有で現れる問題、g,p,ga mod p, gb mod pが与えられたときにgab mod pを求めよという問題
- DH問題が難しいという過程をCDH仮定と呼ぶ
- DLPが解けるならばDH問題も解ける(逆はわからない)
- DDH仮定が成立しない場合 https://en.wikipedia.org/wiki/Decisional_Diffie%E2%80%93Hellman_assumption
- DLPは、どの上で考えるかで色々ある。どういう条件だと使えるのかはあまりよく分かっていないし、
(Fp)*と同型だから使える?ちゃんと理解してない- FFDLP: Finit Field DLP, 有限体Fp上でDLPを考えたもの。
y=g^x mod pのこと。本稿では主にFFDLPを対象とする - ECDLP: 楕円曲線上でDLPを考えたもの
- 多項式環上のDLP: InCTF 2020 - DLPoly https://crypto-writeup-public.hatenablog.com/entry/InCTF_2020_%257C_DLPoly
- 行列の離散対数問題を解く -> 別稿で解説
- 対称群のDLP redpwnCTF 2021 scrambled-elgs https://blog.y011d4.com/20210713-redpwnctf-writeup#scrambled-elgs
- FFDLP: Finit Field DLP, 有限体Fp上でDLPを考えたもの。
- cado-nfsを使うと256bitsの離散対数問題は解けてしまう
- dlogと表記されることも(対数ログ)
- DLPが効率的に計算できる状況ならば、総積にlogを取って総和に変換できる
- https://blog.whale-tw.com/2025/10/19/qnqsec-ctf-2025/#Republic-of-Geese では総和に変換してLLLしてる
- 対数を取るときの基数は適当でいいが上の解説だと2を使ってる
discrete_log(Zmod(p)(iter), Zmod(p)(2))
離散対数問題の効率的な解法
- Baby-step Giant-step法 O(sqrt(p))
- Pollard's rho法 O(sqrt(p))
- Pollard's kangaroo algorithm / Pollard's Lambda法: 離散対数の探索範囲が限定されている場合に特に効率が良いアルゴリズム
- sagemath
secret_A = discrete_log_lambda(A, G, bounds=(1000000, 100000000)) - SECPK1向けソルバ https://github.com/JeanLucPons/Kangaroo
- https://github.com/Warriii/CTF-Writeups/blob/main/deadsec25/crypto_bullmad.md
- nonceの差を全探索して全部でKangaroo法を適用する計算重すぎて手元だと遅かったけど、Googe Collab使うとマシンパワー強くて速かったという情報がある
- sagemath
- Pohlig–Hellman法
- 指数計算法(Index Calculus Algorithm)
Pohlig–Hellman法
- 位数の約数がsmoothであるときに離散対数問題が効率的に解けるという問題
- mod pであればp-1が位数なので、p-1がsmoothであればいい
- 位数がp2-1であれば、p2-1がsmoothであればいい
- これ、点の位数なので注意(gx mod pの場合は点の位数=全体の位数かもなので問題ないかもだけど、楕円曲線の時とかは注意)
- 離散対数問題
y=g^x mod pに対して、x部分の上限がより小さくなった問題に分割して計算する方法 - 計算方法
- (p-1)を因数分解する。q1 * q2 * ... qk になったとする
- q1,q2,...,qkは互いに素である必要がある。よって、素因数分解した上で各素因数の累乗についてqiとしてまとめていくことになる
- 各qiについて、
yi = y ^ (p-1/qi),gi = g^(p-1/qi)と定義してyi = gi^ai mod pで0≦ai<qiとして離散対数問題を解きaiを求める- p-1の因数分解の結果がsmoothな(最大値が小さい)ときにこの小問題が解けてPohling-Hellman法が適用可能になる
- なぜこうなるかについては、
x = ai + bi * qiと定義した後にy ^ (p-1/qi)を色々計算して、逐次定義を付けるとyi = gi^aiが得られる
- この時得られたaiの値は
x = ai mod qiを満たすので、CRTを適用することでxが得られる
- (p-1)を因数分解する。q1 * q2 * ... qk になったとする
- ちなみにsageのdiscrete_logはpohlig-hellman + BSGS
- sageのdiscrete_logは素因数分解できた全部でbsgsやろうとするから、最後の一素因数についてはやらなくていいみたいな場合は手動でやる
DLPの困難性を利用した暗号
Deffie-Hellman 鍵共有
- Deffie-Hellman 鍵共有: 2者間で秘密a,bを交換することで秘密鍵gabを秘密裏に共有できるアルゴリズム
- 手順
- 整数 g,p を事前に両者で決める(公開して良い)
- Aさんが秘密aを、Bさんが秘密bを持っているとする
- それぞれ、KA = ga mod p, KB = gb mod p を計算して相手に渡す (つまり、g, p, KA, KBは公開情報で、aはAさんのみ、bはBさんのみ知っている状態)
- Aさんは KBa, BさんはKAbをすることで、互いにgabを取得することができる。これは公開情報のみで作るのは困難である
- g, pの条件
- 改ざん、中間者攻撃には弱い
ElGamal暗号
- ElGamal暗号
- (法nの)既約剰余類群でのアルゴリズム
- 鍵生成
- 暗号化
- 0からq-1の範囲からランダムな値rを選ぶ
- c1 = gr mod p, c2 = m * hr mod p を計算。(c1, c2)が暗号文となる
- ランダム要素が入るのでRSAとは違い、暗号文が2つで、かつ、非決定的な暗号文となる。
- このrも離散対数問題的に逆算できないようになっていて、かつ、共有しなくても復号可能(使ったら捨てる)
- 復号 m = c2 * (c1 ^ x) ^ (-1) mod p
- 乗法準同型性を持つ
- mxの暗号文(cx1, cx2, rx)とmyの暗号文(cy1, cy2, ry)の場合、暗号文(cx1cy1, cx2cy2)はmx*myをrx+ryを使って暗号化したことになる
- 脆弱なElGamal暗号
- 平方剰余のルジャンドル記号を使うことで偶奇性は判定が可能
- zer0pts CTF 2021 janken vs yoshiking https://blog.y011d4.com/20210307-zer0pts-ctf-writeup#janken-vs-yoshiking
ElGamal署名
- 実際はElGamal署名から派生したDSAが良く使われる
- 派生したDSAというデジタル署名方式がある
- 鍵生成
- 署名生成
- (1,p-1)かつgcd(k,p-1)=1となる乱数kを選択
- r=gk mod pを計算
- s=(H(m)-xr)/k mod (p-1)を計算
- (r,s)が署名
- 署名検証
- rが(0,p)、sが(0,p-1)の範囲にあることを確認
- gH(m) = yr * rs mod pであることを確認
- 注意点
Schnorr(シュノア)署名
- DLP(:離散対数問題)を数学的根拠とする署名方式
- DSAやECDSAの基礎となっている
- アルゴリズム
- セキュリティ
- 巨大素数qや整数gを適切に選ばないと署名が偽装できるかも
- 離散対数問題が簡単になって、p=gsが計算できsが漏れる
- 安全な選び方は原論文に書いてあるとのこと
- https://blog.visvirial.com/articles/721 日本語でここに書いてあるが、正直読み方が分からん
- 乱数r
- 巨大素数qや整数gを適切に選ばないと署名が偽装できるかも
DSA: Digital Signature Algorithm
- 現状は利用には推奨されない
- 歴史
- 1991年にNISTによって、DSS: Digital signature Standardでの目的として提唱
- 1993年 FIPS 196として標準化され、2013年までに何度か改訂されている
- なお、FIPS 186-5により、新たにデジタル署名を行うことは推奨されなくなった
- DSA: ElGamal署名の改良版の1つであり、同様に離散対数問題の困難性に基づく電子署名方式
- 問題
- TSGCTF 2021 - This is DSA https://blog.y011d4.com/20211005-tsgctf-writeup
- 条件の1つを消して解く問題
- TSGCTF 2021 - This is DSA https://blog.y011d4.com/20211005-tsgctf-writeup