CRT, 중국인 나머지 정리는
- 값을 알아야 하고
- 중국인 나머지를 사용하여 계산하면 새로운 값 과 을 얻을 수 있음
- 세제곱근 계산: 의 세제곱근을 구하면, 원래의 메세지를 복구
- 바이트로 변환: 이 결과를 바이트로 변환하면 flag 값이 나오게 된다.
이때 중국인 나머지 정리는
서로 소인 자연수 n1, n2, … , nk와 임의의 정수 a1, a2, … , ak가 있을 때, 임의의 i(1 ≤ i ≤ k)에 대해
x ≡ ai (mod ni) 로 표현되는 변수 x의 연립 합동 방정식에 대해
이 방정식이 성립하는 값 x=a가 항상 존재하며
또한 그 값은 n1 n2 … nk의 나머지값 안에서 유일하게 존재한다.
즉, 방정식의 해는 모두 x ≡ a (mod n1 n2 … nk)로 표현 가능하다.
그래서 코드로 보자면 아래와 같이 나온다
from Crypto.Util.number import *
from sympy.ntheory.modular import crt # 중국 나머지 정리 사용
import gmpy2
e = 3 # 공개키가 3인 경우 (RSA의 일반적인 값)
n1 =
c1 =
n2 =
c2 =
n3 =
c3 =
# 중국 나머지 정리를 사용하여 결합된 암호화된 값과 모듈러를 계산
# crt는 주어진 리스트의 나머지와 모듈러를 사용하여, 새로운 모듈러와 암호화된 값을 반환.
M, N = crt([c1, c2, c3], [n1, n2, n3]) # M은 결합된 암호화된 값, N은 결합된 모듈러스
# 세제곱근을 사용하여 암호화된 값을 해독
# gmpy2.iroot()는 M의 세제곱근을 반환 이는 e=3일 때, RSA 암호화의 복호화 방법임
m = gmpy2.iroot(M, 3)[0] # 세제곱근의 첫 번째 반환 값은 정수 부분
plaintext = long_to_bytes(int(m)) # 정수를 바이트로 변환
print(plaintext.decode()) # 출력되는 문자열이 암호화된 원래 메시지
'Cryptography' 카테고리의 다른 글
Tjctf writeup - weird crypto (0) | 2024.05.21 |
---|---|
[python] .pem 파일에서 e,n 얻기 (0) | 2024.03.27 |
[Cryptohack] Diffie-Hellman Starter 1 write up (0) | 2024.03.04 |
RSA 낮은 지수 공격 cyling Attack code (0) | 2024.03.03 |
BraekerCTF Write up - Thus spoke machine (0) | 2024.02.29 |
CRT, 중국인 나머지 정리는
- 값을 알아야 하고
- 중국인 나머지를 사용하여 계산하면 새로운 값 과 을 얻을 수 있음
- 세제곱근 계산: 의 세제곱근을 구하면, 원래의 메세지를 복구
- 바이트로 변환: 이 결과를 바이트로 변환하면 flag 값이 나오게 된다.
이때 중국인 나머지 정리는
서로 소인 자연수 n1, n2, … , nk와 임의의 정수 a1, a2, … , ak가 있을 때, 임의의 i(1 ≤ i ≤ k)에 대해
x ≡ ai (mod ni) 로 표현되는 변수 x의 연립 합동 방정식에 대해
이 방정식이 성립하는 값 x=a가 항상 존재하며
또한 그 값은 n1 n2 … nk의 나머지값 안에서 유일하게 존재한다.
즉, 방정식의 해는 모두 x ≡ a (mod n1 n2 … nk)로 표현 가능하다.
그래서 코드로 보자면 아래와 같이 나온다
from Crypto.Util.number import *
from sympy.ntheory.modular import crt # 중국 나머지 정리 사용
import gmpy2
e = 3 # 공개키가 3인 경우 (RSA의 일반적인 값)
n1 =
c1 =
n2 =
c2 =
n3 =
c3 =
# 중국 나머지 정리를 사용하여 결합된 암호화된 값과 모듈러를 계산
# crt는 주어진 리스트의 나머지와 모듈러를 사용하여, 새로운 모듈러와 암호화된 값을 반환.
M, N = crt([c1, c2, c3], [n1, n2, n3]) # M은 결합된 암호화된 값, N은 결합된 모듈러스
# 세제곱근을 사용하여 암호화된 값을 해독
# gmpy2.iroot()는 M의 세제곱근을 반환 이는 e=3일 때, RSA 암호화의 복호화 방법임
m = gmpy2.iroot(M, 3)[0] # 세제곱근의 첫 번째 반환 값은 정수 부분
plaintext = long_to_bytes(int(m)) # 정수를 바이트로 변환
print(plaintext.decode()) # 출력되는 문자열이 암호화된 원래 메시지
'Cryptography' 카테고리의 다른 글
Tjctf writeup - weird crypto (0) | 2024.05.21 |
---|---|
[python] .pem 파일에서 e,n 얻기 (0) | 2024.03.27 |
[Cryptohack] Diffie-Hellman Starter 1 write up (0) | 2024.03.04 |
RSA 낮은 지수 공격 cyling Attack code (0) | 2024.03.03 |
BraekerCTF Write up - Thus spoke machine (0) | 2024.02.29 |