05. 인터넷의 평화를 수호하는 RSA (공개키 암호)
1. 학습 목표 (Learning Objectives)
- 이전 챕터의 ‘소수’를 직접 응용하여 전 세계 인터넷 뱅킹(HTTPS, SSL)의 표준 교과서인 RSA 공개키 암호 알고리즘의 작동 흐름을 이해합니다.
- 파이썬(Python)으로 나만의 작은 공장(미니 RSA)을 차려 공개키와 개인키를 만들고 직접 평문을 암호화/복호화하는 실습을 뽐냅니다.
2. 자물쇠는 공개하고, 진짜 열쇠는 내가 숨긴다!
과거 스파이들의 암호는 거대한 맹점이 존재했습니다. 사령부에서 “우리의 철통 보안 키(Key)는 숫자 ‘7’이다!” 라고 무전을 치는 순간, 그 무전을 엿듣던 적군 스파이도 ‘아하, 키가 7이구나’ 하고 날름 훔쳐서 뚫어버리는 위험(키 분배의 역설) 때문이었습니다.
이 딜레마를 1977년 MIT 공대의 수학 천재 3명(리베스트, 샤미르, 애들먼)이 발명한 RSA 알고리즘이 박살 내버립니다. 이들은 아주 기묘한 시스템을 만들었습니다.
“누구든지 나한테 비밀 편지를 보내고 싶으면, 내가 동네방네 다 뿌려놓은 공개 자물쇠(Public Key)로 잠가서 보내라! 근데 명심해라, 너희들이 내 자물쇠로 잠그는 건 1초면 되지만, 한 번 잠긴 그 상자를 여는 유일한 마스터 황금 열쇠(Private Key)는 내 주머니 속에 딱 하나뿐이다!”
내가 만든 거대한 두 소수의 ‘곱셈 결과값’은 세상 사람 모두에게 자물쇠로 나눠주고(공개키), 남들이 몰라야 풀리지 않는 ‘원본 소수 두 개의 알맹이’는 내 주머니 깊숙이(개인키) 챙겨두는 구조. 곱셈은 쉽지만 소인수분해는 불가능하다는 앞 단원의 우주적 수학 법칙이 우리 통장을 해커로부터 철통 방어해주고 있습니다.
3. 파이썬으로 구현하는 미니 RSA 공장 (Python)
보통 RSA는 수백 자리의 소수를 다루지만, 우리는 원리 이해를 위해 한 자릿수 미니 소수(p=3, q=11)로 간략한 RSA 궤도를 돌려보겠습니다. 철수가 영희에게 비밀번호(2)를 전송하는 상황입니다.
# [미니 RSA 튜토리얼]
# (경고: 실제 RSA는 엄청나게 큰 소수와 복잡한 유클리드 호제법 공식을 사용합니다. 아래는 지수 연산 교육용 축소판입니다.)
# 1. 영희의 방: 비밀 열쇠(소수 p, q)를 준비하고 공개 자물쇠(n, e)를 조립합니다.
p = 3
q = 11
n = p * q # 3 * 11 = 33 (자물쇠 본체)
e = 7 # 7 (자물쇠의 톱니바퀴)
d = 3 # 3 (영희만 아는 복호화 황금 열쇠, 수식 생략 결과값)
print(f"🔒 [영희가 세상에 뿌린 공개 자물쇠]: (본체={n}, 톱니={e})")
print(f"🔑 [영희가 숨긴 개인 황금 열쇠]: {d}")
# 2. 철수의 방: 인터넷에 돌아다니는 영희의 자물쇠를 주워서 평문(2)을 잠급니다!
# 평문 평범한 편지 내용 "2"
plaintext = 2
# 철수의 암호화 마법 공식: (평문 ^ 톱니) % 본체
# 2를 7번 제곱하고 33으로 나눈 나머지 연산
ciphertext = (plaintext ** e) % n
print(f"\n▶ [철수가 암호화 한 메시지 (도청당해도 모름)]: {ciphertext}")
# 3. 영희의 방: 도착한 해괴망측한 암호문(29)을 황금 열쇠(d=3)로 산산조각 냅니다!
# 복호화 마법 공식: (암호문 ^ 황금열쇠) % 본체
decrypted_msg = (ciphertext ** d) % n
print(f"◀ [영희가 황금 열쇠로 해독한 원래 메시지]: {decrypted_msg}")
파이썬의 실행 결과 요약:
🔒 [영희가 세상에 뿌린 공개 자물쇠]: (본체=33, 톱니=7)
🔑 [영희가 숨긴 개인 황금 열쇠]: 3
▶ [철수가 암호화 한 메시지 (도청당해도 모름)]: 29
◀ [영희가 황금 열쇠로 해독한 원래 메시지]: 2
철수가 날린 원본 비밀번호 2가 인터넷 망을 탈 때는 알 수 없는 문자 쓰레기 29로 변신했다가, 오직 주머니 속 개인키를 가진 원래 설계자(영희)의 컴퓨터에 들어가는 순간 제곱 모듈러가 발동해 거짓말처럼 다시 2로 풀려납니다. 수학자들의 가슴을 뛰게 하는 인류 최고의 발명품입니다.
4. 학습 정리 (Summary)
- 공개키 (Public Key): 암호화 문을 잠그는 자물쇠 역할만 하며, 세상 누구든 쓸 수 있도록 웹사이트에 만천하에 투명하게 공개되는 키입니다.
- 개인키 (Private Key): 잠긴 암호 상자를 해체할 수 있는 유일한 인수분해 뼈대이며 서버 컴퓨터 가장 깊숙한 곳에 꽁꽁 숨겨두는 마스터키입니다.
- RSA 알고리즘은 ‘정방향 계산은 쉽지만 역방향 역추적은 불가능한’ 수학적 모듈러 함수를 IT 암호 시스템으로 구현해 낸 기적적인 사례입니다.