본문 바로가기

카테고리 없음

조금 어정쩡 하지만 어정쩡하게 좋은 암호화 방식 PGP

출처 : http://www.gamedevforever.com/141

이번엔 조금 더 프랙티컬 한 주제를 다루어 보도록 하겠다. 지인들 중 적지않은 수가 잘못 알고있는 사실중 하나인 '인증서를 사용하는 것이 가장 안전한 암호화 방법이다'가 잘못 되었다는 것에 대해 이야기해 보고자 한다. 일반적으로 블럭 암호와 공개키 방식 암호로 이야기 되어지는 - 대칭 암호(Symmetric Cryptography)와 비대칭 암호(Asymmetric Cryptography)의 용도가 다르다는 것을 설명하는 것을 통해 각 방식이 사용되기에 적합한 상황에 대한 이해를 돕고자 한다.

  1. 스파이가 목숨을 걸고 운반하는 가방엔 뭐가 들었을까?

    드라마나 영화에 가끔 등장하는 
    이 아자씨가 목숨 걸고 운반하는 저 가방에는 뭐가 들었을까낭?

    스파이 영화를 보면 꽤 자주 나오는 것 중의 하나가 목숨을 걸고 배달 해야하는 골치 덩어리 가방이 하나 있다. 배달을 맡은 스파이는 가방과 자신의 손목을 수갑으로 연결해서 개고생을 하며 가방을 운반한다. 그런데, 자세히 보면 가방이 그닥 무겁지는 않은 것 같다. 대체 그 가방안에는 무엇이 들어있을까? 비밀 정보가 들어있을까? 그럴리는 없다. 무언가 비밀을 전달해야 할 일이 있을 때마다 스파이를 보낸다는 것은 발각의 위험도 높거니와 적에게 빼앗기면 그야말로 재미없는 일이다. 

    비밀 정보를 안전하게 보내는 방법중 하나는 비밀정보를 암호화 한 다음에 암호화 된 정보와 암호를 푸는데 사용되는 정보를 따로 보내는 것 이다. 적에게 둘 다 빼앗기지 않는 한 문제가 발생하지 않는다. 위험성이 절반이 되는 것 이다. 게다가 암호화된 정보를 빼앗겼다면 암호를 푸는데 사용되는 정보를 보내지 않으면 된다. 암호화된 정보가 제대로 전달 되었다면 그때 암호를 푸는 정보를 보내면 된다.

    그러나 위의 방법역시 매번 스파이가 직접 가야 하기 때문에 인적 희생이 발생할 확률이 아주 높아진다. 보내야할 정보가 있을 때 마다 적진에 스파이를 두 명이나 매번 침투 시킨다는 것은 정말 힘들고 위험성도 많은 일이다. 둘 중 하나가 잡히면 다른 하나도 잡히게 될 가능성이 압도적으로 높아져 버린다.

    그러면 어떻게 해야 안전하게 정보를 전달 할 수 있을까요? 뿌잉뿌잉~~ 무선 통신을 이용해 데이터를 전달할 수 있게된지는 무지하게 오래 되었기 때문에 데이터를 무선으로 전달하는 것 자체는 어렵지 않~아요~ 전파를 이용한 무선통신은 1880년대에 발명 되었으며, 우리가 매일매일 사용하는 CDMA 방식은 1930년대에 개발된 것 이거든요. 그러니까 정보는 무선통신으로 날릴수 있어요~ 영화에 나오는 스파이 아저씨 들이 활동하던 2차대전 당시에는 무선으로 통신하는게 드믄일은 아니었답니다. 그러니, 암호문을 푸는 정보만 스파이 아저씨가 배달하면 돼요. 결국, 스파이가 목숨을 걸고 운반하던 그 가방 안에는 디코딩을 위한 코드 - 즉 복호화 키가들어 있었을 것 이예요.

    암호화된 통신을 하기 위해서 가장 먼저 해야하는 일은 공격자들이 키를 주고 받는 것이다. 안전하게 키를 주고 받는다는 것은 굉장히 어려운 일이고 많은 수학자들이 쉽고 안전하게 키를 주고 받기 위한 노력을 해왔고, 하고 있으며, 할 것 이다.


  2. 키를 전달하기 좋은 공개키 방식의 암호

    그러면 스파이의 목숨을 걸지 않고도 안전하고 쉽게 비밀 키를 상대방에게 넘겨주는 방식이 무엇이 있을까? 라는 고민을 수많은 수학자들이 고민을 때리기 시작했다. 물론, 이러한 암호화 방식에 가장 관심이 많았던건 정부기관이었다. 비싸게 기른 스파이가 암호화 키를 넘겨주려다가 붙잡히거나 저승으로 초 장기 출장을 가버리는 일은 정부기관 입장에선 그다지 선호할 만한 일이 아니었기 때문이다. 

    그렇게 수많은 수학자들이 뇌세포를 작살내며 고민을 하다가 고안해낸 방식이 비대칭키 암호화 - 공개키 암호화 방식이다. 그 전까지는 암호화 할 때 사용하는 키와 암호를 다시 원 상태로 만드는 일을 할 때 - 즉, 복호화 할 때 사용하는 키가 같은 키였다. 그렇기 때문에 키를 전달하다가 빼앗기면 그것으로 끝이었다. 그에 반해서 비 대칭키 방식의 암호는 암호화 할 때의 키와 복호화 할 때의 키가 다르다.

    일반적으로 비 대칭키 방식의 암호는 한 쌍의 키로 구성이 되어있다. 한 쌍의 키를 A와 B라고 하면, 보통 A로 암호화 한 암호문은 B로 복호화 되고, B로 암호화 된 암호문은 A로 복호화 된다. 그리고, 키 A를 이용해서는 B를 알아내기가 아주 어렵고, 마찬가지로 키 B를 이용해서 키 A를 알아내는 것 역시 아주 어렵다. 일반적으로 두 키중 하나는 공개를 하고 다른 하나는 비밀로 보관을 하며, 공개를 하는 키를 '공개키 - Public Key', 비밀로 보관하는 키를 '개인키 - Private Key'라 부른다.

    공개키로 암호화 하면 개인키로만 복호화 할 수 있습니다.
    반대로, 개인키로 암호화 하면 공개키로만 복호화 할 수 있습니다.


    그렇기 때문에 공개키 방식의 암호를 사용하면 스파이는 몸만 침투하면 된다. 그 다음에 무선이던 무선이던 상관 없이 비대칭키 방식의 키중 하나 - 보통 누구든지 원하면 얻을 수 있다는 의미로 '공개키 - public key'라 부르는 키를 얻은 다음에, 원하는 정보를 암호화 해서 보내주면 된다. 위에서 언급 했듯이 비대칭 암호는 키 한쪽을 가지고 다른 키를 알아내는 게 아주 어렵기 때문에 키 한쪽을 가져가는 건 크게 문제가 되지 않는다.

    여기까지 읽고 나면 '키를 얻으려고 시도하는 놈을 잡으면 되지 않느냐?'라는 생각이 들 것이다. 그것이 어렵다는 것을 보이기 위해, 실제로 911 테러때 테러리스트들이 정보를 주고 받기 위해 사용된 방법 이라고 주장되고 있는 방법 하나를 소개해 보겠다. JPG 포멧은 손실 압축을 하기 때문에 중간 중간에 실제 이미지 데이터가 아닌 데이터가 끼어 있어도 표시되는 이미지의 퀄리티에는 크게 영향을 미치지 않는다는 점을 이용해서, 포르노그라피 이미지에 테러와 관련된 정보를 담아두고, 그 이미지를 통해 테러 시행에 대한 정보를 주고 받았다고 한다.

    예를 들자면, 소식을 주고 받을 때 "구글에서 '홀딱벗은 그녀'로 검색해서 나오는 여자중에 탄띠를 맨 여자"의 사진에 키를 포함해 두기로 약속했다고 하자. 설령 그 사실에 대해 미리 첩보를 입수했다 해도 홀딱벗은 그녀를 검색해서 이미지를 다운 받은 미국인을 체포 한다면... 남녀 불문하고 꽤 많은 사람이 잡혀 들어가야 했을 것 이다. 나무를 숨기려면 숲 속에 숨기라는 말이 있는 것 처럼, 흔히 존재하는 정보들 사이에 비밀 키를 숨겨둔다면 쉽게 찾을 수 없을 것이며, 찾는 사람이 많은 류의 - 주로 헐벗은 남녀의 사진속에 비밀 정보를 숨긴다면 그 사진을 다운받아 가는 사람중에 진짜 불순한 의도를 갖는 이가 누구인지 확인하기도 힘들다.

    이렇게 조낸 좋은 공개키 방식의 암호가 갖는 단점은 암/복호화 하기 위한 연산량이 많고충분한 안전성을 확보하기 위해서는 수천 비트에 해당하는 키를 사용해야 한다는 점이다. 기본적으로 대부분의 공개키 방식은 비슷한 근본 원리를 갖는다. 가장 많이 사용되는 RSA의 경우, 두 소수를 개인키로 사용하고, 두 소수를 곱한 값을 공개키로 사용한다1. 그렇기 때문에 공개된 키를 소인수분해 해서 두 소수를 구하면 개인키를 얻어낼 수 있다. 그렇기 때문에, 가능한 큰 키를 사용해야 공격자가 공개키를 이용해서 개인키를 구하는데 많은 시간을 투자하게 되고, 공격에 성공하지 못할 수 있다. 예를 들어 공개키가 15라면, 누구든지 개인키가 3과 5라는 걸 쉽게 알아 낼 수 있을 것 이다. 그렇기 때문에 충분히 큰 값의 두 소수를 선택해야 안전해 질 수 있다2.  이 과정에서 큰 정수의 사칙 연산을 수행해야 하는데, 계산의 대상이 되는 정수값이 크면 클수록 연산시간이 많이 걸릴 수 밖에 없다. 또한, 더 안전하게 하려면 더 큰 소수를 골라야 하며, 더 큰 소수는 더 큰 키를 요구하게 된다. 최근에 가장 많이 사용되는 키의 크기는 1024비트 이며, 2048 비트 크기의 키를 사용하는 경향이 늘고 있다.

    공개키 방식 - 인증서를 이용하는 암호화 통신 방식에서 흔히 사용하는 암호화 방식이 암호의 안전성에 있어 뛰어나다고 생각하는 사람이 많지만 사실은 같은 크기의 키를 사용하는 블럭암호에 비해 안전성은 떨어진다.128비트의 AES와 2048비트의 RSA는 비슷한 안전성을 갖는 것 으로 간주된다3. 아래 논문은 관련된 논문이다.

    Arjen K. Lenstra, Unbelievable Security: Matching AES security using public key systems, Proceedings Asiacrypt 2001, LNCS 2248, Springer-Verlag 2001, 67–86

    다음 링크를 통해 논문의 내용을 확인할 수 있을 것 이다.

    http://www.win.tue.nl/~klenstra/aes_match.pdf 

    위의 논문은 2001년에 발표된 논문이며, 실제 컴퓨터 성능의 향상 속도는 그 당시에 예측했던 것 보다는 덜 빠르게 발전한 것으로 알려져 있으므로, 위의 논문보다는 조금정도 안전하다는 가정을 할 수 있겠지만 안전과 관련된 문제는 비관적인 관점으로 볼 필요가 있다. 어찌 되었든, 공개키는 아무렇게나 뿌려도 상관이 없기 때문에  대칭키(Symmetric Key)를 사용하는 블럭암호와는 달리 키 전달을 위해 노력을 할 필요가 없다. 

    결론적으로, 키 전달이 쉽고 키가 안전하게 전달될 수 있을 것 이라는 것 때문에 때문에 공개키 방식을 많이 사용하는 것이지, 더 안전하기 때문에 공개키 방식을 사용하는 것은 아니다. 그러므로, 키가 공격자에게 빼앗기지 않으리라는 보장이 있다면, 공개키 방식을 사용하는 것 보다는 대칭키 방식을 사용하는 것이 같은 안전도를 갖는 경우에는 키의 크기가 작아지고, 같은 크기의 키를 사용하는 경우에는 더 안전한 대칭키 방식의 암호 - 블록암호를 사용하는 편이 더 좋다. 반대로, 키가 공격자에게 노출될 위험을 갖는다면 대칭키 방식을 사용하는 것이 나쁜 선택이 될 확률이 높다 할 수 있다.


