온라인으로 파일이나 메세지를 보낼 때, 요즘에 나오는 대부분의 어플리케이션은 그 내용을 암호화해서 전송하는 방법을 쓴다. 중간에 누군가가 해당 내용을 가로채도, 무슨 뜻인지 알 수 없게 만들기 위함이다. 사용자의 개인정보 보안을 위해서 암호화는 필수인데, 그 중 가장 보편적으로 쓰이는 방법인 Public/Private Key Pair에 대해 알아본다.


#Public/Private Key란?

Public Key와 Private Key는 말 그대로 암호화와 해독을 할 수 있는 열쇠(Key)다. 일반적으로 하나의 공개된 (Public) 열쇠와 하나의 사적인 (Private) 열쇠의 **쌍(Pair)**으로 구성된다.

이 암호화 기술에서는 우선 어플리케이션을 사용하는 모든 이용자들이 하나의 공개된 열쇠와 하나의 사적인 열쇠의 세트를 부여 받는다. 같은 세트를 부여 받는 경우는 없다.

공개된 열쇠는 말그대로 다른 이용자들에게 공개되어있는 열쇠고, 사적인 열쇠는 이용자 본인만이 알고 있는 열쇠다.

메세지를 암호화 했을 때, 해당 메세지가 공개된 열쇠로 암호화 되었다면, 그 암호를 해독할 수 있는 건 암호화를 한 공개된 열쇠와 쌍을 이루는 사적인 열쇠 뿐이다.

반대로 해당 메세지가 사적인 열쇠로 암호화 되었다면, 그 암호를 해독할 수 있는 건 암호화를 한 사적인 열쇠와 쌍을 이루는 공개된 열쇠 뿐이다.

이러한 조합의 한쌍의 열쇠들을 특정 알고리듬을 이용하여 생성할 수 있는데, 가장 보편적으로 사용되는게 RSA방식이고, RSA도 여러가지 타입이 있다는 것만 알고 있으면 된다.

#사용법 예제

철수의 암호화 열쇠

  • Public Key: AAA
  • Private Key: BBB

영희의 암호화 열쇠

  • Public Key: CCC
  • Private Key: DDD

상대방에게 메세지를 암호화해서 전달하고 싶은 경우

철수가 영희에게 "안녕하세요" 라는 메세지를 암호화해서 보내려면 다음과 같이 하면 된다.

  1. 영희의 공개된 열쇠인 "CCC"를 이용하여 "안녕하세요" 라는 메세지를 암호화 한다. 암호화 했더니 "쀌뛜땔뛰뚜" 라는 메세지로 변환되었다.
  2. 암호화 된 메세지를 영희에게 전송한다.
  3. 영희는 자신만이 알고 있는 사적 열쇠인 "DDD"를 이용하여 메세지를 해독한다. "안녕하세요" 라는 내용이 나타나는 것을 확인 할 수 있었다.

이렇듯 상대방만이 알 수 있는 메세지를 전송하고 싶으면, 상대방의 공개 열쇠를 이용하여 메세지를 암호화 한 후 전송하면, 그 상대방만이 메세지를 해독할 수 있다. 2번 과정에서 훈이가 메세지를 가로채도 "쀌뛜땔뛰뚜" 라는 메세지를 해독하는 것은 불가능하다.

나 자신을 증명하고 싶은 경우 (디지털 서명)

철수가 여러 사람들에게 "저는 철수입니다. 100원씩만 보내주세요 -철수가" 라는 메세지를 보낸다고 가정해보자. 이대로 메세지를 받는 사람들은 정말로 철수가 보낸 메세지인지 아니면 누군가가 철수를 가장해서 보낸 메세지인지 확인할 방법이 없다.

이런 경우, 철수는 자신의 사적 키를 이용하여 메세지 마지막의 "-철수가" 라는 부분을 암호화한다. 암호화된 부분은 "!@#$%%" 라고 되었다고 가정하자. 이 부분이 철수의 디지털 서명이 되는 것이다.

메세지를 받은 모든 사람들은 마지막의 암호화 된 철수의 디지털 서명 부분에 주목한다. 철수의 공개 열쇠를 이용해서 해독을 시도해봤더니 "-철수가" 라는 메세지가 나타났다. 이것으로 사람들은 이 메세지가 철수가 보낸 것이라고 확신할 수 있다.

#공개 키로 사적 키를 유추할 수는 없는가?

공개 키와 사적 키는 하나의 쌍으로 이루어져 있고, 이 조합은 특정 알고리듬을 이용하여 생성된다. 그렇다면 자연스럽게 공개 키를 이용하여 사적 키를 유추할 수 있는 것이 아닌가 라는 의문이 들게 된다.

결론부터 말하자면 "불가능한 것은 아니나 매우 어렵다" 라고 말할 수 있다.

그 이유를 예를 들어 설명하면 다음과 같다.

61 곱하기 53은?

이에 대한 답은 누구나 구하기가 쉽다. 3233 이다.

하지만 다음 문제는 어떨까?

곱한 값이 3233이 되는 두 소수를 구하시오

정답을 알아내는 것은 쉽지가 않다.

이 예제에 대입하면 61과 53은 사적 키가 되는 것이고, 3233은 공개 키가 되는 것이다. 사적 키를 이용하여 공개 키를 구하는 것은 쉽지만, 반대로 공개 키를 이용하여 사적 키를 구하는 것은 쉽지 않다. 예제에서는 쉬운 이해를 위해 작은 숫자를 썼지만, 만약 이게 좀 더 큰 숫자와 다른 문자의 배열까지 섞인다면, 난이도는 비약적으로 높아지게 된다.

실제로 공개 키와 사적 키는 아래와 같이 생겼다.

공개 키

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0
FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/
3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB

사적 키

MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp
wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5
1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh
3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2
pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX
GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il
AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF
L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k
X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl
U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ
37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=

이러한 이유로 기본적으로 이용자의 사적 키가 유출이 되지 않는 이상은, 암호화가 안전하게 진행된다고 할 수 있다. 물론 사적 키가 해킹등에 의해 유출이 되어버리면 더 이상 안전하다고 할 수 없기 때문에, 사적 키의 보관에는 특별히 신경을 써야한다.