전자우편 보안도구 PGP와 WWW인터넷(Internet)이 보편화되어 감에 따라 학술, 연구용의 범위를 벗어나 이제는 기업과 일반 사용자들이 인터넷의 주요한 사용자로써 떠오르고 있다. 인터넷의 사용자들이 그들의 분야에 국한되지 않고 가장 많이 사용하고 있는 인터넷 서비스 중의 하나가 전자우편(Electronic mail)이다. 매년 약 2배씩의 성장률을 보이고 있는 인터넷의 배경에는 사용자들의 전자우편 사용증가가 큰 몫을 차지하고 있다[1]. 이처럼 전자우편은 시간과 공간을 초월하는 자원으로써, 현재 사용범위가 점차 확대되고 있지만, 이제까지의 전자우편은 보안상에 있어 너무나도 취약한 면을 가지고 있다[2]. 어느 사용자가 다른 사용자에게 보낸 전자우편은 목적지에 도달할 때까지 여러 호스트(host)들을 거치게 되며, 전자우편은 봉투에 넣어져서 밀봉되는 일반적 편지와는 달리 보내는 곳의 주소뿐만 아니라 내용까지도 그대로 보이는 엽서와 같은 구조를 가지고 있기 때문에 이런 과정에서 얼마든지 탈취, 변조될 가능성이 있다.
이러한 상황에서 보안을 유지하는 길은 내용을 암호화하여 중간에서 가로챈다 하더라도 다른 사람은 알아 볼 수 없게 만드는 방법이다. 이를 위하여 현재 인터넷에서는 PGP(Pretty Good Privacy)와 PEM(Privacy Enhanced Mail)등이 전자우편의 보안도구로써 사용되고 있다. PGP와 PEM은 보내고자 하는 내용을 암호 알고리즘을 이용하여 암호화함으로서 전자우편을 엽서가 아닌 밀봉된 봉투에 넣어서 보내는 개념이다. 일반우편은 배달도중에 누군가가 몰래 봉투를 뜯어 내용을 바꾼 다음에 다시 봉투를 붙여놓을 수 있지만, PGP나 PEM에서는 특정한 키가 있어야 만이 내용을 볼 수 있도록 되어 있기 때문에 기밀성(Confidentiality), 인증(Authentication), 무결성(Integrity), 부인방지(Nonrepudiation) 등의 기능을 지원한다[3]. 여기서 기밀성이란 메일의 내용을 송,수신자 이외에는 알아볼 수 없도록 하는 것을 말하고, 인증이란 메일을 보낸 송신자가 적법한 송신자임을 확인하는 것을 뜻한다. 메일이 송신도증 불법적인 데이타 변조가 발생할 수 있는데 이를 검사할 수 있는 기능으로 무결성 검사가 있으며, 송신자가 M이라는 메일을 보내고 M'을 보냈다고 주장하거나 아예 M 자체를 보낸적이 없다고 주장할 수 있는데 이 경우에는 부인방지 기법을 사용하여 이러한 문제를 해결할 수 있다[4]. 즉, 전자우편 보안을 위해서는 기밀성, 인증, 무결성, 부인방지 기능들이 구현되어야하며, PGP와 PEM에서는 이와 같은 기능을 제공하고 있다.
PEM은 IETF(Internet Engineering Task Force)에서 인터넷 표준으로 준비중인 것으로 높은 보안성을 가지고 있지만, 구현의 복잡성 등의 이유로 현재 널리 사용되지는 않고 있다. 반면에 PGP는 Phil Zimmermann 이라는 사람이 독자적으로 개발하였고, PEM에 비해 보안성에서는 조금 취약한 면을 보이고 있지만 구현이 쉽고, 키인증 등의 권한을 한 곳에 집중시키지 않고 사용자 스스로가 가진다는 사실 등에 힘입어 현재 널리 사용되고 있다.
정보보호를 위한 대책으로서 여러 형태가 있지만, 가장 경제적이면서도 보안수준에 따라 효율적이고 계층적인 보안대책을 제공할 수 있는 것은 기술적인 측면에서의 암호방식을 이용하는 방법이다. 암호방식이란 보호하려는 정보를 작은 길이의 암호키로 관리하는 것을 말하며 정보보호를 위해서는 암호키를 안전하게 관리해야 한다. 암호방식은 암호키의 분배와 관리방법에 따라 관용 암호방식(Conventional cryptosystem)과 공개키 암호방식(Public key cryptosystem)으로 나눌 수 있다.
암호방식의 기본구성을 보면 <그림 2-1>과 같다. 비밀정보를 전달하려는 송신자는 평문 M을 암호화 알고리즘 E와 암호화 키 Ke를 이용하여 암호문 C를 생성시켜 전달한다. 수신자는 전송된 암호문 C를 수신하여 복호화 알고리즘 D와 복호화 키 Kd를 이용하여 송신자가 보내고자 했던 평문 M을 얻는다. 이때 제삼자가 전송되는 암호문 C를 가로채게 되더라도 복호화 알고리즘 D와 복호화 키 Kd를 알지 못하면 C로부터 M을 얻을 수가 없다. 그러나 제삼자가 평문의 성질을 알고 있으면 암호문 C의 통계적 성질과 그 밖의 부대정보를 이용하여 C에서 M을 얻으려고 시도할 수 있다.[5]

