CTF | wargame

Alexctf / What is this encryption? (고전 rsa 복호화)

nopdata 2017. 3. 11. 04:25
date : `17.02

Fady assumed this time that you will be so n00b to tell what encryption he is using
he send the following note to his friend in plain sight :

rsa 알고리즘을 통해 암호화 된 데이터를 복호화 해야 하는 문제이다. 제공되는 파일의 내용은 다음과 같이 구성되어 있다.


p=0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9

q=0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307

e=0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41

c=0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520

이전에 공부를 했지만 매번 까먹는 rsa. 정리가 필요한듯 하다.

서로소인 p,q를 가지고 공개키 e, 개인키 d를 만들어 내고 이를 이용하여 데이터를 암호화 한다.

rsa의 원리는 다음과 같다.
  1. 서로소인 임의의 p, q를 정한다. 큰 수를 사용한다.
  2. n = p * q
  3. phi = (p-1) * (q-1)
  4. phi보다 작고 phi와 서로소인 수 e를 찾는다.
  5. d*e (mod n) = 1 인 정수 d를 구한다.

d를 구할때 유클리드 호제법을 사용하며, c = msg ^ e (mod n) == msg ^ d (mod n)이 성립됨을 알아야 한다.

사용한 소스코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def rsa(c, e, p, q):
    from Crypto.PublicKey import RSA
    import gmpy2
    
    c = long(c, 16)
    e = long(e, 16)
    p = long(p, 16)
    q = long(q, 16)
    
    phi = (p-1)*(q-1)
    n = p*q
    d = long(gmpy2.invert(e,phi))
    
    key = RSA.construct((n, e, d))
    m = key.decrypt(c)
    
    return hex(d), hex(n), hex(m)
 
rsa.__doc__ = "return d, n, m\nd : Exponente\nn : Modulo\nm : msg\nc = msg ^ e (mod n) | msg = c ^ d (mod n)\nrefer : http://ronins.team/alexctf_cr3_what_is_this_encryption/"

gmpy2.invert함수는 d*e == 1 (mod n)을 구해 주는 함수이다.

1
2
3
4
5
6
7
8
9
10
from my imoprt rsa
 
p="0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9"
q="0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307"
e="0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41"
c="0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520"
 
res = rsa(c,e,p,q)
print res[2][2:-1].decode('hex')
## ALEXCTF{RS4_I5_E55ENT1AL_T0_D0_BY_H4ND}
cs

Flag : ALEXCTF{RS4_I5_E55ENT1AL_T0_D0_BY_H4ND}