출처 : http://gc.myscan.org/gc09/node0001.html
작성자 : 최규식

PGP에 관심을 가지고 알아보다가 시스템에 설치된 GnuPG에대해 이것저것 알아보고
공부(?)하는중 웹검색에서 좋은문서를 발견(?)해서 훔쳐(?)왔습니다;

---------------------------------------------------------------------------------------
GnuPG 쓰는 법

최규식

--------------------------------------------------------------------------------

서론

최근 컴퓨터와 인터넷의 발달로 기존에 종이를 이용하던 문서들이 디지털 문서로 바뀌고 있다. 그러나 인터넷과 디지털 형식의 문서들은 개방적이고 복사방법이 매우 쉽기 때문에 privacy가 보장되기 어렵다. 이를 해결하기 위해서 여러가지 방법이 나와 있지만, 가장 쉽게 이용할 수 있다고 내가 판단 하는 것이 GnuPG (Gnu Privacy Guard)이다.

그게 뭐지?

GnuPG는 PGP를 대체하기 위한 자유소프트웨어이다. PGP는 pretty good privacy의 약자로 처음에는 Phill Zimmermann에 의해 1991년에 만들어졌다. 그 후 MIT에서 계속 개발을 하다가 현재는 NAI(Network Associates Inc.)에서 개발및 배포가 이루어지고 있다. 이 소프트웨어는 처음에 미국에서 개발되었기 때문에 암호에 관한 미국의 수출 금지법 때문에 공식적으로는 미국 이외의 지역에서는 사용이 금지되었다. 그럼에도 불구하고 미국이외의 지역으로 PGP가 퍼져나가기 시작하였고 PGP를 미국의 수출금지법에 저촉되지 않는 자유소프트웨어로 만드는 운동이 시작되었는데 그 중 하나가 GnuPG이다. GnuPG(이하 gpg, pgp를 패러디 한 느낌이 강하다.)는 특허가 걸려 있는 IDEA 알고리즘을 쓰지 않기 때문에 자유로운 배포가 가능하다.

도데체 그걸로 무얼 할 수 있는 거야?

gpg로 할 수 있는 일은 크게 두가지로 살펴 볼 수 있다. 첫째는 문서를 암호화하고, 해독할 수 있는 기능을 하고, 둘째는 문서에 서명을 하고, 그 서명을 확인하는 기능을 한다. gpg는 공개키(public key)와 비밀키(private key)를 사용해서 이 일을 할 수 있는데 어떻게 하는 것인지 간단히 살펴 보자.

먼저 gpg를 사용하는 A라는 사람이 있다고 가정해 보자. A는 공개키와 비밀키를 만들어 둔다. 그리고 비밀키는 자기만 가지고 있고 공개키는 여러 다른 사람에게 줄 수 있다. 물론 그 다른 사람들도 또 다른 사람에게 A의 공개키를 줄 수 있다. 다른 사람들이 A만 볼 수 있는 문서를 A에게 보내고 싶을 때(첫번째 경우에 해당된다.) A의 공개키를 이용해 문서를 암호화하고 암호화된 문서를 A에게 보낸다. A의 공개키로 암호화된 문서는 A의 비밀키로만 해독할 수 있기 때문에 그 문서가 A에게 전달이 되면 A는 자신의 비밀키를 이용해서 그 문서를 해독할 수 있지만, 다른사람이 우연히 그 문서를 가로챘다고 하더라도 A의 비밀키를 가지고 있지 않기 때문에 문서의 내용을 읽을 수 없게 된다.

다음에 A가 어떤 문서를 발행했는데 그 문서에 A의 서명이 필요할 때, 즉 문서에 A가 아니면 할 수 없는 표시를 남기고 싶을 때(두번째 경우에 해당된다.) A는 자신의 비밀키를 이용해서 문서에 서명을 하게 된다. 그 문서의 서명이 A의 것이라는 것을 증명하는데는 A의 공개키가 이용된다. 이렇게 하면 다른 사람들은 그 문서가 A의 서명이 되어있는 문서라는 것을 알 수 있게 된다.

