Description
Category: Crypto
Source: Codegate 2018 Quals.
Points: 300
Description:
XD
source : Codegate 2018 Quals.
Write-up
주어진 파일을 unzip으로 풀어보면, RSAbaby.py 파일과 이를 수행한 결과인 Result.txt 파일을 확인할 수 있다. Result.txt에 있는 값들을 이용하여 암호화 된 flag를 푸는 문제임을 쉽게 짐작할 수 있다.
문제로 부터 얻어낼 수 있는 값은 n(modulus), e, h, g, encrypted flag이다.
임의의 a에 대하여, 이므로,
임을 알 수 있다.
형태를 보면 아래의 페르마의 소정리(Fermat's little theorem)와 닮은 것 같다.
페르마의 소정리를 이용할 수 있도록 수식을 확장해 나가보자.
은 p의 배수임을 알 수 있고, n도 p의 배수이므로, GCD를 적용하면 p를 찾아낼 수 있다. (p는 소수니까)
p를 찾아내면 N = pq로 부터 q를 간단히 계산해낼 수 있고, p, q와 e를 알게 되었으므로 d도 알아낼 수 있다.
찾아낸 d를 이용해서 암호화 된 flag를 복호화 하면 원래의 flag 값을 확인 가능하다.
아래는 a를 2로 하여 flag를 계산해내는 코드이다.
import re
enc_flag = (...)
n = (...)
h = (...)
g = (...)
e = 65537
def xgcd(b, n):
x0, x1, y0, y1 = 1, 0, 0, 1
while n != 0:
q, b, n = b // n, n, b % n
x0, x1 = x1, x0 - q * x1
y0, y1 = y1, y0 - q * y1
return b, x0, y0
def mulinv(b, n):
g, x, _ = xgcd(b, n)
if g == 1:
return x % n
kp = pow(2, e*g, n) * pow(2, 0xdeadbeef - 1, n) - 1
p, _, _ = xgcd(kp, n)
q = n / p
pi_n = (p-1)*(q-1)
d = mulinv(e, pi_n)
flag = pow(enc_flag, d, n)
print re.sub('(..)', lambda x: chr(int(x.group(1), 16)), hex(flag)[2:])
Flag : Whatever you do, the Basics are the most important :-D
'writeups > Crypto' 카테고리의 다른 글
Simple Logic (0) | 2019.11.26 |
---|---|
OTP (0) | 2019.11.26 |
real-baby-rsa (0) | 2019.11.26 |
Ez Pz (0) | 2019.11.26 |
Noki (0) | 2019.11.26 |