<그림 2-1> 암호방식의 기본 구성
관용 암호방식이란 암호화 키 Ke와 복호화 키 Kd가 서로 같은 경우로 대칭(Symmetric) 암호방식이라고도 한다. 비밀정보를 교환하려면 사전에 비밀키(Secret Key) Ks를 노출되지 않게 나누어 가진 다음, 평문 M을 암호화 알고리즘과 비밀키 Ks를 이용해 암호문 C를 생성시키고, 수신자는 복호화 알고리즘과 비밀키 Ks로 평문 M을 얻는다 (그림 2-2 참조)[6].

<그림 2-2> 관용 암호방식
관용 암호방식에서 암호화 알고리즘 E와 복호화 알고리즘 D는 다음의 세가지 조건을 만족해야 한다.[5]
조건 1 : DK(EK(M))=M 이 임의의 비밀키 K에 대해서 항상 성립해야 한다. 조건 2 : 알고리즘 E, D가 임의의 입력에 대해서도 출력을 계산하는 계산량이 적어야 한다. 조건 3 : 알고리즘 E, D가 공개되어도 비밀키 K를 제삼자가 추측하여 생성하는 것이 매우 어려워야 한다.
조건 1, 2를 만족하는 알고리즘 E, D를 관용 암호방식이라 하고, 부대정보(Side Information)에 대해서 E, D가 조건 3을 만족할 때만이 부대정보에 대하여 안전하다고 한다. 알고리즘 E, D로 구성되는 관용 암호방식이 모든 부대정보에 대하여 안전하다면 알고리즘 E, D를 비밀로 할 필요가 없으므로, 알고리즘을 공개할 수 있어서 대량 생산을 통한 제작비용의 감소나 공동시스템의 이용을 기대할 수 있다. 물론, E, D를 비밀로 하는 것이 안전하지만 다수의 사용자가 보다 편리하고 저렴하게 암호시스템을 구축하기 위해서는 알고리즘의 공개를 불가피하다고 보고 있다. 공개된 E, D의 안전성은 오로지 암호키를 바꾸어 사용함으로써 보장받기 때문에 암호키의 생성, 보관 및 분배에 신중을 기해야 한다. 가입자가 n명일 때 서로 교환해야 할 비밀키의 수가 nC2 = n(n-1)/2로 가입자의 증가에 따라 키의 수가 급증하며 키분배가 문제가 되므로 적절한 암호키 분배방식이 필요하다. 이러한 방식을 사용하는 알고리즘으로는 Lucifer, DES, FEAL, IDEA 등이 있다.
2.2 공개키 암호방식 공개키 암호방식의 대표적인 것으로는 소인수 분해의 어려움을 이용한 RSA방식이 있으며, 관용 암호방식의 단점인 키분배의 문제를 해결한 방법으로 관용방식과 다르게 두개의 키를 사용하고 있다. 기본적인 구조는 <그림 2-3>과 같다[6].