이 두가지 기능을 모두 이용하게 되면 여자친구에게 비밀 편지를 안전하게 전송할 수 있다. 여자친구에게 비밀 편지를 보낼 때 필요한 것이 무엇인지 잘 생각해 보라. 첫째는 그 편지가 다른 사람 손에 들어 갔을 경우 그 사람이 내용을 읽을 수 없어야 한다. 둘째는 다른 사람이 악의를 품고 자신의 여자 친구에게 가짜 편지를 보낼 경우 여자친구는 그것을 가려낼 수 있어야 한다. 두가지만 보장된다면 안전한 연애편지를 쓸 수 있는 것이다. 물론 원시적으로는 둘이 서로 어떤 암호를 정해고 문서에 암호를 키로 해서 암호화 하는 방법이 있겠지만 암호가 유출되면(유출되기도 쉽다.) 다 끝장이라는 것이다. gpg를 사용해 보면, 먼저 자신의 비밀키를 이용해서 편지에 서명을 한다. 그리고 여자친구의 공개키를 이용해 편지를 암호화 하고 여자친구에서 편지를 전송한다. 여자친구는 먼저 자신의 비밀키를 이용해 편지를 해독한다. 그리고 남자친구의 공개키를 이용해서 그 편지를 정말로 남자친구가 보냈는지 확인을 한다. (과연 gpg를 이런 곳에 응용 할 수 있는 친구가 스캔에 얼마나 될지 의심스럽기는 하다.) 각자가 자신의 비밀키만 유출하지 않는다면 (유출될 일이 없다. 여자친구에게 조차 비밀키를 전송하지 않아도 된다. 반면에 서로가 패스워드를 정하는 방법은 패스워드 자체에 대해서 말을 해야 하기 때문에 유출될 가능성이 있다. 전화로 패스워드를 정했다고 하면 도청을 하면 패스워드가 유출되는 것이다.)

멋지군, 그럼 어떻게 쓰는 거지?

gpg를 쓰기 위해서는 먼저 자신의 컴퓨터에 gpg가 깔려 있어야 한다. gpg는 http://www.gnupg.org/에서 다운로드할 수 있이다. 그럼 gpg를 어떻게 쓰는 것인지 알아 보기로 하자.

Generating a new keypair (공개키와 비밀키 만들기)

gpg를 사용하기 위해서는 쉘 프롬프트에 gpg라는 명령을 쓴다. 공개키와 비밀키를 만들기 위해서는 --gen-key라는 옵션을 붙인다. 다음의 명령을 보라.

[kyusic@bilbo ~]$ gpg --gen-key
gpg (GnuPG) 1.0.4; 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: keyblock resource `/home/kyusic/.gnupg': file open error
gpg: keyblock resource `/home/kyusic/.gnupg': file open error
Please select what kind of key you want:
(1) DSA and ElGamal (default)
(2) DSA (sign only)
(4) ElGamal (sign and encrypt)
Your selection?

gpg에서는 여러가지 키방식을 제공하는데 DSA는 서명만 할 수 있는 방식이고 ElGamal은 서명과 암호화를 할 수 있는 방식이다. 일반적으로는 디폴트값을 사용하면 된다.

(예제와 같이 .gnupg가 없다며 file open error를 내는 경우에는 Ctl+c를 눌러서 프로그램을 종료시킨 후에 mkdir .gnupg명령을 써서 디렉토리를 만든 후 다시 실행해 보라.)

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)

키의 길이를 정하는 것인데 길수록 더 안전하지만, 암호화하고 해독하는데 더 많은 시간이 걸린다. 보통의 경우에는 디폴트 값인 1024가 적당하다.

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

키의 유효기간을 정하는 것인데 민감하고 중요한 통신 체계에서는 유효기간을 짧게 잡아서 키를 자주 바꾸어 주는 것이 좋다. 그러나 보통의 경우에는 계속 키를 사용하므로 디폴트 값인 0을 선택하자.

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:
"Heinrich Heine (Der Dichter) <heinrichh [at] duesseldorf [dot] de>"

Real name: Choi Kyusic

