CakeCTF2021 discrete_log
概要
フラグの文字列の$i$文字目の文字コードを$m_i$として $$ c_i \equiv g^{rm_i} \mod p $$ の各$c_i$が与えられる.なお,素数$p$と正の整数$g$は与えられている.正の整数$r$は与えられない.
解法
$g^r$の値がわかれば,$m_i$を全探索(多くて256通り)すればいい.
フラグ形式より,$m_0$がord("C")であることがわかるので,$d\equiv m_0^{-1}\mod \phi(p)$として
$(g^{rm_0})^d \equiv g^r \mod p$と計算することで$g^r$が求める.
from Crypto.Util.number import *
def GCD(a,b):
    if a%b==0:
        return b
    return GCD(b,a%b)
def LCM(a,b):
    return a//GCD(a,b)*b
def extGCD(a, b):
    if b:
        d, y, x = extGCD(b, a % b)
        y -= (a // b)*x
        return d, x, y
    return a, 1, 0
p = # 長いので省略
q = 
cs = 
d = inverse(ord("C"),p-1)
gr = pow(cs[0],d,p)
flag = ""
for c in cs:
    for i in range(1<<8):
        if c==pow(gr,i,p):
            flag += chr(i)
print(flag)
CakeCTF{ba37a0f409ef3ec23a6cffbc474a1cef}
コメント
1文字ずつ暗号化するのは危険