키 교환은 클라이언트와 서버 사이에 키를 교환하는 것이다.

키 교환에는 다음과 같은 방법이 있다.

  1. 클라이언트가 생성한 개인키를 서버 인증서의 공개키로 암호화하여 보내는 방법
  2. 키 교환 전용 알고리즘을 사용하는 방법

이중 (2)번의 가장 대표적인 알고리즘으로 디피-헬만(Diffie-Hellman; DH) 키 교환 알고리즘이 있다.

디피-헬만 알고리즘 과정

디피-헬만 알고리즘의 핵심은 키 자체를 교환하는 것이 아니라, 클라이언트와 서버가 '키 재료'를 만들어서 서로 교환하고 그 교환된 내용을 각자 계산하여 동일한 키를 생성해내는 것이다.

  1. 서버가 계산에 사용할 값 pg를 선정한다. (p는 큰 소수로 선택하고, g는 p에 대한 원시근이다.) (p와 g는 공개되어도 문제없다)
  2. 그리고 서버는 또 다른 값 Y를 선정한다. 이 값은 비밀이다. 이 비밀값을 교환하기 위한 Ys를 다음 수식으로 계산한다. → Ys = (g^Y) mod p
  3. 서버는 (1)에서 선정한 p, q 와 (2)에서 계산한 Ys 를 Server Key Exchange (서버키 교환) 메시지에 담아서 클라이언트에게 보낸다.
  4. 클라이언트도 랜덤한 값 X를 선정하고 (2)번과 동일한 방법으로 Xs 를 계산한다.
  5. 클라이언트는 (4)번에서 계산한 값 Xs 를 Client Key Exchange (클라이언트 키 교환) 메시지에 담아서 서버에게 보낸다.
  6. 서버는 (2)에서 선정한 Y 값과 (5)에서 클라이언트가 보내준 Xs 를 이용하여 공통키 시드(ZZ)를 생성한다. ZZ = Xs ^ Y mod p
  7. 클라이언트도 (4)에서 선정한 X 값과 (3)에서 서버가 보내준 Ys 를 이용하여 공통키 시드(ZZ)를 생성한다. ZZ = Ys ^ X mod p
  8. 서버가 (6)에서 계산한 시드(ZZ)와 클라이언트가 (7)에서 계산한 시드(ZZ)는 동일한 값이다. 수학적 규칙에 의해 동일한 값이다. 시드 계산 수식에 사용되는 X, Y는 본인들만 알고있는 값이므로, p, g, Xs, Ys는 공개되더라도 시드값을 쉽게 계산하기란 어렵다.
  9. (8)에서 계산된 시드는 나눗셈의 나머지 연산이므로 상위 비트에 0이 연속해서 치우침이 발생하는 경우가 많으므로 해시함수를 통하여 최종적으로 사용할 값 K 를 생성한다.
  10. 서버와 클라이언트는 계산된 K 값을 통신 암호화의 키로 사용한다.

<aside> 💡 원시근이란? 다음 조건을 만족하는 수 g^1, g^2, ..., g^(p-2) 의 어느 값도 q로 나눈 나머지가 1이 아닌 수

</aside>

p의 값의 길이에 따라 키의 강도가 달라진다. 1024비트, 2048비트와 같이 길이가 긴 값을 사용함으로써 암호화키를 쉽게 계산할 수 없도록 한다