디피-헬만(Diffie-Hellman) 키 교환은 공개 채널을 통해 두 당사자가 비밀 키를 안전하게 공유할 수 있게 하는 암호학적 프로토콜이다. 1976년 Whitfield Diffie와 Martin Hellman이 발표했다.
수학적 원리
공개 파라미터: 소수 p, 원시근 g
Alice: Bob:
비밀키: a 비밀키: b
공개키: A = g^a mod p B = g^b mod p
↕ 공개 채널 교환 ↕
공유비밀 = B^a mod p = g^(ab) mod p
공유비밀 = A^b mod p = g^(ab) mod p
도청자는 g^a mod p, g^b mod p만 알 수 있음
→ g^(ab) mod p 계산은 이산로그 문제 (계산 불가)
python
import secrets
# DH 파라미터 (실제로는 더 큰 소수 사용)
p = 23 # 소수
g = 5 # 원시근
# Alice
a = secrets.randbelow(p - 2) + 2 # 비밀키
A = pow(g, a, p) # 공개키: g^a mod p
# Bob
b = secrets.randbelow(p - 2) + 2
B = pow(g, b, p)
# 공유 비밀 계산
alice_secret = pow(B, a, p) # B^a mod p
bob_secret = pow(A, b, p) # A^b mod p
assert alice_secret == bob_secret # 동일한 공유 비밀
print(f"공유 비밀: {alice_secret}")
DH 변형 비교
| 방식 | 기반 | 키 크기 | 속도 | 용도 |
|---|
| DH (유한체) | 이산로그 | 2048+ bit | 느림 | 레거시 |
| ECDH | 타원곡선 이산로그 | 256 bit | 빠름 | TLS 1.2 |
| ECDHE | ECDH + Ephemeral | 256 bit | 빠름 | TLS 1.3 |
| X25519 | Curve25519 | 256 bit | 매우 빠름 | 현대 권장 |
ECDHE의 장점
Ephemeral (임시 키 사용):
- 각 세션마다 새 DH 키 쌍 생성
- 장기 키 유출 시에도 과거 세션 보호
→ 완전 순방향 비밀성 (PFS) 달성
취약점
- •중간자 공격: 공개키 인증 없으면 취약 → 인증서로 해결
- •소수 취약점: 작은 p 또는 비표준 파라미터 → RFC 7919 권장 그룹 사용
- •로그잼 공격: 다운그레이드로 512비트 DH 강제 → 1024비트 이상 사용
관련 문서
- •[tls-advanced|[TLS 1.3 심화]]
- •[[perfect-forward-secrecy|완전 순방향 비밀성 (PFS)]]
- •[[crypto-protocols|암호 프로토콜]]