키의 이름을 정하는 것이다. 보통은 자신의 이름을 쓴다.

Email address: kyusic [at] myscan [dot] org

자신의 전자우편 주소를 쓴다.

Comment: 016-711-4079

코멘트할 것이 있으면 쓴다 나는 전화번호를 썼다.

You selected this USER-ID:
"Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

더 바꿀 것이 없다면 O를 누른다.

Enter 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.
+++++++++++++++++++++++++....++++++++++++++++++++..+++++++++++++++++++
++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++
++..>+++++<+++++....+++++

Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 300 more bytes)
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.

이렇게 하면 공개키와 비밀키가 만들어 진 것이다. 예제와 같이 중간에 Not enough ... 라고 나오는 경우에는 os가 충분히 random한 상태가 될 수 있도록 다른 여러 작업을 시키고 있으면(top을 하고 space bar을 연타하는 것이 가장 좋은 방법이었다. ^^) 다시 진행을 하게 된다.

Exchaning keys (키 주고 받기)

공개키를 만들었으면 다른 사람과 그 공개키를 교환해야 그 사람과 통신을 할 수 있다. 전자메일을 사용하여 공개키를 주고 받거나, 자신의 홈페이지에 공개키를 올려 놓는 것도 좋은 방법이다. 다른 사람의 공개키를 받게 되면 자신의 gpg에 설치(import)를 하게 되는데 설치된 공개키의 리스트를 보기 위해서 --list-keys라는 옵션을 사용한다.

[kyusic@bilbo ~]$ gpg --list-keys
/home/kyusic/.gnupg/pubring.gpg
-------------------------------
pub 1024D/046CE945 2000-11-22 Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>
sub 1024g/68736E83 2000-11-22

Exporting a public key (공개키 파일 만들기)

공개키를 다른 사람에게 주기 위해서 파일 형태로 만들어서 전달을 해 주어야 한다. --export옵션을 사용한다.

[kyusic@bilbo ~]$ gpg --output kyusic.gpg --export Kyusic

kyusic.gpg라는 것은 공개키가 들어 있는 output파일의 이름이고 Kyusic이라는 것은 그 공개키를 가려낼 수 있는 공개키의 이름이다. 즉, Choi가 될 수도 있고 kyusic [at] myscan [dot] org가 될 수도 있다. 하여튼 키를 유일하게 정할 수 있는 키의 이름의 substring이면 된다.

이렇게 해서 생긴 파일은 바이너리 파일이다. 그러나 바이너리 파일은 다른 사람과 주고 받기가 불편하다. 그래서 gpg는 --armor라는 옵션을 이용해서 아스키 파일도 지원한다. --armor 옵션은 아스키 파일에 관련된 명령을 내릴 때는 다루고 싶을 때는 항상 붙여 줄 수 있다.

[kyusic@bilbo ~]$ gpg --armor --export Kyusic
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: For info see http://www.gnupg.org

