GnuPG 리눅스에서 안전하게 통신하기

[譯: 윤봉환, el@linuxlab.co.kr]
원문 : By Kapil Sharma

 

     

개요

    GnuPG는 통신상에서 혹은 데이터를 저장할 때 보안을 지키는 도구이다. GnuPG는 데이터를 암호화하고 전자 서명을 만들 수 있으며 암호화 도구로 유명한 PGP를 완벽하게 대신할 수 있다. 하지만, IDEA 알고리듬을 전혀 이용하지 않으므로 아무런 제한 없이 쓸 수 있다.

    GnuPG는 공개키 방식의 암호화 기법을 사용하므로 더욱 안전하게 통신할 수 있다. 공개키 시스템에서는 사용자마다 비밀키와(private key) 공개키를 쌍으로 가지고 있다. 사용자의 비밀키는 노출되지 않고 안전하게 보관되며 공개키는 사용자와 통신하려는 다른 이들에게 나눠줄 것이다.

 

Features

    ·PGP를 완전하게 대체
    ·배타적인(특허) 알고리듬은 전혀 사용하지 않는다.
    ·GPL에 따른다.
    ·필터 프로그램처럼 사용할 수 있다.
    ·OpenPGP를 충족시킨다.
    ·PGP나 보안성이 강화된 PGP 2보다 나은 기능을 가지고 있다.
    ·PGP 5.x 메시지를 풀고 검증한다.
    ·ElGamal (서명과 암호화), DSA, 3DES, Blowfish, Twofish, CAST5, MD5, SHA-1,
       RIPE-MD-160, TIGER 등을 지원한다.
    ·새로운 알고리듬을 모듈 형태로 쉽게 추가할 수 있다.
    ·사용자 ID는 표준 형식을 따르도록 만든다.
    ·키와 서명의 만료 기간을 정할 수 있다.
    ·English, Danish, Dutch, Esperanto, French, German, Japanese, Italian, Polish,
       Portuguese (Brazilian), Portuguese (Portuguese), Russian, Spanish, Swedish 등을
       지원한다.
    ·온라인 도움말 시스템.
    ·익명 메시지 수신자들을 선택할 수도 있다.
    ·HKP 키서버를 완벽하게 지원한다.(wwwkeys.pgp.net).
    ·그래픽 유저 인터페이스를 가진 프론트 엔드 프로그램(GUI frontend)들이 많이 있다.
       GnuPG와 관련된 소프트웨어들은 http://www.gnupg.org/download.html에서 모두
       찾을 수 있다.

 

설치

    gnupg 소스 파일을 ./usr/local/ 디렉토리나 설치하려는 디렉토리로 옮겨간다.(cd 명령)
     [root@dragon local]# tar xvzf gnupg-1.0.4.tar.gz
     [root@dragon local]# cd gnupg-1.0.4
     [root@dragon gnupg-1.0.4]# ./configure
     [root@dragon gnupg-1.0.4]# make
    make 명령은 Makefile 속에 정해진 규칙에 따라 소스파일을 컴파일해서 실행할 수 있는
    바이너리 형태로 만든다.

     [root@dragon gnupg-1.0.4]# make check
    패키지에 들어 있는 도구들로 자가-진단을 실행한다.

     [root@dragon gnupg-1.0.4]# make install
    바이너리와 그 밖에 필요한 파일들을 지정된 위치에 설치한다.

     [root@dragon gnupg-1.0.4]# strip /usr/bin/gpg
    "strip" 명령은 gpg 바이너리 파일의 크기를 줄여 속도를 향상시킨다.

 