<그림 2-3> 공개키 암호방식의 기본 구조
암호화 키와 복호화 키를 분배하는 암호화 키는 모두에게 공개하고 복호화 키는 각자가 비밀리에 보관하므로 암호화 키는 공개키라 하고 복호화 키는 비밀키라고 한다. 송신자는 수신자의 공개키로 평문 M을 암호화하여 암호문 C를 전송하면 수신자는 자신이 비밀리에 보관하던 비밀키로 평문 M을 복원한다. 즉, 메세지의 기밀성(Confidentiality)을 위해서는 수신자의 공개키로 암호화한다. 수신자의 공개키로암호화된 메세지는 수신자의 비밀키를 사용해야 복호화할 수 있다. 그러므로 수신자가 아닌 다른 사람은 메세지의 내용을 알아 볼 수 없게 된다.[5]
메세지의 전자서명(Digital Signature)을 주기 위해선 송신자의 비밀키로 암호화한다. 암호화된 결과는 송신자가 아닌 다른 사용자는 비밀키를 모르기 때문에 만들수 없는 암호문이 된다. 그러나 송신자의 공개키를 가지고 있는 사람들은 복호화를 할 수 있어서 메세지의 기밀성은 기대할 수 없지만 송신자가 보냈다는 증거가 될 수 있어 메세지의 전자서명을 가능하게 한다. 예전의 종이 서류에 의한 문서교환이 컴퓨터 통신망을 통한 교환방식으로 대체되면서 정보의 전달과정에서 상대방의 신분확인, 메세지의 무결성 보장, 사용자의 정당성 및 송수신자간의 분쟁 조정 등이 필요하게 됐다. 전자문서 교환상에서 이러한 기능을 전자적으로 구현하는 것이 전자서명이다. 기밀성, 전자서명 등을 모두 이용하려면 먼저 송신자의 비밀키로 암호화한 다음, 다시 수신자의 공개키로 암호화한다. 수신자는 수신자의 비밀키로 복호화하고, 송신자의 공개키로 다시 복호화한다.
가입자는 공개키와 비밀키 두개가 필요하게 되므로 전체 가입자가 n명일 때 필요한 키의 수는 2n이고 실제로 비밀리에 보관해야 하는 비밀키의 수는 n개이므로 관용 암호방식보다 보관해야 할 키의 수가 적고 또한 공개키를 공개하므로 키분배가 필요 없어 키 관리가 용이하다. 그러나 단점으로는 공개키 암호방식이 관용 암호방식보다 암호화/복호화하는데 시간이 많이 소요된다는 점이다. 이러한 이유로 메세지 기밀성을 위한 암호화는 관용방식으로하고, 전자서명과 관용방식에 사용된 비밀키 분배를 위해서는 해쉬함수(Hash Function)를 이용한 공개키방식을 사용하는 것이 요즘의 추세이다.
해쉬함수는 임의의 길이를 가지고 있는 메세지를 입력으로 받아 일정한 길이의 결과로 전환해주는 함수이다. 원래의 메세지 X를 해쉬함수 f를 사용하여 나온 결과를 x라 하는 경우를 식으로 나타내면 f(X) = x 라고 할 때, 안전한 해쉬함수가 되기 위해서는 다음의 조건을 만족해야 한다[7].
조건 1 : 임의의 길이의 메세지를 입력으로 받을 수 있어야 한다. 조건 2 : 고정된 길이의 출력을 만들어야 한다. 조건 3 : 모든 X에 대해서, f(X)의 계산이 쉬워야 한다. 조건 4 : 주어진 x에 대해서 원래의 X를 구할 수 없어야 한다. 조건 5 : X, Y가 같지 않을 때, f(X), f(Y)는 같을 수 없다. 조건 6 : f(X) = f(Y)인 X, Y를 구하기가 어려워야 한다.
전자서명은 메세지를 송신자의 비밀키로 암호화함으로써 이루어지는 데 공개키 암호방식은 처음 시간이 많이 소요된다는 단점이 있어, 일단 메세지를 해쉬함수를 이용하여 원래보다 짧은 길이로 바꾸어 놓은 다음에 전자서명을 생성한다(보다 자세한 설명은 다음 장을 참조). 해쉬함수의 종류로는 128-bit의 출력을 생성하는 MD4, MD5와 160-bit 출력의 SHA(Secure Hash Algorithm)등이 있다.
PGP에서는 관용 암호방식으로는 IDEA(Internatinal Data Encryption Algorithm)를 사용하는데 IDEA는 128-bit의 키가 필요하다. 공개키 암호방식으로는 RSA(Rivest Shamir Adleman)를, 해쉬함수로는 MD5를 사용한다. 다음은 앞으로 설명에 필요한 약자이다.
M : 평문
Z : 압축 알고리즘
Ks : IDEA에 사용되는 키
H : 해쉬알고리즘
ER: 공개키 암호화
EI : 관용암호화
DR: 공개키 복호화
DI: 관용복호화
KR : 비밀키
KU: 공개키
메세지의 기밀성을 위해서는 RSA와 IDEA가 함께 쓰인다. IDEA에 사용될 키를 생성하여 이를 이용하여 메세지를 암호화시킨 후 사용된 키는 수신자의 공개키로 암호화하여 함께 보낸다. 수신자쪽에서는 자신의 비밀키를 이용하여 IDEA 키를 알아낸 후 다시 메세지를 복호화한다. <그림 3-1>에서는 이 과정을 보여주고 있다[7]. Z는 압축 알고리즘을 나타낸다.