mQGiBDobfp8RBAC7VpB/dVNkHO78Wy3zY3NQ2Mi4z9+f6dbO9TvnJMfLvFMW/ruD
olDUc4eR1VWmOEyMH/6o+42YG5yR/dgxTkxPKb61AO8jj+9GDSIn85MUEEzz3h+n
PKneNpT/9at/TFUk3eL9SuNWohkHIODI8J+zuPi2eiRKWwvTf3aVD7uv1wCgyoAw
tYkd5gtF5n9LnEFi49b+IAkEAJlGgcJTkIlztTfqi6/k2KDbYgbhvEJFEFqpRQNA
JX1pmuOhgtXZch6zlV2nQcp1xjhtC6WbTF/8S241I06bZpDcAqvZn5mMG/HT+ilU
fBz41s/hf4fiUiBJ6NJ9uA09n8qqkAw3Ga9/w8PLyOTtVRd6pO364KrMYaIK/44f
UNevA/9jBaZnhU+ueLfu97/nv45K0VYOnCjf6NED0uKYM6TNA/BQfKmKUC+1omVu
nLhW0wZEf1rpasJRXOMh/iTKBFkGkEK7f3mJMb+Lvjy/D4IeAcbZDi4frnSsaaPV
RCc3by+r9/eSSz8lIPbMp1PUswMVXh3ttd//hBM/be2K/UClHrQuQ2hvaSBLeXVz
aWMgKDAxNi03MTEtNDA3OSkgPGt5dXNpY0BteXNjYW4ub3JnPohXBBMRAgAXBQI6
G36fBQsHCgMEAxUDAgMWAgECF4AACgkQ/YXWRARs6UWj2gCglKtghWfMh3WHOLci
MNjRHvoA5SAAnjLLEmtel9wyxjCJf64it7RTQNGFuQENBDobfqoQBACxCHXuYRn5
uTsjAwHLGKiJ0FW4baJTcJhvqUBaL5G2q7vJ8zRk5TQULVhIiUGC/H+tivr4If0l
u7s7VuuLLd+VTdkpQ+U98abRtL+dv9A9afiWWnPGElo+d+QGqpP/8XBTmWAisOUv
a2QrtkUk3e+Nbr0XI9qB+4Q8AZUDBAzI2wADBQP+LKqtcrikNGS8RfcakSezM+f+
Yv8qjjmajneplBDKbqNCzeDyWmhvWQvhuioCRjz8hR8Hsyq5liSV5vMxKdvNkVVl
1c6Xd7Bra/nIQwC/bwEXc7w0rSRW/0MqTEPr2Bi0jCk0LmQWQqflr1jWy6pDRcNf
8dLL4MF1fNBWF5SOPDeIRgQYEQIABgUCOht+qgAKCRD9hdZEBGzpRehzAKCY/nJu
1lzNcBTAnnSkn/fZF8emoQCdH04OQwMNYC4j/wELh7na48zV8z0=
=+JRk
-----END PGP PUBLIC KEY BLOCK-----

--output 옵션을 붙여 주지 않았다면 결과가 표준 출력으로 나온다. 이 텍스트 결과를 전자메일로 전송해 준다거나 홈페이지에 올리게 되면 다른 사람들이 이 공개키를 가지고 여러분만 볼 수 있는 비밀 문서를 보낼 수 있게 된다.

Importing a public key (다른 사람의 공개키 설치하기)

전자메일이나 홈페이지로부터 다른 사람의 공개키를 가지고 왔다면 그것을 자신의 gpg에 설치를 해야 한다. --import 옵션을 주면된다.

[kyusic@bilbo ~]$ gpg --armor --import haha.gpg
gpg: key 6B3EE3AE: public key imported
gpg: /home/kyusic/.gnupg/trustdb.gpg: trustdb created
gpg: Total number processed: 1
gpg: imported: 1

[kyusic@bilbo ~]$ gpg --list-keys
/home/kyusic/.gnupg/pubring.gpg
-------------------------------
pub 1024D/046CE945 2000-11-22 Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>
sub 1024g/68736E83 2000-11-22

pub 1024D/6B3EE3AE 2000-11-22 HaHaHa (virtual user) <haha [at] myscan [dot] org>
sub 1024g/4AFA4631 2000-11-22

haha.gpg는 haha라는 사람의 공개키가 들어있는 파일이고, 텍스트 파일이므로 --armor 옵션을 주었다. 자신의 gpg에 설치한 공개키에 대해서 그 공개키가 정말로 그 주인의 것이 맞다는 것을 확인했다는 뜻으로 서명을 할 수 있다. 서명을 하기 전에 그 공개키가 정말로 그 사람 것인지 확인을 해야 하는데 그 때 그 공개키의 fingerprint(지문)을 이용한다. 공개키의 지문을 확인하기 위해서 다음과 같은 명령을 내리자.

[kyusic@bilbo ~]$ gpg --edit-key haha
gpg (GnuPG) 1.0.4; 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.

pub 1024D/6B3EE3AE created: 2000-11-22 expires: never trust: -/q
sub 1024g/4AFA4631 created: 2000-11-22 expires: never
(1) HaHaHa (virtual user) <haha [at] myscan [dot] org>

Command>

