2. 개념

2.1. 공개키 암호화

암호화 하는데 있어 고전적인 방법은 단 하나의 키만을 사용한다. 보내는 사람(송신자)은 이 키를 이용하여 메시지를 암호화한다. 암호화한 메시지를 풀기(복호화 혹은 평문화) 위해서 받는 사람(수신자)은 보낸 사람이 사용했던 것과 똑같은 키를 가지고 있을 필요가 있다. 이 키를 받는 사람에게 어떤 방법을 이용하여 전달하여야 하는데, 그것은 다른 사람들에게 이 키를 얻을 기회를 주지 않는 것이다. 만약 어떤 다른 사람이 이 키를 갖게 된다면, 이 암호화 방법은 쓸모없는 것이다.

소위 공개키(public key)라는 것을 이용하면 이러한 문제를 해결할 수 있다. 공개키는 두 개의 키가 관여하는 개념이다. 키 한개는 공개키로 모든 부류의 매체를 통해 유포할 수 있고 어느 누구든 가질 수 있다. 나머지 키 한개는 비밀키(private key)이다. 이 키는 비밀스러운 것으로 유포해서는 안된다. 이 비밀키는 오로지 키의 주인(소유자)만이 사용할 수 있다. 구현이 잘된 시스템인 경우 비밀키는 공개키를 이용해 추측할 수 없다. 이제 보내는 사람이 받는 사람의 공개키를 이용해 메시지를 암호화하여 보낼 것이다. 그런 후에 받는 사람은 자신의 비밀키를 이용하여 암호화된 메시지를 풀어보게 되는 것이다.

이러한 개념에서 중요한 것은 비밀키는 철저히 비밀을 지켜야하고(보안기밀을 유지해야 하고) 비밀키의 주인을 제외하곤 타인에게 주거나 남들이 입수하도록 하면 안된다는 것이다. 여러분은 여러분의 비밀키를 인터넷을 통해 전송해서는 안된다. 또한 텔넷(telnet)을 통해 GnuPG를 사용하는 것은 대단히 현명하지 않은 행동이다. (여러분은 보안상 위험성이 높은 텔넷을 이용하는 것을 절대 쓰지 않는 것을 고려해 봄직하다)

2.2. 디지틀 서명

메시지가 정말로 틀림없이 보낸 그 사람이 보낸 것인가를 보여주기 위해서 디지틀 서명이라는 개념이 나왔다. 말 그대로 보내는 사람이 메시지를 디지틀을 이용하여 서명하는 것이다. 이 서명을 이용하므로서 여러분은 메시지의 신빙성(authenticity)를 점검할 수 있다. 이를 이용하므로써 트로이 목마(어떤 문제를 고칠 수 있다고 하지만 실제로는 바이러스나 여러분의 컴퓨터에 있는 데이터에 나쁜 짓거리를 하는 메시지)에 대한 위험을 줄일 수 있다. 또한 정보 혹은 데이터를 보낸 곳이 진짜 출처인지를 확인할 수 있어서 그 진위를 구별할 수 있다.

디지틀 서명은 특정인의 비밀키와 사용한 텍스트를 조합하여 만든다. 보낸 사람의 공개키를 이용하면 메시지를 확인할 수 있다. 보낸 사람이 맞는지 만을 점검하는 것이 아니고 보낸 내용까지도 점검한다. 그러므로 여러분은 보낸 사람으로부터 그 메시지가 왔고 전송 도중에 메시지의 내용이 변하지 않았음을 아는 것이다.

2.3. 신용 웹

공개키 알고리즘의 취약점은 공개키를 유포하는데 있다. 어떤 사용자가 널리 알려진 사용자 신분을 위장하여 공개키를 가져갈 수 있다. 만약 이 특정한 키를 이용하여 메시지를 암호화하는 경우, 침입자는 메시지를 풀어서 읽을 수 있다. 만약 침입자가 이를 손에 넣게 되면 여전히 실제 받는 사람에게 진짜 공개키로 암호화하므로, 이러한 공격에 대해선 알아차릴 수 없다.

PGP 솔루션(그리고 자동적으로 GnuPG 솔루션이기 때문에)은 서명하는 코드에 존재한다. 공개키는 다른 사람이 서명할 수 있다. 이 서명은 UID(User IDentification의 약자, 사용자 신분)를 이용한 키가 실제로 그 사람이라고 주장하는 사람의 것인지를 알려준다. 그런 다음에 나머지는 GnuPG를 사용자가 그 서명을 얼마나 믿는가에 달려 있다. 여러분은 여러분이 키를 보낸 사람을 믿을때 키가 신뢰하고 그 키가 실제로 그 사람 것이라는 것도 확실히 안다. 오로지 여러분이 서명한 사람의 키를 신뢰할 때만, 여러분은 그 서명을 신뢰할 수 있다. 확실하게 그 키가 맞는 것임을 확신하려면 여러분은 절대적인 신뢰를 주기 전에 믿을 수 있는 채널을 통해 지문(finger print)이 같은지 비교해 봐야만 한다.

2.4. 보안에 대한 경계선

만약 여러분이 비밀로 하고픈 데이터를 가지고 있다면, 단지 어떤 인코딩 알고리즘을 쓸 것인지를 결정하는 것만이 전부가 아니다. 여러분의 시스템 보안에 대해 일반적으로 생각해야만 한다. 기본적으로 우리는 PGP는 안전하다고 생각하고 이 문서를 작성하고 있는 지금 필자가 아는 PGP 크랙 사고는 없다. 하지만 이러한 사실이 모든 인코딩 방법이 안전한 것이라는 것을 의미하진 않는다. (예를 들어 안기부가 어찌어찌 해서 PGP를 크랙한 경우 필자에게 이를 알리지 않을 것이고, 정말 악의적인 이유로 크랙을 한 사람 역시 그럴것이다). 하지만, 설사 PGP가 완벽하게 '해킹할 수 없는' 것이라 할지라도 안전을 위협하는 다른 방법을 쓸 수도 있다. 1999년 2월초 하드디스크 상에서 비밀 PGP키를 찾아서 찾은 키를 FTP로 전송하는 트로이 목마가 발견됐다. 만약 좋지 않은 암호를 선택한 경우라면 비밀키는 쉽게 크랙당할 수 있다.

또 다른 기술적인 가능성(비록 더 어렵긴 하지만)은 키보드 입력내용을 전파하는 트로이 목마다. 또한 화면의 내용까지 보낼 가능성(하지만 매우 어려운 일이다)도 있다. 이런 방법을 이용하면 스크램블된 메시지를 크래킹할 필요가 없다. 이러한 모든 위험에 대비하여 실제로 운영할 훌륭하고 깊이 생각한 보안 계획이 필요한 것이다.

사람들 사이에 편집증을 만들기 보다는, 보다 안전하기 위해선 필요한 것이 더 있다는 것을 지적하기 위함이다. 가장 중요한 것은 암호화는 보안에 있어 첫발이라는 것과 모든 것을 해결해 주는 것이 아니라는 것을 깨닫는 것이다. 1999년 3월에 멜리사 바이러스에 출현한 트로이 목마는 많은 기업이 이러한 것에 대비하지 않았음을 증명했다.