Diffie-Hellman 키 교환은 공개된 네트워크 환경에서 두 사용자가 안전하게 공유 비밀키를 생성할 수 있도록 하는 대표적인 키 교환 알고리즘이다. 공개된 통신 채널을 사용하더라도 두 사용자는 같은 비밀 값을 계산할 수 있다. 하지만 Diffie-Hellman은 만능이 아니다. 해커들은 통신 중간에 끼어들어 각 사용자와 따로 키를 교환하는 중간자 공격(MITM)을 수행할 수 있다. 따라서 필자는 이번 글에서 Diffie-Hellman 키 교환의 수학적 원리와 내부 동작 과정, 중간자 공격 기법, 방어 전략까지 설명하도록 하겠다.
1. Diffie-Hellman 키 교환의 내부 동작 원리
Diffie-Hellman 기준 키 교환 구조는 다음과 같다.
| 공개 값 |
|---|
| 소수 p |
| 생성자 g |
| Alice의 공개키 A = g^a mod p |
| Bob의 공개키 B = g^b mod p |
| 공유 비밀키 K = g^ab mod p |
Diffie-Hellman은 이산 로그 문제의 어려움을 기반으로 한다. 공격자는 p, g, A, B 값을 모두 볼 수 있지만, A = g^a mod p 에서 개인키 a를 구하는 것은 매우 어렵다. 이 구조를 통해 공개된 네트워크에서도 두 사용자는 같은 공유 비밀키를 만들 수 있다.
1.1 Diffie-Hellman 키 교환 과정
Diffie-Hellman은 다음과 같은 과정으로 동작한다.
-
Alice와 Bob은 공개 값 p와 g를 공유한다.
-
Alice는 개인키 a를 생성하고 A = g^a mod p 값을 Bob에게 전송한다.
-
Bob은 개인키 b를 생성하고 B = g^b mod p 값을 Alice에게 전송한다.
-
Alice는 Bob의 공개키 B를 이용해 K = B^a mod p를 계산한다.
-
Bob은 Alice의 공개키 A를 이용해 K = A^b mod p를 계산한다.
1.2 공유 비밀키가 같아지는 이유
-
Alice가 계산한 값은 B^a mod p 이고, Bob이 계산한 값은 A^b mod p 이다.
-
B = g^b mod p 이므로 Alice의 계산 결과는 (g^b)^a mod p = g^ab mod p 가 된다.
-
A = g^a mod p 이므로 Bob의 계산 결과는 (g^a)^b mod p = g^ab mod p 가 된다.
따라서 두 사람은 서로의 개인키를 직접 공유하지 않아도 같은 공유 비밀키를 얻게 된다.
2. Diffie-Hellman 중간자 공격 기법
2.1 중간자 공격 (MITM)
해커는 Alice와 Bob 사이의 통신을 가로채고, 각각에게 자신이 상대방인 것처럼 행동할 수 있습니다.
Alice <----> Attacker <----> Bob해당 구조에서 Alice는 Attacker를 Bob이라고 생각하고 키를 교환한다. Bob 역시 Attacker를 Alice라고 생각하고 키를 교환한다. 따라서 Attacker는 Alice와 공유 비밀키 하나를 만들고, Bob과도 다른 공유 비밀키 하나를 만들게 된다.
2.1.1 MITM 공격 접근 원리
Diffie-Hellman 키 교환은 키 자체를 안전하게 생성하는 알고리즘이지만, 상대방의 신원을 검증하는 기능은 포함하지 않는다. 즉 Alice가 받은 공개키 B가 정말 Bob이 보낸 값인지 확인하지 않으면 공격자가 자신의 공개키 M으로 바꿔치기 할 수 있다.
2.1.2 키 교환 레이아웃
Diffie-Hellman의 MITM 구조는 다음과 같다.
| MITM |
|---|
| Alice가 A = g^a mod p 전송 |
| Attacker가 A를 가로채고 M1 = g^m1 mod p 전송 |
| Bob이 B = g^b mod p 전송 |
| Attacker가 B를 가로채고 M2 = g^m2 mod p 전송 |
| Alice는 Attacker와 키 공유 |
| Bob도 Attacker와 키 공유 |
Alice가 Bob에게 공개키 A를 보내면 공격자는 이를 가로챈다. 이후 공격자는 자신의 공개키 M1을 Bob에게 전달한다. Bob은 이 값이 Alice의 공개키라고 생각하고 공유 비밀키를 계산한다. 반대로 Bob이 공개키 B를 Alice에게 보내면 공격자는 이를 가로채고 자신의 공개키 M2를 Alice에게 전달한다. Alice는 이 값이 Bob의 공개키라고 생각하고 공유 비밀키를 계산한다. 그러므로 공격자는 Alice와 Bob 사이의 모든 데이터를 복호화하고 다시 암호화해서 전달할 수 있다.
2.2 공개키 바꿔치기 (Public Key Substitution)
공격자는 Diffie-Hellman 교환 과정에서 공개키를 바꿔치기 한다. Alice가 Bob에게 보낸 공개키 A를 그대로 전달하지 않고 공격자의 공개키 M으로 대체한다. Bob도 동일하게 공격자의 공개키를 Alice의 공개키로 인식하게 된다.
이 경우 Alice와 Bob은 서로 직접 키를 공유했다고 생각하지만 실제로는 각각 공격자와 키를 공유한 상태가 된다. 따라서 공격자는 양쪽 통신 내용을 중간에서 읽고 수정할 수 있다.
2.3 인증 없는 키 교환
Diffie-Hellman 자체는 암호학적으로 안전한 키 교환 방식이지만 인증이 없다면 MITM에 취약하다. 특히 익명 Diffie-Hellman 방식에서는 상대방이 누구인지 증명하지 않기 때문에 공격자가 중간에 들어와도 탐지하기 어렵다.
TLS 같은 실제 프로토콜에서는 이 문제를 해결하기 위해 인증서와 전자서명을 함께 사용한다. 서버는 인증서를 통해 자신의 공개키가 신뢰 가능한 기관에서 검증되었음을 증명하고, 클라이언트는 이를 확인한 뒤 키 교환을 진행한다.
3. Diffie-Hellman 방어
3.1 인증서 기반 신원 검증
Diffie-Hellman 키 교환 과정에서 받은 공개키가 실제 통신 상대의 것인지 확인해야 한다. TLS에서는 서버 인증서를 통해 서버의 신원을 검증하고, 인증기관(CA)의 서명을 확인하여 공격자가 공개키를 바꿔치기 하지 못하게 한다.
3.2 전자서명 사용
Diffie-Hellman 공개키 교환 시 공개키 값에 전자서명을 적용하면 공격자가 중간에서 값을 바꾸는 것을 탐지할 수 있다. 예를 들어 서버가 자신의 개인키로 Diffie-Hellman 파라미터에 서명하면 클라이언트는 서버의 공개키로 서명을 검증할 수 있다.
3.3 안전한 파라미터 사용
충분히 큰 소수 p와 안전한 생성자 g를 사용해야 한다. 약한 p 값을 사용하거나 작은 그룹을 사용하면 이산 로그 공격이 가능해질 수 있다. 또한 재사용되는 정적 Diffie-Hellman보다 매 세션마다 새로운 개인키를 생성하는 Ephemeral Diffie-Hellman을 사용하는 것이 안전하다.
— 오늘은 Diffie-Hellman 키 교환과 중간자 공격(MITM)에 대해서 알아보았다. 다음 글에서는 새로운 암호 공격 기법과 방어 기법들을 가지고 오도록 하겠다.