728x90

풀이

제공된 문제파일에는 암호화된 플래그 파일 flag.txt와 공개키 파일 public_key.pem이 포함되어 있다.

 

RSA-wiener에 대한 내용은 아래 글을 참고하였다.

https://dokhakdubini.tistory.com/289

 

[RSA] RSA 공격법

RSA 공격법 CTF에서 크립토문제로 생각보다 자주 출제되는 RSA 이다. 크게 분류하면 적절하지 못한 소수를 택한 경우 / 구조상 문제로 나뉜다. 0. 개인키 유출 p, q, ϕ(n), d 중 단 하나라도 노출된다면

dokhakdubini.tistory.com

Wiener attack은 RSA 암호에서 공개된 큰 모듈러스 n과 비교적 작은 비밀 지수 d를 가진 경우, 연속된 분수를 사용하여 d를 추정하는 공격 방법이라고 한다. 

 

블로그 글에 나온 `rsa-wiener-attack` 라이브러리를 이용하여 wiener 공격을 진행했다.

git clone https://github.com/pablocelayes/rsa-wiener-attack.git

위 코드를 통해 라이브러리를 문제 폴더에 클론하였다.

import sys
sys.path.append('c:/dreamhack/RSA-wiener/rsa_wiener_attack/') 
#RSAwienerHacker에서 모듈 임포트 문제로 추가

from Crypto.Util.number import * 
from Crypto.PublicKey import RSA
from rsa_wiener_attack import RSAwienerHacker

# 공개키 파일 로드
with open('C:/dreamhack/RSA-wiener/public_key.pem', 'r') as f:
    public_key = RSA.import_key(f.read())
    
# flag 파일 로드
with open('C:/dreamhack/RSA-wiener/flag.txt', 'r') as flag_file:
    flag = int(flag_file.read(), 16) #flag.txt의 값을 16진수로 해석하여 정수로 변환

n = public_key.n
e = public_key.e

d = RSAwienerHacker.hack_RSA(e, n) #라이브러리의 hack_RSA를 이용하여 비밀키 획득

pt = pow(flag,d,n) #획득한 비밀키로 평문 획득
print(long_to_bytes(pt)) #평문을 바이트 형식으로 변환하여 출력

공개키를 얻고 라이브러리의 hack_RSA 함수를 이용하여 비밀키를 획득하여 복호화하는 파이썬 코드를 작성하였다.

해당 코드를 실행해보면 아래와 같이 flag를 얻을 수 있다.

 

'Write-up > Crypto' 카테고리의 다른 글

[Dreamhack] ICM2022  (0) 2024.09.13
[Dreamhack] Robot Only  (0) 2024.05.13
[Dreamhack] Textbook-RSA  (0) 2024.04.08
[Dreamhack] chinese what?  (0) 2024.04.08
[Dreamhack] likeb64  (0) 2024.04.03

+ Recent posts