Common Commands

     

    1: 새로운 키 쌍 만들기

    먼저 새로운 키-쌍을(공개키와 비밀키) 만들어야 한다. 명령행 옵션 --gen-key는 새로운 키 쌍을 만든다.

    Step 1
    gpg를 처음 시작하면 필요한 디렉토리가 만들어진다:
     

    [root@dragon /]# gpg --gen-key
    gpg (GnuPG) 1.0.2; Copyright (C) 2000 Free Software Foundation, Inc.
    This program comes with ABSOLUTELY NO WARRANTY.
    This is free software, and you are welcome to redistribute it
    under certain conditions. See the file COPYING for details.

    gpg: /root/.gnupg: directory created
    gpg: /root/.gnupg/options: new options file created
    gpg: you have to start GnuPG again, so it can read the new options file

 

    Step 2
    아래 명령으로 GnuPG를 다시 시작한다:
     

    [root@dragon /]# gpg --gen-key
    gpg (GnuPG) 1.0.2; Copyright (C) 2000 Free Software Foundation, Inc.
    This program comes with ABSOLUTELY NO WARRANTY.
    This is free software, and you are welcome to redistribute it
    under certain conditions. See the file COPYING for details.

    gpg:/root/.gnupg/secring.gpg: keyring created
    gpg: /root/.gnupg/pubring.gpg: keyring created
    Please select what kind of key you want:
       (1) DSA and ElGamal (default)
       (2) DSA (sign only)
       (4) ElGamal (sign and encrypt)
    Your selection?  1
    DSA keypair will have 1024 bits.
    About to generate a new ELG-E keypair.
                  minimum keysize is  768 bits
                  default keysize is 1024 bits
        highest suggested keysize is 2048 bits
    What keysize do you want? (1024) 2048
    Do you really need such a large keysize? y
    Requested keysize is 2048 bits
    Please specify how long the key should be valid.
             0 = key does not expire
          <n>   = key expires in n days
          <n> w = key expires in n weeks
          <n> m = key expires in n months
          <n> y = key expires in n years
    Key is valid for? (0) 0
    Key does not expire at all
    Is this correct (y/n)? y

    You need a User-ID to identify your key; the software constructs the user id from Real Name, Comment and Email Address in this form: Real name: Kapil sharma
    Email address: kapil@linux4biz.net
    Comment: Unix/Linux consultant
    You selected this USER-ID:
        "Kapil Sharma (Unix/Linux consultant) <kapil@linux4biz.net> "

    Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
    You need a Passphrase to protect your secret key.

    Enter passphrase: [enter a passphrase]
    Repeat passphrase: [Repeat passphrase]

    We need to generate a lot of random bytes. It is a good idea to perform
    some other action (type on the keyboard, move the mouse, utilize the
    disks) during the prime generation; this gives the random number
    generator a better chance to gain enough entropy. ++++++++++.+++++^^^
    public and secret key created and signed.

 

    키 쌍을 만들어 내는 동안 GnuPG가 물어보는 다양한 질문들에 대해 알아보자.
     

    Please select what kind of key you want:
    (1) DSA and ElGamal (default)
    (2) DSA (sign only)
    (4) ElGamal (sign and encrypt)
    Your selection?

 

    GnuPG는 종류가 다른 키 쌍을 만들어 낼 수 있다. 여기에는 세 가지 옵션이 있다.

    DSA 키 쌍은 서명을 만들 때에만 사용할 수 있는 1차 키 쌍이다. ElGamal 하위 키 쌍은 암호화하는데 쓰인다. 두 번째 옵션은 첫 번째 옵션과 비슷하지만 오직 DSA 키 쌍만 생성한다. 옵션 4[1]은 서명과 암호화에 모두 사용할 ElGamal 키 쌍 한가지를 만든다. 대개 기본 옵션을 사용하면 좋다.

    이제는 키 크기를 골라야 한다. DSA 키 크기는 반드시 512에서 1024 비트 사이여야 하며, ElGamal 키는 어떤 크기라도 상관없다.
     

    About to generate a new ELG-E keypair.
    minimum keysize is  768 bits
    default keysize is 1024 bits
    highest suggested keysize is 2048 bits
    What keysize do you want? (1024)

 

    긴 키를 선택하면 좋은 점과 나쁜 점이 있는데:

     좋은점 : 1) 긴 키는 무식한 공격에 대해 보다 안전하다.
     단   점 : 1) 암호화하거나 그 것을 풀어낼 때 키 크기가 크면 클수록 오래 걸린다 .
                 2) 긴 키는 서명 길이에도 영향을 준다.

    기본 키 크기는 거의 모든 경우에 적당하며 키 크기를 선택한 다음에는 결코 바뀌지 않게 할 수 있다. 마지막으로 만료기간을 골라야 한다. 옵션 1을 선택했다면 만료기간은 ElGamal과 DSA 키 쌍 모두에 적용된다.
     

    Please specify how long the key should be valid
    0 = key does not expire   = key expires in n days
    <n> w = key expires in n weeks
    <n> m = key expires in n months
    <n> y = key expires in n years
    Key is valid for? (0)

 

    대부분 사용자들에게 만료 기간을 정해 두는 것은 어울리지 않는다. 키가 만들어진 다음에도 기간을 바꿀 수 있지만 여러분의 공개키를 가지고 있는 다른 사용자들에게 바뀐 것을 알리기 어려울 수 있으므로 만료 기간은 조심스럽게 선택해야 한다.

    여러분은 반드시 키 패러미터에 사용자 ID를 넣어야 한다. 사용자 ID는 키가 만들어지는 동안 실제 사람과 연관시킬 때 사용된다.
     

    You need a User-ID to identify your key; the software constructs the user id from Real Name, Comment and Email Address in this form:
    "Kapil Sharma (Linux consultant) <kapil@linux4biz.net> "
    Real name: Enter you name here
    Email address: Enter you email address
    Comment: Enter any comment here

 

    GnuPG는 여러분이 소유한 주 키와 하위 키를 보호하기 위해 비밀문구(passphrase)를 요구한다.
     

    You need a Passphrase to protect your secret key.

    Enter passphrase:

 

    비밀문구(秘密文句) 길이에는 제한이 없다. 보안적 관점에서 비밀키를 해제하기 위한 passphrase는 GnuPG의 취약점 가운데 하나이므로(그리고 다른 공개키 암호화 시스템에서도) 구문을 매우 조심스럽게 선택해야 한다 .이상적인 비밀문구는 사전에 나와있는 단어를 사용하지 않고 알파벳 문자와 알파벳이 아닌 문자들을 조합한 문자열이다. 좋은 비밀문구는 GnuPG 자신의 보안에 매우 중요하다.

     

    2: 인증 폐지 증명

    여러분이 사용할 키 쌍이 만들어진 다음에는 바로 "--gen-revoke" 옵션을 덧붙여서 주 공개키에서 사용할 폐지 증명을 만들어야 한다. 여러분이 설정한 비밀문구를 잊었거나 여러분의 비밀키가 훼손되거나 잃어버렸을 때 폐지 증명은 여러분이 나눠준 공개키가 더 이상 쓸모 없다는 것을 다른 이들에게 알리는 데 쓰인다.
     

    [root@dragon /]# gpg --output revoke.asc --gen-revoke mykey

 

    mykey에는 여러분이 앞서 만든 주 키 쌍의 키 ID를 넣거나, 키 쌍을 식별하기 위해 넣은 사용자 ID 일부를 넣는다. 생성된 증명은 revoke.asc라는 이름을 가진 파일에 저장된다. 폐지증명은 다른 이들이 접근할 수 있는 디렉토리에 두지 않는다. 아무나 이 파일에 접근할 수 있다면 누구나 폐지 증명을 출판할 수 있을 것이고 일치하는 공개키를 추출해 낼 수도 있을 것이다.
     

    root@alive /root [18] # gpg --output revoke.asc --gen-revoke el

    sec  1024D/C8D2B7E5 2000-12-07   electuz (Linux Consultant) <el@linuxlab.co.kr>

    Create a revocation certificate for this key? y

    You need a passphrase to unlock the secret key for user: "electuz (Linux Consultant) <el@linuxlab.co.kr>"
    1024-bit DSA key, ID C8D2B7E5, created 2000-12-07

    ASCII armored output forced.
    Revocation certificate created.

    Please move it to a medium which you can hide away; if Mallory gets
    access to this certificate he can use it to make your key unusable.
    It is smart to print this certificate and store it away, just in case your media
    become unreadable.  But have some caution:  The print system of
    your machine might store the data and make it available to others!


     

    3: 키 목록

    여러분의 공개키를 목록으로 만들어 고리에 걸어 두려면 명령행에서 --list-keys 옵션을 사용한다.
     

    [root@dragon /]#  gpg --list-keys
    /root/.gnupg/pubring.gpg
    ------------------------
    pub  1024D/020C9884 2000-11-09 Kapil Sharma (Unix/Linux consultant)
    <kapil@linux4biz.net>
    sub  2048g/555286CA 2000-11-09


     

    4: 공개키 추출하기

    여러분 홈페이지나 인터넷에 있는 키 서버, 혹은 다른 방법들을 이용해서 공개키를 배포할 수 있다. 여러분에게 편지를 보낼 사람에게 공개키를 보내기 전에 먼저 추출해야 한다. 명령행에서 --export 옵션을 사용한다. 추출하려는 공개키를 지정하는 옵션을 덧붙인다.

    바이너리 포맷으로 공개키를 추출하려면 아래 명령을 사용한다:
     

    [root@dragon /]# gpg --output kapil.gpg --export kapil@linux4biz.net

 

    ASCII 문자들로 바꾸어 공개키를 추출할 때에는 아래 명령을 사용한다:
     

    [root@dragon /]# gpg  --export-armor > kapil-key.asc

 

    "--export"는 암호화된 공개키 열쇠고리 파일에서 공개키를 뽑아낸다. "-armor"는(역자가 테스트한 1.0.4 버전에서는 --export -a 또는 --export --armor 옵션을 사용한다) 전자우편이나 웹 페이지를 통해 공개키를 배포할 수 있도록 ASCII 문자들로 구성된 출력물을 생성하며 "> kapil-key.asc"는 출력된 결과를 파일로 저장한다.

    ASCII 문자들로 구성된 출력물을 그저 화면상으로 보기만 한다면 다음 명령을 사용한다:
     

    [root@dragon /]# gpg  --export-armor
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    Version: GnuPG v1.0.2 (GNU/Linux)
    Comment: For info see http://www.gnupg.org
    [...]
    -----END PGP PUBLIC KEY BLOCK-----


 

    5: 공개키 가져오기

    여러분의 키 쌍이 만들어졌으면, 그 것을 공개 열쇠고리(public keyring) 데이터베이스에 넣을 수 있다. 믿을 수 있는 상대가 보내는 모든 키들을 공개 열쇠고리에 걸어 두고 필요에 따라 암호화와 인증 통신에 사용할 수 있다. 공개키는 --import 옵션을 이용해서 여러분의 공개 열쇠고리에 보탠다.
     

    [root@dragon /]# gpg --import <filename>

 

    "filename"은 배포하는 공개키 이름이다. 예를 들어:
     

    [root@dragon /]# gpg --import mandrake.asc
    gpg: key :9B4A4024: public key imported
    gpg: /root/.gnupg/trustdb.gpg: trustdb created
    gpg: Total number processed: 1
    gpg:                     imported: 1

 

    위 예문은 맨드레이크 리눅스 회사에서 배포하는 공개키 파일 "mandrake.asc"를 인터넷 사이트로부터 가져와서 우리 열쇠고리에 더한다.

     

    6: 키 비준하기

    키를 가져왔으면 먼저 비준(批准)과정을 거쳐야 한다. 키는 핑거프린트(fingerprint)를 검사해서 비준하고 검사한 키가 유효한 키임을 증명하기 위해 서명한다. 키 핑거프린트는 --fingerprint 옵션을 이용해 쉽게 볼 수 있다.
     

    [root@dragon /]# gpg --fingerprint <UID>

 

    UID는 공개키 배포자의 이름 가운데 일부이다. 예를 들어:
     

    [root@dragon /]# gpg --fingerprint mandrake
    pub  1024D/9B4A4024 2000-01-06 MandrakeSoft (MandrakeSoft official         keys) <mandrake@mandrakesoft.com>
            Key fingerprint = 63A2 8CBD A7A8 387E 1A53  2C1E 59E7 0DEE 9B4A         4024
    sub  1024g/686FF394 2000-01-06

     

    위 예문에서 맨드레이크 핑거프린트를 검사했다. --fingerprint 옵션을 이용해 추출한 키 핑거프린트는 키를 배포한 원래 소유자를 통해 확인한다. 그 사람에게 직접 묻거나 전화나 혹은 보증할 수 있는 다른 방법을 통해 진짜 소유자에게 연락해서 확인할 수 있다. 여러분이 --fingerprint 옵션을 이용해 알아낸 핑거프린트가 원래 소유자의 것과 일치한다면 진짜 키를 가지게 된 것이다.

     

    7: 키 서명하기

    키를 가져와서 여러분의 공개키 데이터베이스에 넣고 확인한 다음에는 여러분의 서명을 덧붙일 수 있다. 키에 서명을 덧붙이는 것은 여러분이 그 키의 주인을 알고 있으며 믿을 만 하다는 것을 보증하는 셈이다. 그러므로, 100% 신뢰할 수 있을 때에만 서명해야 한다.

    여러분이 위에서 열쇠고리에 덧붙인 Mandrake회사의 키에 서명하려면 다음 명령을 사용한다:
     

    [root@dragon /]# gpg --sign-key <UID>

 

    예를 들어:
     

    [root@dragon /]# gpg --sign-key mandrake
    pub  1024D/9B4A4024  created: 2000-01-06 expires: never      trust: -/q
    sub  1024g/686FF394  created: 2000-01-06 expires: never
    (1)    MandrakeSoft (MandrakeSoft official keys) <mandrake@mandrakesoft.com>

    pub  1024D/9B4A4024  created: 2000-01-06 expires: never      trust: -/q
                 Fingerprint: 63A2 8CBD A7A8 387E 1A53  2C1E 59E7 0DEE 9B4A 4024

            MandrakeSoft (MandrakeSoft official keys) <mandrake@mandrakesoft.com>

    Are you really sure that you want to sign this key
    with your key: "Kapil Sharma (Unix/Linux consultant) <kapil@linux4biz.net> "
    Really sign? y
    You need a passphrase to unlock the secret key for
    user: "Kapil Sharma (Unix/Linux consultant) <kapil@linux4biz.net> "
    1024-bit DSA key, ID 020C9884, created 2000-11-09

    Enter passphrase: [Enter passphrase]


 

    8: 서명 검사하기

    서명한 다음에는 여러분의 서명이 덧붙여졌는지 서명 목록을 확인할 수 있다. 다른 이들도 키를 보증하는 서명을 한다면 사용자 ID마다 하나 이상의 자가-서명(self-signatures)이 있을 것이다. "--check-sigs" 옵션으로 서명을 확인할 수 있다:

    예를 들어:
     

    [root@dragon /]# gpg --check-sigs mandrake
    pub   1024D/9B4A4024 2000-01-06 MandrakeSoft (MandrakeSoft official
             keys) <mandrake@mandrakesoft.com>
    sig!    9B4A4024 2000-01-06  MandrakeSoft (MandrakeSoft official keys)
             <mandrake@mandrakesoft.com>
    sig!    020C9884 2000-11-09  Kapil Sharma (Unix/Linux consultant)
             <kapil@linux4biz.net>
    sub    1024g/686FF394 2000-01-06
    sig!    9B4A4024 2000-01-06  MandrakeSoft (MandrakeSoft official keys)
             <mandrake@mandrakesoft.com>


 

    9: 암호화하기와 해독하기

    문서를 암호화하거나 해독하기는 매우 간단하다.

    mandrake에게 보낼 메시지를 암호화하려 한다면 mandrake가 배포하는 공개키를 이용해 암호화해서 메시지를 보낸다. 이 메시지는 오직 mandrake가 가지고 있는 비밀키를 통해서만 해독할 수 있을 것이다. 만약 mandrake가 여러분에게 메시지를 보내려 한다면 여러분이 배포한 공개키를 이용해서 암호화해야 한다. 물론, 여러분이 가진 비밀키만이 그 메시지를 해독할 수 있다.

    우리 열쇠고리에 있는 공개키를 이용해 맨드레이크에게 보낼 자료를 암호화/서명하기 위해서는 아래 명령을 사용한다(당연히 편지 받을 이가 배포한 공개키를 미리 가지고 있어야 한다):
     

    [root@dragon /]# gpg  -sear <UID of the public key> <file>

 

    예를 들어:
     

    [root@dragon /]# gpg -sear Mandrake document.txt
    You need a passphrase to unlock the secret key for
    user: "Kapil Sharma (Unix/Linux consultant) <kapil@linux4biz.net> "
    1024-bit DSA key, ID 020C9884, created 2000-11-09

    Enter passphrase: [Enter passphrase]

 

    옵션에 쓰인 "s"는 서명하기, "e"는 암호화하기, "a"는 암호화된 ASCII 형식으로(".asc"는 전자우편을 통해 보내기 위해서이다), "r"은 암호화에 사용할 사용자 ID 이름, <file>은 암호화하려는 자료이다:

    메시지를 해독할 때에는 -d 옵션을 사용한다:
     

    [root@dragon /]# gpg  -d <file>

 

    예를 들어:
     

    [root@dragon /]# gpg -d documentforkapil.asc
    You need a passphrase to unlock the secret key for
    user: "Kapil Sharma (Unix/Linux consultant) <kapil@linux4biz.net> "
    1024-bit DSA key, ID 020C9884, created 2000-11-09
    Enter passphrase: [Enter passphrase]

 

    "-d" 옵션은 여러분이 받은 암호화된 자료 <file>을 해독한다. [주의: 메시지/자료를 보낸 사람의 공개키가 여러분의 열쇠고리에 반드시 들어 있어야 한다]

     

    10: 서명 검사하기

    여러분의 공개키를 추출해서 배포한 다음에는, 당신이 암호화된 메시지를 보내더라도, 메시지를 받은 다른 이들이 그 메시지에 당신의 서명이 있는지 GnuPG --verify 옵션을 이용해 알아볼 수 있다.
    암호화된 데이터에서 서명을 검사하려면 아래 명령을 사용한다:
     

    [root@dragon /]#  gpg --verify <Data>

 

    "--verify" 옵션은 서명을 점검하는 옵션이고, 점검하려는 암호화된 자료/파일은 "<Data>" 자리에 써넣는다.

    예를 들어:
     

    el@alive el [10] $ gpg --verify hello
    gpg: Signature made 2000년 12월 12일 화요일 오전  9시 42분 42초 KST
            using DSA key ID C8D2B7E5
    gpg: Good signature from "electuz (Linux Consultant) <el@linuxlab.co.kr>"


 

