암독 과제해보고 암호문제 푸니까 재밋는것 같기도..
알고리즘은 이렇다.
def encrypt(nbit, msg):
msg = bytes_to_long(msg)
p = getPrime(nbit)
q = getPrime(nbit)
n = p*q
s = getPrime(4)
enc = pow(n+1, msg, n**(s+1))
return n, enc
주어지는건 enc와 n 이고 msg를 알아내야한다.
식은 이렇다
enc=(n+1)^msg(modn^(s+1))
여기서 재밌는건 s+1>2이면 다음이 성립한다는 것!
enc=(n+1)^msg=msg*n+1(mod n^2)=mn+1(mod n^2)
이고
(enc-1)/n(mod n^2)=m이라는 식이 완성되었다.
이제 계산한다.
>>> gmpy2.div((enc-1)%(n**2),n)
mpz(3111713836765922319510495043104426235462341566734455114627991655609961822874033923703388182594027279760482968199249300393055526546602287243645)
>>> hex(3111713836765922319510495043104426235462341566734455114627991655609961822874033923703388182594027279760482968199249300393055526546602287243645)[2:-1].decode('hex')
'ASIS{Congratz_You_are_Discrete_Logarithm_Problem_Solver!!!}'
>>>
'CTF' 카테고리의 다른 글
[plaid2017]pykemon (0) | 2017.04.24 |
---|---|
[codegate final]owner (0) | 2017.04.19 |
asis secured portal (0) | 2017.04.13 |
[asisctf]wandere bits (0) | 2017.04.12 |
[asisctf]start hard (0) | 2017.04.12 |