haha는 아까도 말했듯이 공개키의 이름의 substring이다. haha의 공개키의 정보를 볼 수 있다. 여기서 이 공개키의 지문을 보기 위해서 command 프롬프트에 다음과 같은 명령을 내려 보자.

Command> fpr
pub 1024D/6B3EE3AE 2000-11-22 HaHaHa (virtual user) <haha [at] myscan [dot] org>
Fingerprint: 33E4 E001 CA79 7068 2963 A38A 5F1F 0019 6B3E E3AE

Fingerprint라고 써진 말 뒤에 나오는 숫자(16진수 숫자들)이 이 공개키의 지문이다. 이 지문을 공개키 주인과 연락하면서(전화 같은 것을 이용하여) 확인을 하면 이 공개키가 그 사람 것이 맞다는 것을 확인 할 수 있다. 이렇게 확인을 했다면, sign명령으로 haha의 공개키에 나의 서명을 할 수 있다.

Command> sign

pub 1024D/6B3EE3AE created: 2000-11-22 expires: never trust: -/q
Fingerprint: 33E4 E001 CA79 7068 2963 A38A 5F1F 0019 6B3E E3AE

HaHaHa (virtual user) <haha [at] myscan [dot] org>

Are you really sure that you want to sign this key
with your key: "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"

Really sign? y

You need a passphrase to unlock the secret key for
user: "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"
1024-bit DSA key, ID 046CE945, created 2000-11-22

아까도 말했듯이 문서에 서명을 할 때는 자신의 비밀키가 있어야 한다고 했다. 비밀키를 사용할 때는 gpg는 항상 패스워드를 묻는다. 이 예제에서 처럼 다른 사람의 공개키에 자신의 서명을 할 때에도 예외는 아니다.

haha의 공개키에 어떤 사람이 서명을 했는지 확인을 하는 명령으로 check이 있다.

Command> check
uid HaHaHa (virtual user) <haha [at] myscan [dot] org>
sig! 6B3EE3AE 2000-11-22 [self-signature]
sig! 046CE945 2000-11-22 Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>

내가 haha의 공개키에 서명을 했도 haha자신이 자신의 공개키에 서명을 했다. 자신의 공캐키를 export(파일로 만들기)할 때에는 자동적으로 gpg가 자신의 서명을 해 준다. 이렇게 내가 서명을 한 haha의 공개키를 내가 다시 export해서 다른 사람에게 줄 수도 있다. 그 때 그 공개키에는 나의 서명이 들어가 있으므로 나를 신뢰하는 사람이 그 공개키를 받았다면 그 사람은 나의 서명을 확인해 보고(이때 물론 나의 공개키가 필요할 것이다.) haha의 공개키를 그냥 믿고 그 사람도 haha의 공개키에 서명을 할 수도 있다.

Encrypting and decrypting documents (문서를 암호와 하고 해독하기)

문서를 특정인에게만 보내고 싶을 경우에 문서를 그 사람의 공개키를 이용해서 암호화 한다. 그리고 그 암호화 된 문서를 그 사람이 받게 되면 그 사람은 자신의 공개키로 암호화 된 문서를 자신의 비밀키로 해독을 할 수 있다. 이것을 하는 방법을 알아 보자.

먼저 문서를 암호화하기 위해서 --encrypt라는 옵션을 사용한다.

[kyusic@thain ~]$ gpg --output file.gpg --encrypt --recipient kyusic file

--recipient옵션에는 받는 사람의 공개키 이름을 적는다. 이렇게 하면 file이라는 파일이 file.gpg라는 파일로 암호화 된다. 그리고 추가로 gpg는 더 확실하게 하기 위해서 암호화 한 것을 압축을 한다.

kyusic의 공개키로 암호화 된 문서는 kyusic의 비밀키만을 이용해서 풀 수 있다.

[kyusic@bilbo ~]$ gpg --output file --decrypt file.gpg

You need a passphrase to unlock the secret key for
user: "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"
1024-bit ELG-E key, ID 68736E83, created 2000-11-22 (main key ID 046CE945)

Enter passphrase:

자신의 비밀키로 문서를 해독할 때에는 꼭 패스워드를 입력해야 한다.

Making and verifying signatures(문서에 서명하고 확인하기)

디지털 문서에 서명을 하면 그 문서에 자신이 서명을 언제 했다는 기록을 남기게 된다. 만약이 서명된 원본 문서에 변형이 가해지면 서명 확인이 되지 않는다. 따라서 그 원본이 변하게 되면 서명이 자동으로 무효화 되는 것이다. 따라서 옛날 조선시대에 공명첩(이름을 비워두고 도장을 미리 찍은 다음에 돈을 내는 사람에게 이름을 써 주고 양반 자리를 줄 때 쓰던 인증서) 같은 것을 만들 수 없을 것이다. 도장을 찍고 난 후 이름을 쓰는 순간 도장이 무효화 되기 때문이다. 그리고 서명이 언제 되었는지를 기록을 해 두므로 변형된 문서가 모두 서명이 유효하다면 최근에 서명된 것을 선택하게 할 수도 있다. 그리고 디지털 문서 서명은 위조가 불가능하므로 전통적인 서명보다 좋은 점이 많다.

서명은 자신의 비밀키를 이용해서 --sign 옵션을 쓴다.

[kyusic@bilbo ~]$ gpg --output file.sig --sign file

You need a passphrase to unlock the secret key for
user: "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"
1024-bit DSA key, ID 046CE945, created 2000-11-22

Enter passphrase:

자신의 비밀키를 사용할 때는 항상 패스워드를 묻는다는 것을 기억하자. 서명된 문서는 서명되기 전에 압축이 된다. (따라서 바이너리 파일이 만들어진다.)

서명이 된 문서를 받으면 그 문서의 서명을 확인하기 위해서 --verify라는 옵션을 쓴다. 확인 뿐 아니라 압축하기 전의 원래 버전을 얻기 위헤서는 --decrypt옵션을 쓴다. 서명을 확인 하기 위해서는 서명한 사람의 공개키를 import해야 한다는 것을 잊지 말자. 그러니까 서명한 사람의 공개키를 구하지 못했다면 확인은 불가능하다.

[kyusic@bilbo ~]$ gpg --verify file.sig
gpg: Signature made Thu Nov 23 02:21:14 2000 KST using DSA key ID 046CE945
gpg: Good signature from "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"
[kyusic@bilbo ~]$ gpg --output file --decrypt file.sig
gpg: Signature made Thu Nov 23 02:21:14 2000 KST using DSA key ID 046CE945
gpg: Good signature from "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"

Clearsigned documents (압축하지 않고 서명만 문서에 붙이기)

위의 예제에서 처럼 문서에 서명을 할 때 압축을 해서 바이너리 파일로 만들게 되면 전자메일을 보낼 때 서명을 하고 싶은 경우 첨부파일로 보내야 하는 어려움이 있다. 그리고 굳이 서명을 확인하고 싶지 않고 문서를 읽어 보고 싶은 경우도 있을 수 있다. 그래서 문서를 변형하지 않고 서명을 문서의 뒤에 붙이는 방법이 있는데 --clearsign이라는 옵션을 쓴다.

[kyusic@bilbo ~]$ gpg --clearsign file

You need a passphrase to unlock the secret key for
user: "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"
1024-bit DSA key, ID 046CE945, created 2000-11-22

file이 원본 문서이다. 이 경우에 --output옵션을 주지 않았으므로 표준 출력으로 결과가 나와야 할 것 같지만 서명할 문서가 원래 바이너리였을 경우 터미널이 망가지게 되므로 --output옵션을 붙이지 않으면 file.asc라는 파일에 결과가 저장된다.

[kyusic@bilbo ~]$ cat file.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I agree with this.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iEYEARECAAYFAjocA1gACgkQ/YXWRARs6UWfHgCfaDgouEjdMt/ki91vgQrK89ey
7moAoLWDwVzBw/4rpwAOT6BqyoKCKzX7
=gE2Z
-----END PGP SIGNATURE-----