몇 가지 쓰임새

    1: 메일 메시지 암호화해서 보내기
    2: 파일이나 문서 암호화
    3: 네트워크를 통해 파일과 중요한 문서들을 암호화해서 보내기

     

GnuPG에 쓰이는 몇 가지 소프트웨어와 프론트엔드들:

    GPA http://www.gnupg.org/gpa.html
            표준 GnuPG에 쓰이는 그래픽 프론트엔드. 매우 예쁜 GUI 인터페이스.

    GnomePGP http://www.geocities.com/SiliconValley/Chip/3708/gpgp/gpgp-intro.html#
            GnuPG를 제어하는 GNOME 데스크탑 도구

    Geheimniss http://geheimnis.sourceforge.net/
            GnuPG KDE 프론트엔드

    pgp4pine http://pgp4pine.flatline.de/
            PGP 메시지를 다루기 위한 Pine 필터

    MagicPGP http://www.physto.se/~p99jlu/MagicPGP.html
            GnuPG와 Pine에 쓰이는 또다른 스크립트

    PinePGP http://www.megaloman.com/~hany/software/pinepgp/
            역시 GnuPG에 쓰이는 Pine 필터

 

더 많은 정보

    http://www.gnupg.org/docs.html

 

맺음

    보안에 신경이 쓰인다면 반드시 GnuPG를 사용해야 한다. GnuPG는 훌륭한 오픈-소스 프로그램 가운데 하나로 여러분의 보안 데이터를 암호화하고 해독하는 모든 기능을 가지고 있으며 GNU General Public License를 따르므로 어떤 제한도 없이 사용할 수 있다. GnuPG는 메일 메시지나 파일, 혹은 보안이 필요한 문서들을 암호화하는 데 사용할 수 있다. 또, 중요한 문서와 자료들을 네트워크로 전송할 때에도 사용할 수 있다.

    [주의: 버전 1.0.4 이전의 GnuPG에는 서명 점검과 관련된 보안버그가 있다.
     패치 파일은 ftp://ftp.gnupg.org/pub/gcrypt/gnupg/gnupg-1.0.4.security-patch1.diff]




▲ top