서로 만난 적 없는 두 사람이 모두가 듣는 통신망에서 같은 비밀을 만들 수 있을까요. 디피-헬만 키 교환은 각자 고른 비밀수를 공개하지 않은 채 공개값만 주고받아 같은 공유 비밀을 계산합니다. 1976년 휘트필드 디피와 마틴 헬만이 발표한 논문은 안전한 사전 전달 없이 키를 합의하는 공개키 암호의 방향을 제시했습니다.
A=gᵃ mod p와 B=gᵇ mod p를 공개하면 양쪽은 Bᵃ mod p=Aᵇ mod p=gᵃᵇ mod p라는 같은 값을 얻습니다.
공개하는 값과 숨기는 값
유한체 방식에서는 큰 소수 p와 적절한 생성원 g 같은 도메인 매개변수를 정합니다. 이 값들은 공개되어도 됩니다. 앨리스는 비밀 정수 a를 고르고 A=gᵃ mod p를 계산해 공개합니다. 밥은 비밀 정수 b를 고르고 B=gᵇ mod p를 공개합니다. 도청자는 p, g, A, B를 모두 볼 수 있지만 a와 b는 보지 못합니다.
앨리스는 받은 B를 자신의 a제곱으로 올려 Bᵃ mod p를 구합니다. 밥은 Aᵇ mod p를 구합니다. 모듈러 거듭제곱의 법칙에 따라 Bᵃ=(gᵇ)ᵃ=gᵃᵇ이고 Aᵇ=(gᵃ)ᵇ=gᵃᵇ이므로 둘의 결과가 같습니다. 비밀수를 직접 전송하지 않고 공통 값을 만든다는 점이 핵심입니다.
작은 숫자로 따라 하는 계산
원리를 확인하려고 p=23, g=5를 공개값으로 쓰겠습니다. 앨리스가 a=6을 고르면 A=5⁶ mod 23=8입니다. 밥이 b=15를 고르면 B=5¹⁵ mod 23=19입니다. 앨리스는 19⁶ mod 23=2, 밥은 8¹⁵ mod 23=2를 얻습니다. 두 사람의 공유 결과가 2로 같습니다.
| 구분 | 앨리스 | 밥 |
|---|---|---|
| 비밀값 | a=6 | b=15 |
| 공개값 | A=8 | B=19 |
| 공유값 | Bᵃ mod 23=2 | Aᵇ mod 23=2 |
이 예제는 숫자가 작아 공격자가 5를 몇 번 거듭제곱하면 a와 b를 찾을 수 있습니다. 실제로는 검증된 큰 군과 충분한 길이의 비밀값을 사용합니다. 설명용 숫자를 실제 보안 매개변수로 사용하는 것은 안전하지 않습니다.
이산로그 문제가 만드는 비대칭
g, a, p가 주어졌을 때 gᵃ mod p를 계산하는 것은 빠른 모듈러 거듭제곱으로 효율적으로 할 수 있습니다. 반대로 g, p, A에서 A=gᵃ mod p를 만족하는 a를 찾는 것이 이산로그 문제입니다. 적절한 군과 매개변수를 사용하면 알려진 고전 알고리즘으로 이 역문제를 푸는 비용이 매우 큽니다. 정방향은 쉽고 역방향은 어렵다는 비대칭을 이용합니다.
보안 설명에서 이산로그 문제와 계산 디피-헬만 문제를 구분해야 합니다. 계산 디피-헬만 문제는 gᵃ와 gᵇ가 주어졌을 때 gᵃᵇ를 구하는 문제입니다. 이산로그를 풀 수 있으면 비밀 지수를 얻어 공유값도 계산할 수 있지만, 두 문제가 모든 군에서 완전히 동치라고 단정할 수는 없습니다. 프로토콜의 보안 증명은 사용하는 군과 구체적인 가정을 명시합니다.
도청에는 강하지만 중간자 공격은 막지 못한다
기본 디피-헬만은 수동적으로 듣기만 하는 도청자에게 공유 비밀을 감춥니다. 그러나 공격자가 메시지를 가로채 바꿀 수 있다면 앨리스에게는 공격자의 공개값을, 밥에게도 공격자의 다른 공개값을 보낼 수 있습니다. 그러면 공격자는 앨리스와 비밀 하나, 밥과 비밀 하나를 따로 만들고 양쪽 메시지를 읽어 다시 전달할 수 있습니다.
이 중간자 공격은 이산로그를 풀지 않아도 가능합니다. 기본 교환에는 상대의 신원을 확인하는 기능이 없기 때문입니다. 실제 프로토콜은 인증서 기반 전자서명, 사전에 공유한 키, 인증된 키 교환 규격 등으로 교환 메시지와 신원을 묶습니다. 자물쇠의 수학이 강하더라도 누구와 키를 만들었는지 확인하지 않으면 연결 전체는 안전하지 않습니다.
공유 정수를 그대로 암호키로 쓰지 않는 이유
계산된 gᵃᵇ 값은 공유 비밀 재료이지 일반적으로 완성된 대칭키가 아닙니다. 실제 시스템은 키 유도 함수 KDF에 공유 비밀과 양쪽 공개값, 세션 식별 정보 같은 문맥을 넣어 필요한 길이의 암호키와 인증키를 만듭니다. KDF는 값의 편향을 다루고 서로 다른 용도의 키를 분리하며, 같은 비밀이 다른 프로토콜 문맥에서 재사용되는 위험을 줄입니다.
공개값 검증도 보안의 일부
상대가 보낸 공개값이 허용된 군에 속하는지, 항등원이나 금지된 작은 부분군 값이 아닌지 검사해야 합니다. 검증하지 않으면 공격자가 특수한 값을 보내 비밀 지수에 관한 정보를 조금씩 얻는 공격이 가능할 수 있습니다. 표준은 도메인 매개변수와 공개키의 유효성 검사를 규정하며, 임의의 p와 g를 직접 고르는 대신 검증된 그룹을 사용합니다.
정적 키와 일회성 키
오랫동안 쓰는 정적 개인키와 세션마다 새로 만드는 일회성 개인키를 구분합니다. 양쪽이 세션마다 새 일회성 값을 만들고 사용 후 지우는 DHE 또는 ECDHE는 장기 인증키가 나중에 유출되더라도 과거 세션의 공유 비밀을 곧바로 복구하기 어렵게 하는 순방향 비밀성을 제공할 수 있습니다. 다만 실제 보장은 프로토콜이 일회성 키를 어떻게 인증하고 삭제하는지에 달려 있습니다.
타원곡선 디피-헬만은 무엇이 다를까
ECDH는 소수 모듈러 곱셈군 대신 타원곡선 위 점들의 군을 사용합니다. gᵃ에 대응하는 연산은 기준점의 스칼라배 aG이고, 공유점은 a(bG)=b(aG)=abG입니다. 수학적 연산과 매개변수 크기는 달라지지만 각자 비밀 스칼라를 유지하면서 같은 공유 결과를 얻는 구조는 같습니다. 검증된 곡선, 점 검증, 올바른 인코딩을 사용해야 합니다.
RSA와 목적을 혼동하지 않기
RSA 공개키 암호화의 모듈러 계산은 두 소수의 곱과 개인 지수를 이용합니다. 디피-헬만은 양쪽이 공동 비밀을 합의하는 방식이며 그 자체로 메시지를 암호화하거나 서명하는 알고리즘은 아닙니다. 현대 통신 규격은 키 교환, 인증, 키 유도, 인증된 대칭키 암호를 조합해 하나의 안전한 연결을 만듭니다.
양자컴퓨터와 이산로그
충분히 큰 오류보정 양자컴퓨터가 구현되면 쇼어 알고리즘은 정수 인수분해뿐 아니라 이산로그도 효율적으로 풀 수 있습니다. 따라서 유한체 DH와 ECDH는 모두 양자 공격의 영향을 받습니다. 이는 현재 사용 중인 모든 연결이 이미 해독된다는 뜻이 아니며, 장기간 보호할 자료와 시스템 수명을 고려해 표준기관이 정한 양자내성 전환 계획을 따라야 한다는 뜻입니다.
안전한 적용을 위한 점검표
- 검증된 도메인 매개변수와 암호학적으로 안전한 비밀 난수를 사용합니다.
- 공개값이 올바른 군에 속하는지 검사합니다.
- 전자서명이나 사전 공유키로 교환 상대와 메시지를 인증합니다.
- 공유값을 직접 쓰지 않고 규격에 맞는 KDF로 용도별 키를 유도합니다.
- 일회성 키의 생성·삭제와 오류 처리까지 검증된 프로토콜 구현을 사용합니다.
핵심 정리
디피-헬만은 공개된 p, g와 공개값 A, B만 교환하면서 양쪽이 gᵃᵇ라는 같은 비밀 재료를 계산하게 합니다. 안전성은 적절한 군에서 이산로그와 관련 문제가 어렵다는 가정에 기대지만, 기본 방식만으로는 상대를 인증하지 못합니다. 그래서 실제 보안은 공개값 검증, 인증, 키 유도 함수, 안전한 대칭키 암호가 결합될 때 완성됩니다.
키 확인은 무엇을 보장할까
양쪽이 같은 키 자료를 계산했더라도 상대도 정말 같은 값을 가졌는지 확인하지 않은 상태일 수 있습니다. 키 확인 절차는 유도된 키로 만든 인증값을 교환해 상대가 동일한 비밀을 보유했음을 검증합니다. 이는 상대 신원 인증과 관련되지만 완전히 같은 개념은 아닙니다. 표준화된 프로토콜은 신원, 세션 문맥, 공개값을 인증 계산에 포함해 이전 세션의 메시지를 재사용하는 공격과 서로 다른 연결의 키가 뒤섞이는 문제를 막습니다.