*     *     *

다른 사람에 비해 실력이 떨어지는 주제에 비슷한 분량의 글을 쓰려고 하다보니 가랭이가 찢어졌습니다. 글을 쓰고 나서 내용을 확인하고, 논문 찾고 하다보니 시간이 많이 드네요. ㅡ,.ㅡa 앞으로는 스스로의 실력을 감안해서 글의 양을 좀 줄여 보도록 하겠습니다.

다음 번에는 블럭방식의 암호화의 특징에 대해 설명하고, PGP 방식이 어떤 식으로 동작하는지에 대해 설명을 하도록 하겠습니다.

*     *     *


  1. 물론, 구체적인 내용은 조금 다릅니다만, 큰 그림 안에서는 대충 맞습니다. 자세한 내용을 알기 원하시는 분은 http://ko.wikipedia.org/wiki/RSA_%EC%95%94%ED%98%B8 나 http://www.di-mgt.com.au/rsa_alg.html 를 참고하세요 [본문으로]
  2. 실제로 큰 두 소수의 곱을 소인수 분해하여 원래의 두 소수를 구하는 것은 어려운 일 이라는 것이 수학적으로 증명되어 있습니다. 그러므로 충분히 큰 값의 키를 사용한다면 공격자가 공격에 충분히 안전합니다. 
  3. 이 내용은 Arjen K. Lenstra 의 논문에서 제시한 내용입니다. 논문에서 저자는 컴퓨터의 속도에 따라 각 암호화 방식이 깨지는 속도의 차이가 나기 때문에 2001년 당시의 하드웨어의 속도 향상의 추세를 놓고 볼때 2030년 까지는 128비트의 AES와 2048비트의 RSA가 비슷한 정도의 안전성을 가질 것 이라고 예측 했습니다.



  1. 빠르고 강력한 대칭키 방식의 암호

    대칭키 - 블록 암호는 구조가 단순하기 때문에 구현하기 쉽고, 비트열연산이 전부이므로 속도가 빠르다. 그에 비해 공개키 방식은 큰 수의 연산이 필수 이므로 큰 정수 연산을 수행하는 라이브러리가 필요하다. 결론적으로, 대칭키 방식의 암호는 비대칭키 - 공개키 방식의 암호에 비해 더 빠르다. 그 사실을 증명하기 위해 다음과 같은 두 코드를 작성 하였다. 두 코드 모두 OpenSSL에서 제공하는 crypto 라이브러리의 함수들을 사용하였다.

    AESSpeedTest.c

    #include <stdio.h>
    #include <stdlib.h>

    #include <openssl/evp.h>
    #include <openssl/aes.h>
    #include <openssl/err.h>

    int main(int argc, char *argv[])
    {
    uint8_t* plainText = (uint8_t*)malloc(sizeof(uint8_t) * 1024);
    uint8_t* cipherText = (uint8_t*)malloc(sizeof(uint8_t) * 1024 + EVP_MAX_BLOCK_LENGTH);
    uint8_t* key = (uint8_t*) "abcdefghijklmnop";
    unsigned int plainTextLen = 1024;

    EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
    int paddingLen = 0, cyperLen = 0; register unsigned i;

    ERR_load_crypto_strings();
    EVP_CIPHER_CTX_init(ctx);

    if(EVP_EncryptInit(ctx, EVP_aes_128_ecb(), key, NULL) != 1)
    {
    printf("ERR : EVP_Encrypt() - %s\n", ERR_error_string(ERR_get_error(), NULL));
    return -1;
    }

    for(i = 0; i < 1024 * 1024; i++)
    {
    EVP_EncryptUpdate(ctx, cipherText, &cyperLen, plainText, plainTextLen);
    }

    if (EVP_EncryptFinal(ctx, cipherText + cyperLen, &paddingLen) != 1)
    {
    printf("ERR: EVP_EncryptFinal() - %s\n", ERR_error_string (ERR_get_error(), NULL));
    return -1;
    }

    EVP_CIPHER_CTX_cleanup(ctx);
    ERR_free_strings();

    return EXIT_SUCCESS;
    }


    RSASpeedTest.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #include <openssl/rsa.h>
    #include <openssl/evp.h>
    int main(int argc, char *argv[])
    {
    RSA *rsa = RSA_generate_key(2048, 3, NULL, NULL);;
    unsigned char* plainText = (unsigned char*) "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345";
    uint8_t* cipherText;

    register unsigned int i;

    if (RSA_check_key(rsa) != 1)
    {
    perror("Failed to generate RSA key");
    exit(0);
    }

    cipherText = (uint8_t *) malloc ((size_t) RSA_size(rsa));

    for (i = 0; i < 1024 * 1024 * (1024 / 245); i++)
    {
      RSA_public_encrypt(strlen((char*) plainText), plainText, cipherText, rsa, RSA_PKCS1_PADDING);
     }


    free(cipherText);
    RSA_free(rsa);

    return 0;
    }

    위의 같잖은 프로그램들1을 이용해 1GByte에 해당되는 데이터를 각각 5번씩 암호화 하고 가장 느린 것 둘을 제외한 나머지의 평균을 비교해 보도록 하겠다. 여러번 반복해서 평균을 비교하는 이유는, 인코딩 하는 중간에 태스크 전환이 일어난다던가 하는 등의 프로그램 외적인 문제에 의한 로스 타임이 길어지거나 짧아질 수 있기 때문이다.

    그런데,공개키 방식의 암호화 작업은 너무 느리기 때문에 키의 크기보다 큰 데이터를 암호화해 주지 않는다. 그렇기 때문에 2048비트 크기의 키를 이용해서는 256 바이트 까지만 암호화가 가능하다. 그러나, 암/복호화 이외의 팩터 때문에 그 전부를 암/복호화 할 수 는 없다. 2048 비트 크기의 키를 사용하는 경우 암호화 할수 있는 데이터의 크기는 최대 245 바이트이다. 그래서, RSA 암호화 샘플에서는 반복횟수를 1024 * 1024 회가 아니라, 1024 * 1024 * (1024 / 245) 번을 반복한다.

    아래의 실행결과는 2.5GHz 인텔 i5 쿼드코어, 8G 메인메모리, Windows7 64비트 환경에서 실행한 결과이다. 잡다한 프로그램들이 상당히 많이 깔려있는 컴퓨터 인지라 다른 프로그램의 영향을 받았을 확률이 높다. 사실 쿼드코어 환경이라고 해도, 암호화과정 자체가 병렬처리 될 수 없기 때문에 코어 하나만 사용했다고 봐도 무방하다.

     real     0m3.869s
     user    0m3.837s
     sys     0m0.000s

     real     0m3.822s
     user    0m3.806s
     sys     0m0.015s

     real     0m3.838s
     user    0m3.790s
     sys     0m0.015s

     real     0m3.822s
     user    0m3.806s
     sys     0m0.015s

     real     0m3.822s
     user    0m3.806s
     sys     0m0.000s

    AESSpeedTest 실행결과

    AES의 평균 처리 속도는 약 3.801s이고, 초당 처리 바이트 수는 282,489,299 바이트이다. 128비트 AES를 사용하였기 때문에, 초당 17,655,581번의 AES 연산이 수행되는 셈이 된다.

     real     3m32.800s
     user    3m32.769s
     sys     0m0.000s

     real     3m32.613s
     user    3m32.566s
     sys     0m0.015s

     real     3m32.738s
     user    3m32.644s
     sys     0m0.015s

     real     3m32.831s
     user    3m32.722s
     sys     0m0.000s

     real     3m32.987s
     user    3m32.878s
     sys     0m0.046s

    RSASpeedTest 실행결과

    RSA의 평균 처리 속도는 212.644s 이고, 초당 처리 바이트 수는 5,049,481 바이트 이다. 2048비트 RSA를 사용하였으니, 초당 20,610 번의 RSA 연산을 수행한 셈이 된다.

    사실, 실험결과를 가지고 계산해 볼 필요도 없을 정도로 차이가 극명하다. 블록암호의 경우에는 16바이트 정도의 배열과 비트열을 가지고 깔짝대는 정도의 연산 뿐 이지만, 공개키 방식의 암호는 256바이트를 대상으로 덧셈, 곱셈, 정수 나눗셈을 해야 한다. 그러니 실험을 해볼 필요도 없이 AES의 속도 - 블록 암호의 속도가 빠를 수 밖에 없다.

    정녕, 단매에 죽고 싶은게냐? 대체 쓸데없는 실험은 왜한 것이냐!

    사실, 16바이트만 암호화 하는 경우는 있을 수 없는 데다가, ECB 방식은 쓰지 말라고 했으니, 위의 실험 결과는 사실 실제로 프로그램을 작성했을 때 어느정도의 시간을 필요로 하는지를 예측하는 데에는 사용할 수 없는 데이터 이다. 그래서, 여기에서 설명하고자 하는 것과는 직접적인 관계는 없지만, 실제 파일을 대상으로 암호화 작업을 했을 때 어느정도 시간이 소요되는지 간단한 실험을 해보도록 하겠다.

    1,761,397,888 바이트 짜리 파일을 다음의 커멘드를 이용하여 암호화 해 보니 다음과 같은 결과를 얻었다.

    time openssl aes-128-cbc -in 1761397888_byte_long.bin -K 000102030405060708090a0b0c0d0e0f -iv 000102030405060708090a0b0c0d0e0f -e -out encrypted_file.enc

    real 0m55.238s
    user 0m11.480s
    sys
    0m3.023s

    리얼이 상당히 길고, 유저 타임이 짧은 걸 봐서는 대부분의 시간을 파일 액세스 하기위해서 대기하는데 보냈다는 것을 알 수 있다. 어찌 되었든 우리에게 필요한 데이터는 두번째의 유저타임 뿐이다. 왜? 대부분의 경우 메모리내 데이터를 암호화 해서 보내지 덩치큰 파일을 암호화 해서 보내거나 하지는 않을 것 이기 때문이다. 대략 초당 153,431,871 바이트, 9,589,491개의 16바이트 블록을 암호화 할 수 있다는 것을 알 수 있다. 파일 액세스나 많은 다른 요소들 때문에 속도가 절반 이하로 줄어들기는 했지만, 실제 환경에서도 다른 작업과 병행해서 작업을 할 것 이므로 비슷한 정도로 암호화/복호화 할 수 있을 것 이다.

    AES의 경우, 속도를 희생한다면 대략 1KB ~ 4KB 사이에서 구현이 가능하다. 일반적인 방식을 사용여 효율을 우선시 한 경우 40KB 정도의 코드 및 데이터로 암복호화 모듈을 만들 수 있다. 그러므로, 효율이나 안전성을 우선으로 생각한다면, 공개키 방식 보다는 블록 암호를 사용하는 편이 더 나은 선택 이라는 것을 알 수 있을 것 이다.

  2. 둘을 적당히 섞은 PGP(Pretty Good Privacy) 방식의 암호체계

    앞에서 말 했듯이 비 대칭키 방식과 대칭키 방식은 각각의 특징을 가지고 있고, 서로 다른 상황에서 사용하기 위해서 만들어진 것이다. 그러나, 두 방식의 특징을 섞어서 장점만 취하고 싶은 것이 인지상정! 그래서 만들어진 것이 PGP 방식의 암호화 방식이다. PGP를 한마디로 설명하자면 '본문을 대칭키로 암호화 하고 그 대칭키를 공개키로 암호화 하여 전달하는 방식'이다.

    통신을 시도하게 되면 

    1. 통신을 위해 서버와 클라이언트가 각각 공개키/개인키를 생성한다.

    2. 상대방에게 생성된 공개키를 전송한다.

    3. 세션키로 사용할 대칭 키를 하나 생성한다. 이 세션 키는 말 그대로 통신을 수행하는 동안에 사용되는 대칭키 이다. 대칭키의 특성상 같은 키를 이용해서 많은 데이터를 암호화 하면 할 수록 깨기 쉬워지기 때문에, 말 그대로 한 세션 동안에만 사용되는 키는 상대적으로 공격에 강할 수 밖에 없다.

    4. 만들어진 세션키를 이용하여 전송 하고자 하는 데이터를 암호화 한다.

    5. 만들어진 세션키를 상대편의 공개키를 이용해 암호화 한다.

    6. 암호화된 세션키와 그 세션키로 암호화 된 데이터를 묶는다.

    7. 이렇게 만들어진 데이터를 전달해 주면 된다.!!!

    이렇게 묶어줌으로서 공개키 방식의 안전한 키 전달 방식과, 블록 암호 방식의 강력한 암호화 특성을 모두 취할 수 있는 아주 좋은 방식이다. 사실, 제목에는 어정쩡 하다는 자극적인 표현을 달았지만 실제로 기존에 나와있는 암호화 통신 방식중에 이 이상으로 좋은 방식이 있기 힘든 아주 좋은 방식이다. PGP는 어찌 되었든 '상용'이며, GNU에서 GNU Privacy Guard (GnuPG 혹은 GPG)를 PGP 5.x 를 대체하는 공개 소프트웨어로 제공하고 있다.

게임의 패킷을 전달 하기 위해 그냥 PGP나 GPG를 사용하는 것도 나쁘지 않은 선택이 되겠지만, 다목적의 통신 패킷을 사용하는 것은 효율성 면에서 그다지 좋은 선택이 아닐 수 도 있다. 그렇기 때문에 작업중인 게임의 특성에 맞추어 암호화 통신을 위한 프로토콜을 만들어 보는 것도 좋은 것 이다. 다음 번 부터는 프로토콜을 디자인 하는 작업을 해 보겠다. 프로토콜을 디자인 하는데 필요한 바탕 지식과, 프로토콜을 공격하는 공격 기법을 설명하고, 그 공격을 어떻게 회피할 지에 대해 설명을 하고 함께 프로토콜을 디자인 해 보도록 하겠다.

*     *     *

역시 생각만큼 생각을 풀어내는 것이 쉽지는 않네요, 어디 까지 상세하게 써야 하는 건지도 확실하지가 않은지라 할수록 어렵네요. 계속 써야 하는지도 막막 고민이 되네요... 뭐, 보든 말든 어찌 되었든 쓸겁니다.