BEGIN MESSAGE다음에 나오는 것이 원본 파일의 내용이고, BEGIN PGP다음에 다오는 것이 서명이다. 서명된 문서를 확인 하기 위해서 --verify옵션을 쓰면 된다. (이 경우에 원본 파일의 내용을 읽을 수 있으므로 --decrypt옵션이 쓰일 곳은 없다.) 물론 서명한 사람의 공개키를 import한 상태여야 한다.

[kyusic@bilbo ~]$ gpg --verify file.asc
gpg: Signature made Thu Nov 23 02:33:12 2000 KST using DSA key ID 046CE945
gpg: Good signature from "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"

Detached signatures (따로 만든 파일에 저장된 서명)

아스키 문서 파일에 clearsign을 하는 것은 매우 유용하지만, 바이너리 파일에 서명을 하는 경우에는 그다지 유용하지 않다. 그 때는 원본 파일을 읽어 낼 방법이 없기 때문이다.(물론 좋은 편집기를 사용하여 서명 부분을 없앨 수도 있다.) 그렇지만 맨처음 소개된 파일을 압축하고 서명을 해서 --decrypt옵션을 쓰기도 적당하지 않다. 왜냐하면 서명의 확인에는 관심없고 파일의 내용에 관심이 있는 사람들이 있을 수 있기 때문이다. 이 경우에는 원본 문서에 대한 서명을 담은 파일을 따로 만들 수 있다. 서명에 관심이 있는 사람은 그 서명 파일을 가지고 가면 되고, 관심이 없는 사람들은 원본 파일만 가지고 가면 된다. 이렇게 하기 위해서는 다음과 같은 명령을 쓴다.

[kyusic@bilbo ~]$ gpg --output file.sig --detach-sig file

You need a passphrase to unlock the secret key for
user: "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"
1024-bit DSA key, ID 046CE945, created 2000-11-22

Enter passphrase:

이렇게 하면 file이라는 파일은 변형되지 않고, 그 파일에 대한 서명을 담은 파일인 file.sig가 생기게 된다. 이 파일은 바이너리 파일이다. 물론 텍스트로 된 서명파일을 얻고 싶으면 --armor옵션을 붙여 주면 된다.

[kyusic@bilbo ~]$ gpg --armor --output file.sig --detach-sig file

You need a passphrase to unlock the secret key for
user: "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"
1024-bit DSA key, ID 046CE945, created 2000-11-22

Enter passphrase:

서명 확인은 원본 파일과 서명파일이 모두 있어야 가능하다 (그리고 그 사람의 공개키도..). 다음과 같은 명령을 쓰면 된다.

[kyusic@bilbo ~]$ gpg --verify file.sig file
gpg: Signature made Thu Nov 23 02:44:06 2000 KST using DSA key ID 046CE945
gpg: Good signature from "Choi Kyusic (016-711-4079) <kyusic [at] myscan [dot] org>"

마치면서

문서의 privacy를 도와주는 프로그램인 gpg의 사용법에 대해서 간단히 알아 보았다. 이제 홈페이지를 돌아 다니다가 자신의 pgp 공개키라고 이상한 문자들을 올려 놓은 것을 보고 의아해 하지 않아도 되고, pgp 사인이 되어 있는 security mailing list의 메일을 받고 가짜 메일이 아닌지 확인해 볼 수 있다.(사실 거짓 메일을 통해서 유언비어를 퍼뜨리는 사람도 많다.) 그리고 보안 패키지를 받을 때도 그 패키지가 안전한 것인지 pgp사인을 통해서 알아 낼 수도 있다. MD5 check sum을 이용하기도 하지만 pgp사인만큼 안전하지는 않다. (물론 MD5 check sum이 사인되어 있는 문서 안에 적혀 있었다면 믿을 수 있겠지만) 앞에서 말했듯이 여자친구와 비밀 편지를 주고 받을 때 쓸수도 있다. 응용은 많이 있을 수 있다. 부디 잘 활용하기를..

Reference(참고 문헌)

http://www.gnupg.org/gph/en/manual.html
http://www.pgpi.org/

관련 링크: http://www.gnupg.org

+ Recent posts