본문 바로가기
INFORMATION SECURITY · FREE LEARNING정보보안 학습센터원리 → MASTER → 해설학습 → CBT → 오답 복습

공개된 길에서 같은 비밀을 만든다

정보보안의 원리 · 방향 4

© K-BOOKS · 무료 웹 열람용 콘텐츠입니다. 무단 복제·저장·인쇄·재배포를 제한합니다.

네 번째 발걸음공개된 길에서 같은 비밀을 만든다

대칭키 암호는 효율적이지만 만나 본 적 없는 서버와는 어떻게 같은 키를 나눌까요? 키 자체를 평문으로 보내면 도청자도 같은 비밀을 얻습니다. 디피–헬먼, DH 키 합의는 각자가 비밀을 따로 고르고 일부 계산 결과만 공개해 같은 값을 만드는 방법입니다. 여기서 중요한 점은 파일을 암호화하는 일이 아니라 이후 사용할 비밀을 합의한다는 것입니다. 합의한 값과 실제 데이터 암호화 키도 바로 같은 것으로 취급하지 않습니다.

Diffie–Hellman 키 합의의 관계를 계산으로 확인합니다. 이 값들은 실제 보호에 사용할 크기가 아닙니다. 상대 인증이 없으면 중간자가 각 참여자와 서로 다른 비밀을 만들 수 있어, 협상 기록과 신원을 묶는 인증이 필요합니다.
그림 4–2 Diffie–Hellman 키 합의의 관계를 계산으로 확인합니다. 이 값들은 실제 보호에 사용할 크기가 아닙니다. 상대 인증이 없으면 중간자가 각 참여자와 서로 다른 비밀을 만들 수 있어, 협상 기록과 신원을 묶는 인증이 필요합니다.

먼저 나머지 연산을 익혀 보겠습니다. 26을 23으로 나누면 나머지가 3이므로 26 mod 23 = 3이라고 씁니다. 거듭제곱을 한 뒤 나머지를 구하는 연산은 큰 수를 제한된 범위의 값으로 바꿉니다. DH에서 공개할 밑 g와 소수 p를 고르고, 비밀 지수 a에 대해 gᵃ mod p를 계산하는 것은 효율적입니다. 반대로 적절히 큰 안전한 집단에서 공개 결과를 보고 a를 알아내는 이산대수 문제는 어렵다고 가정합니다. 작은 수에서는 금방 찾을 수 있으므로 아래 수치는 안전성과 무관한 교육용입니다.

함께 따라가기 · 23을 기준으로 같은 값 2에 도착하기

공개값은 p=23, g=5입니다. 당신은 비밀 a=6을, 친구는 비밀 b=15를 고릅니다. 실제 시스템에 이 수를 사용해서는 안 됩니다.

  1. 당신의 공개값 A는 56 mod 23입니다. 52 mod 23 = 2, 54 mod 23 = 4이므로 56 mod 23 = 4×2 mod 23 = 8입니다. 당신은 8을 보냅니다.

  2. 친구의 공개값 B는 515 mod 23입니다. 58 mod 23 = 16을 이용하면 515 = 58×54×52×5이고, 나머지를 이어 계산한 결과는 19입니다. 친구는 19를 보냅니다.

  3. 당신은 받은 19를 자신의 비밀 6으로 거듭제곱합니다. 192 mod 23 = 16, 194 mod 23 = 3이므로 196 mod 23 = 3×16 mod 23 = 2입니다.

  4. 친구는 받은 8을 자신의 비밀 15로 거듭제곱합니다. 82 mod 23 = 18, 84 mod 23 = 2, 88 mod 23 = 4입니다. 따라서 815 mod 23 = 4×2×18×8 mod 23 = 2입니다.

  5. 두 결과가 같은 이유는 (gᵇ)ᵃ와 (gᵃ)ᵇ가 모두 gᵃᵇ이기 때문입니다. 도청자는 23, 5, 8, 19를 볼 수 있지만 비밀 지수 자체는 전송되지 않았습니다. 다만 이 예에서는 후보를 몇 개 대입하면 지수를 찾을 수 있습니다.

깨달음키 합의는 비밀을 전송하는 대신 공개 계산 결과로 같은 비밀에 도달합니다. 실제 안전성은 큰 수의 크기뿐 아니라 집단 선택과 공개값 검증에도 달려 있습니다.

# 표준 라이브러리만 사용한 교육용 계산 확인
p, g = 23, 5
a, b = 6, 15
A, B = pow(g, a, p), pow(g, b, p)
left, right = pow(B, a, p), pow(A, b, p)
print(A, B)          # 8 19
print(left, right)  # 2 2

pow(밑, 지수, 나누는 수)는 거듭제곱의 나머지를 직접 계산합니다. 실무 DH 구현이나 안전한 매개변수 생성 코드가 아닙니다.

DH만으로 상대의 이름까지 확인되지는 않습니다. 중간자가 당신에게는 자신이 만든 공개값을, 친구에게는 또 다른 공개값을 보내면 당신–중간자 사이와 중간자–친구 사이에 서로 다른 비밀이 생길 수 있습니다. 두 사람은 비밀을 만들었다는 사실만 확인하고 누구와 만들었는지를 놓친 것입니다. 공개값과 협상 내용을 서명이나 미리 공유한 비밀로 인증해 세션에 묶어야 합니다. TLS에서 인증서와 서명이 키 합의 옆에 등장하는 이유가 여기 있습니다.

합의 결과는 키 유도 함수, KDF에 넣어 필요한 길이의 키 재료로 바꿉니다. HKDF는 추출과 확장 단계를 통해 입력 비밀에서 용도별 키를 만듭니다. 송신용과 수신용, 암호화용과 다른 인증용을 문맥 정보로 구분하면 같은 원재료를 무분별하게 여러 연산에 재사용하지 않을 수 있습니다. 함수에 공개된 salt나 문맥을 넣는다고 없는 비밀이 생기는 것은 아닙니다. 출발점인 공유 비밀과 난수의 품질이 먼저입니다.

타원곡선 디피–헬먼, ECDH는 다른 수학적 집단에서 같은 목적을 수행합니다. 비밀 정수로 공개 기준점을 반복 결합해 공개점을 만들고, 상대 공개점에 자신의 비밀을 적용해 공유 결과를 얻습니다. 타원곡선의 점 연산을 종이에 상세히 전개하지 않더라도 “공개점에서 비밀 정수를 되찾기 어렵다”는 타원곡선 이산대수 문제와 키 합의의 역할은 구분해야 합니다. 임시 키를 연결마다 새로 만들고 안전하게 폐기하는 ECDHE의 의미도 나중에 TLS의 순방향 비밀성으로 이어집니다.

참고 [132] · [133]

이 브라우저에 학습 기록을 저장합니다.