Worth spreading

[암호학] Key 관리 및 분배 본문

Computer science/Cryptography

[암호학] Key 관리 및 분배

annual 2018. 12. 25. 12:55

Medium에 게시한 글입니다. Medium에서 읽으시면 좀 더 좋은 환경에서 보실 수 있습니다.


[암호학] Key 관리 및 분배

(여담: 이것도 블록체인으로 하면 좋겠다)

“어떻게 키를 분배할 것인가?”

암호학에서 ‘키분배’는 매우 중요한 사안이다. Key는 말 그대로 Key다. 우리집 Key를 잃어버리면 우리집이 위험해지는 것처럼 비밀키나 대칭키의 Key도 잘못 다룰 경우 자신의 정보/자산이 위험해질 수 있다.😱

또한 대칭키는 상대방과 같은 Key 값을 갖고 있다는 것을 신뢰할 수 있어야 하는데 이 신뢰를 쌓는 것 또한 쉽지 않다.

그래서 여러 똑똑한 분들이 Key 관리&분배에 관한 이론들을 연구하고 널리 퍼뜨려 주셨다.

공개키 분배법부터 알아보장

대표적인 공개키 분배법 4가지

1. Public announcement (샤우팅)🗣

  • 개인이 자신의 public key를 그냥 주변 사람들에게 broadcasting하는 것이다.
  • 이 방법의 문제는 해커가 사용자의 이메일, 핸드폰 등을 해킹하는 경우다. 해커가 피해자의 계정으로 해커의 공개키를 뿌리면 피해자의 지인들은 피해자에게 보낼 돈/정보 등을 해커에게 보내게 될 수 있다.

2. Public Available Directory📝

  • DB에 업로드하는 방법이다.
  • 정부/회사같은 기관이 고객들의 {유저 이름, public key} 쌍을 저장하고 관리한다.
  • DB의 값은 변경될 수 있으므로 고객들의 원하면 이를 바꾸고 제거할 수 있다.
  • 이 방법은 public announcement보다는 낫지만 여전히 문제를 갖고 있다.
  • Single point Failure, 즉 DB가 털리면 모두 끝이다.

3. Public-key Authority🏛

DB에 업로드 하는 것과 유사한 방법이지만 조금 더 정교한 매커니즘이다.


  • 1) A가 Public key authority에게 b의 public key를 요구한다!
  • 2) Authority는 A의 신원을 확인하고 이를 보내준다.(이 때 authority는 자신의 전자서명을 붙여서 보낸다. 자기가 authority임을 인증!)
  • 3) A가 B에게 자기랑 통신하자고 메세지를 보낸다.이 때, Nonce값(랜덤한 값)을 덧붙여서 추후 B를 인증하는 용도로 사용한다.
  • 4) B가 authority에게 A의 pub-key를 요구한다
  • 5) authority가 B에게 A의 pub-key를 보내준다.(역시 authority의 전자서명 덧붙임)

  • 6) B가 A에게 통신을 하자는 뜻의 답을 보낸다. 이 때 B는 아까 받았던 A의 Nonce값과 자신이 생성한 Nonce값을 붙여서 메세지를 보낸다.

아까 1,2 번 방법들에 비해 훨씬 진보됐다. 하지만 여전히 문제가 존재한다.

  • 키를 교환하기 위해 메세지가 7번이나 왔다갔다 해야한다. 물론 서로가 이전에 통신했던 적이 있어서 서로의 키를 알고 있다면 처음의 4단계는 스킵할 수 있다.
  • Authority에게 의존적이다. 이녀석이 bottle-neck 이 될 수 있다. 모든 유저가 authority와 통신하기 원할 때 이녀석은 폭발해 버릴 수 있다.
  • 2번과 마찬가지로 Single point failure 문제를 갖고있다.

그럼 도대체 뭘 어떻게 더 개선해야 한단 말인가!

짠~~

4. Public-key certificates📑🔐

한국말로 하면 인증서. 그렇다. 우리를 괴롭히는 그 공인인증서다. 하지만 이것도 나왔을 당시 획기적인 것이라 칭송되어 쓰기 시작해 우리나라가 여전히 사용하고 있는 것이다.

인증서 기법은 CA(Certificate Authority) 라 불리는 authority에 의해 관리되지만 authority 를 거칠 필요 없이 당사자들끼리 키 교환을 안전하게 할 수 있는 기법이다.

인증서는 다음과 같은 항목들로 구성되어 있다.

  1. public key
  2. 인증서 주인
  3. CA의 서명
  4. 생성시간, 만료일 등등

인증서 만들기

우선 각 유저는 각자의 public key를 CA에게 안전한 방법을 통해 보낸다. 그걸 받은 CA는 자신(CA)의 비밀키를 이용해 유저들의 인증서를 만들어준다.(착하네)

인증서를 이용한 Key 교환

이번에도 A와 B가 키를 교환하고자 한다. A와 B는 서로의 인증서를 교환한다. 상대방의 인증서를 받은 후 CA의 공개키를 이용해 상대방의 인증서가 유효한지를 검증한다. 이러면 끝이다.

내가 지금까지 배운 방법들 중에서는 이게 최고의 키교환 방법이다. 하지만… 대칭키를 쓴다 하면 다른 방법이 또 있다!

Secret-Key Distribution

대칭키 기법도 양자간의 키 교환이 필요하다. 근데 이 키교환을 위해 공개키 기법이 사용될 수 있다.

Simple Secret key Distribution

이번에도 A가 B랑 대화하고 싶어한다.🤙

  1. A가 자신의 public/private key를 생성한다.
  2. A가 B에게 자신의 public key와 자신의 신원을 나타낼 수 있는 값을 보낸다.
  3. B는 그 메세지를 보고 발신자가 A임을 확인하고 함께 사용할 비밀키 K를 생성한다.
  4. B는 비밀키 K를 A의 공개키로 암호화해 A에게 보낸다.
  5. A는 자신의 비밀키로 B가 보낸 메세지를 해독해서 K를 알아낸다.
  6. 이제 A, B는 얘기하고 싶을 때마다 K로 암호화한 메세지를 보낸다👨‍❤️‍💋‍👨

깔끔해보이지? 근데 이건 취약해…

Man in the middle attack

Man in the middle attack이라고 불리는 공격이며 이런 모양을 가지고 있다

공격자 E가 중간에서 통신을 가로채는 것! A에게는 B인 것처럼, B에게는 A인 것처럼 행동한다.

그렇기 때문에 이 결점을 보강하기 위해 통신시 서로를 확인하는 과정을 추가해야 한다.

위에 써있듯이 (1)~(3)과정은 서로를 확인하는 과정이다.

(1) A가 자신의 ID와 임의로 생성한 Nonce를 B의 비밀키로 encrpyt해서 B에게 전송한다

(2) B가 메세지를 복호화 해서 Nonce를 알아내고 거기에 자신이 생성한 Nonce를 덧붙여서 A의 비밀키로 암호화해 A에게 전송한다

(3) A는 이를 자신의 비밀키로 복호화해서 B에게 보낸다. 이 과정에서 A는 B를 신뢰할 수 있게된다.

(4) B가 이 메세지를 보고 A가 맞음을 확인한다. 👨‍❤️‍💋‍👨

참고로 여기서 (1)~(3) 과정은 공개키 교환 방법에서 마지막 세 과정과 같다. 이 방법으로 confidentiality, authentication 모두 얻을 수 있다~


이정도면 키분배 알고리즘의 기본을 알았다고 할 수 있다. X.509라고 하는 공개키 분배 표준이 있는데 이건 직접 찾아보자!

안녕👋


Comments