<그림 3-1> 기밀성을 위한 구조
인증과 전자서명을 위해서는 RSA와 해쉬함수 MD5가 사용되고 있다. 메세지를 해쉬함수의 입력으로 넣어 128-bit으로 표현한 다음, 이를 송신자의 비밀키로 암호화 한다. 암호화된 부분을 원래의 메세지에 붙여서 보낸다. 수신자는 송신자의 공개키로 전자서명 부분을 복호화한 부분과 원래의 메세지를 다시 해쉬함수에 적용하여 얻은 부분을 서로 비교한다. 서로 동일하지 않을 경우에는 메세지에 대한 신뢰성이 없는 경우로 간주된다. 기본적인 구조는 <그림 3-2>와 같다[7].

<그림 3-2> 인증을 위한 구조
기밀성과 인증을 모두 보장하려면 먼저 인증을 위한 동작을 수행하고 그 결과에 기밀성을 위한 동작을 해주면 된다[7] (그림 3-3 참조).

<그림 3-3> 기밀성과 인증을 위한 구조
메세지의 압축을 위해서는 ZIP 알고리즘을 사용한다[7]. 압축 알고리즘을 사용하느냐 안하느냐 하는 것은 PGP를 사용할 때 config file에서 사용자가 지정해 줄 수 있다. 압축을 할 때에는 암호화를 하기 전에 함으로써 암호화된 결과를 가지고 평문을 추측하는 행동을 더욱 어렵게 한다.
PGP를 사용해 생성된 모든 화일들은 연속적인 8-bit의 흐름으로 이루어지지만 대개의 전자우편 시스템은 ASCII 문자만을 인식한다. PGP에서는 Radix-64 conversion을 통하여 세개의 8-bit를 4개의 ASCII 문자로 변환시켜 기존의 전자우편 시스템과의 호환성 문제를 해결하고 있다[7]. 호환성을 유지하기 위하여 메세지가 약 33%정도 크기가 커지지만 압축률이 50%인 ZIP을 사용할 경우, 메세지가 결과적으로는 약 66%정도로 줄어들게 된다.
전자우편 프로그램은 대개 50,000 byte이하의 메세지를 한번에 보낼 수 있다. 그보다 큰 메세지는 작게 나누어 보내게 되는데 PGP에서는 이러한 동작을 자동으로 행해주고 있다. 또한 분할되어 수신된 메세지를 자동으로 재결합시켜주기 때문에 사용자는 메세지 크기에 상관없이 PGP를 사용할 수 있다.
UNIX에서 PGP를 사용하는 명령어는 "pgp" 단 한가지다. 이 하나의 명령어에 하고자 하는 기능에 맞는 옵션을 주어서 사용한다.
%> pgp -c textfile
문서를 암호화해서 다른 곳으로 보내지 않고 자신의 컴퓨터에 보관할 때 사용하려면 옵션으로 "-c"를 사용한다. 사용자는 암호화에 필요한 키값을 만들기 위해 passphrase를 입력해야 한다. 암호화된 화일은 원래의 화일이름에 ".pgp"나 ".asc" 확장자가 붙는다.
%> pgp -cw textfile
"-c" 옵션을 사용하여 평문을 암호화한다 하더라도 평문이 남아 있으면 보안상의 취약점이 될 수 있다. 암호문을 만든 다음 평문을 지운다고 하더라도 복구가 가능하기 때문에 평문과 암호문의 쌍을 노출시킬 수가 있다. "-w" 옵션은 암호화를 한 다음 평문에 랜덤비트를 덮어 씌운 다음 디렉토리에서 지워 버린다.
%> pgp textfile.asc
PGP에서는 어떠한 형태로든지 암호화된 문서를 복호화할 때에는 "pgp" 명령 뒤에 아무런 옵션없이 암호문의 이름을 써준다. 만약 복호화 과정에서 passphrase가 필요할 때는 PGP는 passphrase를 입력하라는 메세지와 함께 입력을 기다린다.
%> pgp -kg
다른 사람들과 PGP를 이용하여 전자우편을 사용하려면 자신의 키가 필요하게 된다. 자신의 키를 새로이 만들 때는 "-kg" 옵션을 사용한다. 몇가지의 입력이 필요한 데 순서와 내용은 다음과 같다.
키의 크기를 결정 : 512bits, 768bits, 1024bits의 세가지 크기가 보여지는 데 크기가 클 수록 생성시간은 오래 걸리지만 사용하기에 안전하다. 사용자가 3종류의 크기 이외에 특정한 크기의 키가 필요하면 직접 크기를 입력해도 된다.(2.6.2i에서는 2048bit까지 가능하다.)
User ID를 입력 : User ID로 사용되기 위한 특별한 형식은 없지만 통상적으로 사용자의 real name 뒤에 전자우편 주소를 붙여준다. 예> Hyun_Dong Park <hdpark@esperosun.chungnam.ac.kr>
Passpharse를 입력 : 비밀키를 secring.pgp에 보관할 때 암호화에 필요한 키값을 입력받는 부분이다. 나중에 이 비밀키를 사용하려면 여기서 입력하는 passphrase를 정확히 입력해 주어야 하므로 확인을 위해서 두번 입력하게 한다.
Random data를 입력 : 공개/비밀키와 IDEA키의 생성에 필요한 seed값을 얻는 과정이다. 임의의 숫자가 보여지는 데 사용자가 키보드를 칠 때마다 줄어 들어서 0이 되면 끝나게 된다. 사용자가 타이핑하는 키보드의 값과 시각이 이용되어 seed값을 생성한다.
이러한 과정들을 지나게 되면 한 쌍의 키가 생성되어 "secring.pgp"와 "pubring.pgp"에 저장된다.
%> pgp -kg Pick your RSA key size:
1) 512 bits- Low commercial grade, fast but less secure
2) 768 bits- High commercial grade, medium speed, good security
3) 1024 bits- "Military" grade, slow, highest security
Choose 1, 2, or 3, or enter desired number of bits: 3
You need a user ID for your public key. The desired form for this user ID is your name, followed by your E-mail address enclosed in <angle brackets>, if you have an E-mail address. For example: John Q. Smith <12345.6789@compuserve.com>
Enter a user ID for your public key: Hyun_Dong Park <hdpark@esperosun.chungnam.ac.kr>
You need a pass phrase to protect your RSA secret key. Your pass phrase can be any sentence or phrase and may have many words, spaces, punctuation, or any other printable characters. Enter pass phrase: /* 화면에 안 보입니다. */ Enter same pass phrase again: /* 역시 안 보입니다. */
We need to generate 624 random bits. This is done by measuring the time intervals between your key strokes. Please enter some random text on your keyboard until you hear the beep: 624 . /* 아무 키나 마구 치세요...*/ 0 * -Enough, thank you. Note that key generation is VERY lengthy process. ............++++++........................+++++................+++++++ Key generation completed. /* 키 생성 끝. */ %>
PGP 키에 관련한 도움이 필요하면 "pgp -k"를 입력하면 도움말을 볼 수 있다.
%> pgp -kv
자신의 키 화일에 어떠한 키들이 있는 가를 보기 위해선 "kv" 옵션을 사용한다. 공개키를 볼 때는 위의 예와 같이 하면 되지만 비밀키를 보기 위해선 옵션 뒤에 secring.pgp 화일의 path를 써 주어야 한다. "-kv" 옵션을 사용했을 때 보여지는 필드들의 의미는 다음과 같다.
Type : 공개키인가 비밀키인가를 보여준다. sec면 비밀키를 나타내고, pub이면 공개키를 나타낸다.
Bits : 키의 크기를 나타낸다.
Key ID : 키를 264로 mod한 결과로 키의 확인에 이용된다.
Date : 키가 생성된 날짜가 입력된다.
User ID : 키 주인의 ID가 들어간다.PGP에서 키를 고를 때 인덱스로 사용된다.
%> pgp -kv Type bits/KeyID Date UserID pub 1024/903C9265 1995/07/15 Hyun Dong_Park <esperosun.chungnam.ac.kr>
%> pgp -ke
하나의 키에 붙어 있는 User ID, Passphrase 등을 키 속성이라 하는데 이러한 내용을 변경시킬 수 있다. 사용자 자신의 공개키에 대해서 할 때는 Passphrase나 User ID를 변경시킬 수 있고, 다른 사람의 공개키에 대해서는 Owner_trust를 변경시킬 수 있다. User ID를 바꾸어야 하는 이유는 전자우편주소가 변경되었거나 처음 키를 생성할 때 잘못 입력했을 경우이다. Passphrase를 바꾸어야 할 때는 누군가에게 자신의 passpharse가 노출되었다는 의심이 들 때이다.
하나의 키에 여러 개의 User ID를 사용할 수가 있다. 한 사람이 여러 컴퓨터에 계정을 가지고 있을 때에 유용한 데, 여러 개의 User ID들 중에서 하나를 지우고 싶을 때는 "-kr" 옵션을 사용한다. "-kr" 옵션은 원래 키를 지울 때 사용하는 옵션이지만 여러 개의 User ID를 가지고 있는 키일 때는 키는 놔두고 User ID만을 삭제할 때 쓰인다.
%> pgp -kx UserID filename
자신의 키를 다른 사람들에게 전파시키는 방법으로 키 화일 전체를 복사해서 옮기는 방법도 있지만 이 방법은 여러 종류의 위험이 뒤따른다. 그러므로 자신이 보내고자 하는 키만을 빼내어서 보내어야 한다. 이럴 때 쓰는 옵션이 "-kx" 옵션이다. 옵션 뒤에 나오는 것은 빼낼려고 하는 키의 User ID와 키를 복사해서 담을 화일의 이름이다.
키를 담고 있는 화일을 얻었으면 이 화일을 메일 프로그램을 통해 목적지로 보내야 한다. 이러한 과정을 하나의 코맨드 라인에서 행할 수 있다. "-f" 옵션을 사용한다.
%> pgp -kxaf HD_PARK | mail kskim@esperosun.chungnam.ac.kr
위와 같이 하면 키가 임시화일로 옮겨져서 파이프를 통해 전자우편의 입력으로 들어간다. "a" 옵션은 Radix 64 conversion을 하는 것이다.
하나의 화일에 여러 개의 키를 담아 보내야 하는 경우가 있다. 이런 경우 위의 방법대로 하나의 화일에 User ID만을 바꾸어 가면서 계속 실행시키면 되지만 빼내야 할 키의 수가 늘어나면 번거로운 작업이 된다. 다음과 같은 script를 작성하면 한번에 여러 사람의 키를 빼낼 수가 있다.
%> foreach i (HD_PARK Kisu Taegap) ?pgp -kx $i rkeys.pgp ?end %> pgp -a rkeys.pgp
%> pgp -ka key_filename
누군가가 당신에게 키를 보냈을 경우이다. 키를 받았으면 자신의 키 화일에 올려 놓아야 하는 데 이때 쓰는 옵션이 "-ka" 옵션이다. 이 명령을 실행하면 들어있는 키에 대한 정보가 나오고 이 키에 직접 signature를 붙일 것이냐고 물어 보는데 yes를 하면 사용자의 signature를 붙이게 되고 no를 하면 그대로 키만 옮겨 놓게 된다.
%> pgp -kr
사용자 자신의 공개키 화일에 있는 자신의 키나 다른 사람의 키를 지울 때 쓰는 옵션이 "-kr" 옵션이다. 자신의 키일 경우에는 매칭되는 비밀키도 지울 수 있다.
%> pgp -ea message receiver's UserID
메일을 암호화해서 송신하려면 몇 단계의 과정을 거쳐야 한다.
① 에디터를 이용하여 화일을 만든다.
② 수신자의 공개키를 찾는다.
③ IDEA 키를 생성하여 화일을 암호화한다. (PGP가 자동으로 하기 때문에 사용자는 이 단계를 보지 못한다.) 사용된 IDEA 키를 수신자의 공개키로 암호화한다.
⑤ 메일 프로그램으로 송신한다.
수신자의 공개키로 암호화할 때에는 먼저 자신의 키 화일에 수신자의 공개키가 들어 있는 가를 "-kv" 옵션으로 확인하고 평문의 이름 뒤에 수신자의 공개키의 User ID를 써준다. 이렇게 하면 평문이 IDEA 알고리즘으로 암호화되고 IDEA 키는 수신자의 공개키로 암호화되어 함께 보내진다. 그러므로 일단 수신자의 공개키로 암호화된 문서는 암호화를 시킨 사용자도 복호화를 할 수가 없다. IDEA 키가 생성되는 과정은 사용자에게 보여지지 않는다.
%> pgp -ea plain Phil
Recipient's public key(s) will be used to encrypt. Key for user ID: Phil <phil@pgp.com>
512-bit key, Key ID 43744F09, created 1994/07/07
WARNING: Because this public key is not certified with a trusted /* 완전히 인증된 키가
signature, it is not known with high confidence that this public key 아닐 경우 나오는
actually belongs to: "Phil <phil@pgp.com>". 경고 메세지 */
Are you sure you want to use this public key (y/N)? y .
Transport armor file name: plain.asc
%>
만약 코맨드 라인에서 Phil 이라는 User ID를 명시해 놓지 않으면 사용자에게 User ID를 묻는 단계가 첨가된다.
위와 같은 방법은 여러 단계를 거치지만 앞에서 키를 빼낼 때처럼 하나의 코맨드 라인에서 문서작성, 암호화, 메일전송을 동시에 실행시키는 방법이 있다.
%> pgp -eaf Kisu | mail kskim@esperosun.chungnam.ac.kr Kisu! Hi! Bye! ^D %>
위와 같은 방법으로 하면 하나의 코맨드 라인에서 모든 게 이루어지고 사용자가 입력한 내용이 따로 화일에 저장되지 않으므로 평문이 남지 않아 더욱 보안성이 좋다.
%> pgp cipher.asc
암호화된 메일을 받았으면 화일로 저장시키고 옵션없이 pgp 명령 뒤에 화일의 이름을 써준다. 수신자의 공개키로 암호화되어 있기 때문에 복호화하는 데에는 수신자의 비밀키가 필요하므로 passphrase를 물어 본다. 수신자가 passphrase를 맞게 입력하면 암호화에 사용됐던 IDEA 키를 복호화하여 화일을 복호화한다. 복호화된 화일의 이름은 암호문 화일의 이름에서 .pgp나 .asc가 생략되어 있는 형태이다.
%> pgp cipher.asc File is encrypted. Secret key is required to read it.
Key for user ID: Hyun Dong_Park <hdpark@esperosun.chungnam.ac.kr> /*수신자의 공개키*/
1024-bit key, Key ID 903C9265, created 1995/07/15
You need a pass phrase to unlock your RSA secret key.
Enter pass phrase: .Pass phrase is good.
Just a moment..../*수신자의 비밀키를 쓰기 위해서*/
Plaintext filename: cipher
%>
%> pgp -m cipher.asc
암호문을 옵션 없이 복호화하면 복호화된 평문 화일이 생기는 데 이는 평문과 암호문의 한쌍을 만드는 것이기 때문에 사용자의 유의가 필요하다. 이러한 문제점을 해결하기 위해서 "-m" 옵션을 사용하는 데 이렇게 하면 복호화된 내용이 화면에 보여질 뿐이고 다 보고 난 후에 하드 디스크에 담을 것인지를 물어 본다. 여기서 no를 입력하면 복호화 된 내용은 디스크에 담겨지지 않는다.
%> pgp -ea textfile receiver1 receiver2
위와 같은 형식으로 실행하면 메세지의 암호화는 한번만 이루어지고 IDEA 키는 receiver1과 receiver2 두 사람의 공개키로 각각 암호화되어 메세지 위에 첨가된다. 수신자의 공개키로 암호화를 하면 송신자도 복호화를 할 수가 없다고 했는데 위와 같은 형식으로 수신자의 리스트에 송신자의 User ID를 포함시키면 송신자도 복호화를 할 수가 있다.
%> pgp -s textfile
문서에 signature를 달게 되면 수신자가 문서를 받아 보고 전송 도중에 불법적인 변경이 일어 났는지 확인할 수 있고 또한 송신자를 인증할 수도 있다. 또한, signature를 보관하였다가 송신자가 전송한 사실 혹은 내용자체를 부인할 경우 증거자료로 사용할 수 있다. 문서에 signature를 붙이는 단계는 다음과 같다.
① 문서를 MD5를 이용해 128-bit의 길이로 바꾼다.
② 128-bit를 송신자의 비밀키를 이용해 암호화하는데 이것이 전자서명이다.
③ 전자서명 부분을 원래의 평문에 붙인다.
%> pgp -s textfile
A Secret key is required to make a signature.
You specified no user ID to select your secret key, /*사용할 키를 지정해 주지 않을 경우
so the default user ID and key will be the most recently 에는 가장 늦게 만들어진 비밀키를
added key on your secret key ring. 사용한다. */
You need a pass phrase to unlock your RSA secret key.
Key for user ID "Hyun Dong_Park <hdpark@esperosun.chungnam.ac.kr>"
Enter pass phrase: .Pass phrase is good.
Key for user ID: Hyun Dong_Park <hdpark@esperosun.chungnam.ac.kr>
1024-bit key, Key ID 903C9265, created 1995/07/15
Just a moment....
Clear signature file: textfile.asc
%>
"-s" 옵션을 사용하면 송신자의 비밀키가 필요하기 때문에 passphrase를 입력해야 한다. 실행이 끝나면 원래의 화일 이름에 .pgp 확장자가 붙은 이름으로 암호문 화일이 생긴다.
수신자쪽에서 행하는 동작의 단계는 다음과 같다.
① 송신자의 비밀키로 암호화되어 있기 때문에 송신자의 공개키로 복호화 한다. (복호화의 결과는 송신자가 만들었던 128-bit의 내용이다.)
② 같이 전송된 원래의 메세지의 MD5 결과를 만든다.
③ 두개의 128-bit의 내용을 비교한다. 일치하면 전송도중 아무런 변경이 일어나지 않았다는 것과 송신자가 확실하다는 것을 인증할 수 있다.
%> pgp textfile.asc
File has signature. Public key is required to check signature.
Good signature from user "Hyun Dong_Park <hdpark@esperosun.chungnam.ac.kr>".
Signature made 1995/08/12 13:34 GMT
Plaintext filename: text
%>
"-s" 옵션을 사용한 문서를 복호화하는 데에는 송신자의 공개키가 쓰이므로 수신자가 송신자의 공개키를 가지고 있지 않으면 PGP가 signature를 확인해 줄 수 없다.
%> pgp -s textfile -u Jeff
사용자가 여러 개의 비밀키를 가지고 있다면 암호화에 어느 비밀키를 사용할 것인가를 지정해 줄 수 있다. 비밀키를 하나만 가지고 있다면 문제가 없지만 여러 개가 있다면 가장 늦게 만들어진 비밀키가 사용된다. 어느 특정한 비밀키를 사용하도록 해주는 것이 "-u" 옵션이다. "-u" 옵션 뒤에 쓰여지는 User ID를 갖는 비밀키가 암호화에 사용된다.
%> pgp -se textfile
전자서명만을 붙이는 것은 전자서명에 사용된 비밀키에 매칭하는 공개키를 가진 사람은 복호화를 할 수 있기 때문에 기밀성을 보장해 줄 수가 없다. 그러므로 전자서명을 붙인 메세지를 IDEA 알고리즘으로 다시 암호화한다. 사용된 IDEA 키는 수신자의 공개키로 암호화된다. "-s" 옵션과 "-e" 옵션을 함께 사용하면 먼저 전자서명을 붙이고 다시 암호화한다. 송신자의 비밀키와 수신자의 공개키가 모두 쓰이기 때문에 사용되는 비밀키의 passphrase와 공개키의 User ID를 지정해 주어야 한다.
%> pgp -sea textfile freedom
A secret key is required to make a signature.
You need a pass phrase to unlock your RSA sceret key.
Key for user ID "Hyun Dong_Park <hdpark@esperosun.chungnam.ac.kr>".
Enter pass phrase: . Pass phrase is good.
Key for user ID: Hyun Dong_Park <hdpark@esperosun.chungnam.ac.kr>
1024-bit key, Key ID 903C9265, created 1995/07/15
Just a moment.....
Recipient's public key(s) will be used to encrypt.
Key for user ID: Freedom Fighter <ff@freedom.net>
1024-bit key, Key ID FB704769, created 1994/08/26 .
Transport armor file: textfile.asc
%>
%>pgp -sb textfile
앞에서 설명한 전자서명을 만드는 것과 모든 것은 같지만 앞에서 말한 것과 틀린 것은 전자서명 부분이 원래의 메세지와 분리되어 생성된다는 것이다. 만약 두 사용자가 크기가 큰 동일한 문서를 가지고 있고 두 문서의 동일함을 확인하려 할 때 전자서명을 첨가한 문서를 다시 전송하지 않고 전자서명 부분만을 전송하여 수행할 수 있기 때문에 시간을 줄일 수 있다.
인터넷은 정보화 시대라는 사회조류와 맞물려 현재 급격한 성장을 계속하며 이미 일반인들의 생활에까지 영향을 미치고 있다. 정보화 시대에서 기대할 수 있는 정보의 공유는 자칫 정보의 탈취와 변조로 변질될 수 있다. 인터넷의 가장 인기있는 서비스인 전자우편은 개인의 문서교환뿐만 아니라 상품구매와 공공기관에서의 서류결재 등에 사용될 것으로 보이나, 보안이 보장되어 있지 않은 전자우편을 이용하는 것은 무척 위험한 일이다. 지난번 뉴질랜드 한국대사관 문서위조사건이 하나의 예라 할 수 있겠다. 이에 따라 PGP와 같은 보안도구를 이용한 전자우편 사용에 대한 관심이 고조되고 있다.
PGP는 현재 인터넷에서 가장 많이 이용되는 전자우편 보안도구로써 문서의 기밀성을 보장해 주면서 불법적 변경여부와 송신자의 신원확인, 그리고 송신자가 문서를 보낸 사실을 부인하지 못하게 하는 기능들을 제공해 주고 있기 때문에 전자우편 사용에 있어 중요한 역할을 수행하고 있다. 그러나 국내에서는 아직 초기 단계이나 차츰 사용자가 증가하고 있는 추세이다. 앞으로 일반 사용자들이 암호화/복호화의 복잡한 구조를 모르더라도 손쉽게 사용할 수 있도록 GUI(Graphic User Interface)의 구현과 한글화가 이루어지면 그 사용이 급격히 증가하리라 예상되고 있다.
[1] Simson Garfinkel, "PGP:Pretty Good Privacy", O'Reilly & Associations, Inc., 1995
[2] William Stallings, "The PGP User's Guide", Prentice-Hall,Inc., 1995
[3] Bruce Schneier, "E-mail Security", John Wiley & Sons,Inc., 1995
[4] 류재철,송우길, "전자우편 보안(PEM,PGP)", Netsec-KR'95, 1995
[5] 한국전자통신연구소, "현대암호학", 1991
[6] Bruce Schneier, "Applied Cryptography", John Wiley & Sons,Inc., 1994
[7] William Stallings, "Network and Internetwork Security", Prentice-Hall, 1995