키 교환은 클라이언트와 서버 사이에 키를 교환하는 것이다.
키 교환에는 다음과 같은 방법이 있다.
이중 (2)번의 가장 대표적인 알고리즘으로 디피-헬만(Diffie-Hellman; DH) 키 교환 알고리즘이 있다.
디피-헬만 알고리즘의 핵심은 키 자체를 교환하는 것이 아니라, 클라이언트와 서버가 '키 재료'를 만들어서 서로 교환하고 그 교환된 내용을 각자 계산하여 동일한 키를 생성해내는 것이다.
p와 g를 선정한다.
(p는 큰 소수로 선택하고, g는 p에 대한 원시근이다.)
(p와 g는 공개되어도 문제없다)Y를 선정한다. 이 값은 비밀이다.
이 비밀값을 교환하기 위한 Ys를 다음 수식으로 계산한다.
→ Ys = (g^Y) mod pp, q 와 (2)에서 계산한 Ys 를 Server Key Exchange (서버키 교환) 메시지에 담아서 클라이언트에게 보낸다.X를 선정하고 (2)번과 동일한 방법으로 Xs 를 계산한다.Xs 를 Client Key Exchange (클라이언트 키 교환) 메시지에 담아서 서버에게 보낸다.Y 값과 (5)에서 클라이언트가 보내준 Xs 를 이용하여 공통키 시드(ZZ)를 생성한다.
ZZ = Xs ^ Y mod pX 값과 (3)에서 서버가 보내준 Ys 를 이용하여 공통키 시드(ZZ)를 생성한다.
ZZ = Ys ^ X mod pZZ)와 클라이언트가 (7)에서 계산한 시드(ZZ)는 동일한 값이다.
수학적 규칙에 의해 동일한 값이다. 시드 계산 수식에 사용되는 X, Y는 본인들만 알고있는 값이므로, p, g, Xs, Ys는 공개되더라도 시드값을 쉽게 계산하기란 어렵다.K 를 생성한다.K 값을 통신 암호화의 키로 사용한다.<aside>
💡 원시근이란? 다음 조건을 만족하는 수
g^1, g^2, ..., g^(p-2) 의 어느 값도 q로 나눈 나머지가 1이 아닌 수
</aside>
p의 값의 길이에 따라 키의 강도가 달라진다. 1024비트, 2048비트와 같이 길이가 긴 값을 사용함으로써 암호화키를 쉽게 계산할 수 없도록 한다