디피-헬먼 키 교환(Diffie–Hellman key exchange)은 암호 키를 교환하는 하나의 방법으로, 두 사람이 암호화되지 않은 통신망을 통해 공통의 비밀 키를 공유할 수 있도록 한다.

앨리스와 밥(암호학이나 물리학에서 자주 사용되는 가상의 이름)이 공개된 통신망에서 디피-헬먼 키 교환을 하기 위해서는 다음과 같은 절차를 거친다.

img/network-231130-03.png
(from wiki)

안정성

p: 300자리 소수
g: 순환군 G의 차수가 소수이거나, 인수분해하기 어려운 큰 소수를 약수로 가져야한다.

p와 (p-1)/2 가 모두 소수인 안전소수를 고르기도한다. p가 안전소수이면 G의 차수는 2또는 (p-1)/2 만을 약수로 가진다.

디피-헬먼 키 교환은 통신을 하는 대상과 비밀 정보를 공유할 수 있지만, 상대방에 대한 인증은 보장되지 않으며 중간자 공격이 가능하다. 앨리스와 밥이 상대방에 대한 인증을 하지 못할 경우, 공격자는 중간에서 통신을 가로채 앨리스와 공격자, 그리고 공격자와 밥 사이에 각각 두 개의 디피 헬먼 키 교환을 생성하고, 앨리스와 밥이 각각 서로와 통신을 하는 것처럼 위장할 수 있다. 이와 같은 종류의 중간자 공격을 막기 위한 여러 가지 다른 알고리즘이 개발되어 있다.

SSH에서 사용될 때

a와 b를 각각 private key라고 부르고 p, g, A, B는 공개 값, 공개 파라미터 등으로 부른다. 6번의 계산을 통해 s를 구하는데, 이 s를 공동의 비밀 키, 세션 키, 대칭 키 등으로 부른다.

여기서 사용하는 a, b, s는 모두 큰 정수인데, 어떻게 암호화/복호화에 사용할까?

공동 비밀 키(s), 즉 Diffie-Hellman 키 교환에서 계산된 정수형 키를 사용하여 세션 데이터를 암호화하기 위해서는, 이 키를 대칭 키 암호화에 적합한 형태로 변환해야 합니다. 일반적으로 이 과정은 다음과 같은 단계를 포함한다.:

  1. 키 유도 (Key Derivation):
    • Diffie-Hellman에서 얻은 공동 비밀 키 (s)는 일반적으로 크고 임의의 정수이다. 이를 그대로 사용하는 것이 아니라, 이 키에서 고정된 크기의 암호화 키를 유도하기 위해 키 유도 함수(Key Derivation Function, KDF)를 사용한다.
    • 키 유도 함수는 원래의 키 (s)를 입력으로 받아, 암호화 알고리즘에 적합한 길이와 구조를 가진 키를 생성gks다. 이 과정은 종종 해시 함수를 사용하여 수행된다.
  2. 대칭 키 암호화 알고리즘 선택:
    • 유도된 키는 대칭 키 암호화 알고리즘(예: AES, DES, ChaCha20 등)에 사용된다. 선택한 암호화 알고리즘은 키의 크기에 따라 달라질 수 있다.
  3. 암호화 및 복호화:
    • 암호화: 전송할 데이터는 유도된 키를 사용하여 암호화된다. 데이터는 암호화 알고리즘에 따라 블록이나 스트림으로 처리될 수 있다.
    • 복호화: 받은 암호화된 데이터는 같은 키를 사용하여 복호화된다. 이 때, 암호화와 동일한 알고리즘을 사용해야 한다.

이 과정을 통해, Diffie-Hellman 알고리즘을 통해 얻은 원래의 공동 비밀 키는 실제 암호화 통신에 사용될 수 있는 형태로 변환된다. 이렇게 하면, 두 통신 참여자만이 암호화된 데이터를 해독할 수 있는 고유한 키를 공유하게 된다. 이는 데이터의 기밀성을 유지하는 데 매우 중요하다.

References

https://ko.wikipedia.org/wiki/%EB%94%94%ED%94%BC-%ED%97%AC%EB%A8%BC_%ED%82%A4_%EA%B5%90%ED%99%98