디피헬만(D-H) 키교환 알고리즘

데이터 암복호화를 위한 키를 송/수신자가 안전하게 교환하기 위한 알고리즘으로, 일련의 과정을 통해 송/수신자가 동일한 키(대칭키)를 가지게 된다.

기본 원리

통신 주체
앨리스, 밥

재료

  • 공용값(시작값): g
  • 앨리스의 비밀값: a
  • 밥의 비밀값: b

절차

  1. 공용값 g를 사전에 앨리스와 밥이 공유한다. (노출 또는 탈취되어도 무관)

  2. 앨리스는 자신의 비밀값 a를 공용값 g와 섞어 (g+a)를 만들고, 이를 밥에게 전송한다. (노출 또는 탈취되어도 무관)

  3. 밥도 마찬가지로 (g+b)를 앨리스에게 전송한다. (노출 또는 탈취되어도 무관)

  4. 앨리스는 밥에게 받은 (g+b)에 자신의 비밀값 a를 섞어 (g+a+b)를 만든다.

  5. 밥도 마찬가지로 (g+a+b)를 만든다.

  6. 앨리스와 밥 모두 동일한 (g+a+b)라는 값을 가지며, 이 과정에서 서로의 비밀값은 주고받지 않았으므로 (g+a+b)라는 값은 앨리스와 밥만 알게 된다.

  7. 이 (g+a+b)값을 재료로 대칭키를 만들고, 데이터 암복호화에 사용한다.

수학적 수식

모듈러 연산(= 나머지 연산)이 핵심적으로 사용된다.

  1. 소수 p와 시작값 g를 정한다.

    이 때 g를 정하기 위해 위수, 원시원소(위수근)에 대한 내용이 나오지만 더 깊이 알아보지 않기로함.
    마찬가지로, 왜 p가 소수여야 하는지도 알아보지 않기로함.

  1. 앨리스가 밥에게 건낼 (g+a)의 실제 값 = g^a mod p, (g+b)의 실제 값 = g^b mod p.
    즉, 시작값을 a제곱 혹은 b제곱한 값을 p로 나눈 나머지.
    앨리스가 건낸 값을 A,
    밥이 건낸 값을 B라고 가정하고 아래 과정 진행.
  1. 앨리스가 만드는 최종값 (g+a+b)의 실제 값 = B^a mod p, 밥이 만드는 최종값 = A^b mod p
    이 때 B^a mod pA^b mod p는 같은 값이 된다.

A^b mod p = (g^a mod p)^b mod p = g^ab mod p가 되는데, 이 과정에서 (g^a mod p)^bg^ab로 정리되는데 그게 모듈러 연산의 성질이라고 한다.

B^a mod p에서도 결국 g^ba mod p로 수식이 정리되고, 지수는 순서가 상관없으므로 g^ab == g^ba가 된다.

이렇게 앨리스와 밥 모두 g^ab mod p라는 동일한 값을 얻게 되고, 일련의 과정에서 서로의 비밀값 a, b는 외부로 노출되지 않는다.

이렇게 얻은 값은 SHA256 알고리즘으로 해싱하고, 해시값을 데이터 암복호화(AES) 시 키로서 사용하게 된다.