GnuPG로 암호화 된 텍스트. 풀려면 암호화에 사용된 공개키와 대칭되는 비밀키가 필요하다.[1]
Pretty Good Privacy,
1. 개요
PGP는 주로 전자메일의 내용을 암호화하는데 사용되는 공개키 암호화 방식이다.2. PGP 간단 이해
철수와 영희가 있다고 가정하자.공개키: 남에게 공개하는 키.
개인키: 남에게 절대 알려서는 안 되는 키.
철수 공개키: aaaa
철수 개인키: bbbb
영희 공개키: cccc
영희 개인키: dddd
aaaa로 암호화하면 bbbb로 풀 수 있다.
bbbb로 암호화하면 aaaa로 풀 수 있다.
cccc로 암호화하면 dddd로 풀 수 있다.
dddd로 암호화하면 cccc로 풀 수 있다.
이메일 주고받는 과정은 다음과 같다.
철수 -> 영희
1. 철수는 상대방 공개키(cccc)로 이메일 내용을 암호화한다.
2. 철수는 자신의 개인키(bbbb)로 이메일을 서명한다.
3. 철수는 상대방 공개키(cccc)로 이메일을 전송한다.
4. 영희는 자신의 개인키(dddd)로 암호화를 해제하고 내용을 확인한다.(ex. "안녕 영희야")
5. 영희는 상대방의 공개키(aaaa)로 이메일의 서명을 검증한다. 이로써 정말 철수가 보낸 메일임을 확인한다.
영희 -> 철수
1. 영희는 상대방 공개키(aaaa)로 이메일 내용을 암호화한다.
2. 영희는 자신의 개인키(dddd)로 이메일을 서명한다.
3. 영희는 상대방 공개키(aaaa)로 이메일을 전송한다.
4. 철수는 자신의 개인키(bbbb)로 암호화를 해제하고 내용을 확인한다.(ex. "안녕 철수야")
5. 철수는 상대방의 공개키(cccc)로 이메일의 서명을 검증한다. 이로써 정말 영희가 보낸 메일임을 확인한다.
여기서 왜 이메일 내용은 상대방 공개키로 암호화하고, 서명은 내 개인키로 하는지 궁금할 수 있다.
내 공개키로 이메일 내용 암호화: 내 개인키를 알아야 암호화를 해제할 수 있는데 상대방이 내 개인키를 모르므로 암호화를 풀 수 없어서 메일보내는 의미가 없어진다.
내 개인키로 이메일 내용 암호화: 내 개인키로 암호화할 경우 내 공개키를 이용해 암호화를 해제할 수 있다. 내 공개키는 공개되어 있으므로 개나소나 암호화를 해제할 수 있다. 그래서 암호화하는 의미가 없어진다.
상대방 개인키로 이메일 내용 암호화: 애초에 상대방 개인키를 모르므로 불가능하다.
내 공개키로 서명: 내 개인키를 알아야 서명을 검증할 수 있는데 상대방이 내 개인키를 모르므로 서명을 검증할 수 없어 서명하는 의미가 없어진다.
상대방 공개키로 서명: 내 개인키로 서명하는 것은 오직 나 자신만이 가능하지만, 상대방 공개키로 서명하는 것은 개나소나 가능하다. 그래서 이 메일보낸 사람이 나라는 것을 전혀 증명하지 못하므로 서명하는 의미가 없어진다.
상대방 개인키로 서명: 애초에 상대방 개인키를 모르므로 불가능하다.
그러므로 이메일 내용은 상대방 공개키로 암호화하고, 서명은 내 개인키로 한다.
PGP를 이해하는 데 도움이 되었길 바란다.
3. PGP의 의의
3.1. PGP의 개념 및 역사
암호학의 일대 혁명을 가져온 프로그램으로, 1991년 필 짐머만(Phil Zimmermann)[2]이라는 프로그래머가 개발한 전자우편 암호화 프로그램[3]과 그 파생작들을 말한다. 이 프로그램 전까지만 해도 암호화 기능은 정부나 군대, 그리고 정보기관의 전유물이었으나 PGP로 인해서 일반 사람들까지 암호가 퍼지게 되었다. 덕택에여담으로 1997년 PGP 국제버전인 PGPi 5.0이 개발되었고, 필 지머먼은 이를 국외로 수출하려고 했으나 당시 미국 정부는 암호화 프로그램을 무기로 간주하여 이를 저지한다. 이에 지머먼은 법률을 검토하던 중, 소프트웨어는 수출 금지 항목에 포함되어 있어도, 종이에 인쇄된 책은 수출에 제약이 없다는 점을 발견했다. 법의 허점이라기보다는, 미국에서는 강력한 수정헌법 1조 덕에 출판의 자유가 보장되어 내용이 무엇이든 책으로 배포가 가능했던 것.[4] 그리하여 총 6천여 페이지의 소스코드를 출력하여 12권의 책으로 묶었고, 이를 수출하고 국외에서 지원자를 모집하여 스캐너로 책 페이지의 이미지를 떠서 OCR을 통해 다시 프로그램 소스 코드로 변환하여 컴파일하는 대단한 삽질을 통해 결국 해외 수출에 성공한다. 당시 70여명의 지원자가 있었다고 한다. 스캔과 OCR 변환, 빌드와 미국 국외에서 출시하기까지 걸린 총 시간은 1000시간 쯤 된다고 한다. 이를 "PGPi Scanning Project"라고 부른다. 이후 개정판 버전이 다시 이러한 과정을 거쳐 수출에 성공했으며, 미 정부가 1999년에 적성국가를 제외한 나머지 국가에 암호화 프로그램 수출을 허가하도록 법령을 수정하여 이러한 삽질은 더 이상 일어나지 않게 되었다.
또한, 암호화 알고리즘을 사용하는 다른 소프트웨어들도 같은 이유로 수출이 제한되어 해외에서는 미국산 소프트웨어에서 대칭키 암호화 알고리즘은 키 길이가 40비트로 제한된 알고리즘을 쓸 수 밖에 없었다. 따라서, 한국에서는 전자상거래용으로 SEED라는 128비트 키를 사용하는 독자적인 암호화 알고리즘을 개발해 익스플로러에 ActiveX 형태로 적용했으며, 이 때부터 ActiveX와 함께하는 환장할 인증 시스템이 완전히 뿌리내리게 된다. 지금은 ActiveX가 아닌 프로그램 설치 방식으로 대부분 바뀌었지만 시스템에 접근이 불가능한 자바스크립트가 아닌 시스템에 접근이 가능한 추가 기능을 이용한다는 점에서 보안상 취약한 점은 변하지 않는다. 좀 더 최근에는 웹 표준 및 자바스크립트 기반 인증서 시스템과 사설 인증서가 등장하여 조금씩 대체되는 중이다.
3.2. PGP의 원리
자세한 내용은 RSA 문서나 공개키 암호화 또는 RSA에 대한 전문서적을 참고.간단히만 설명하자면, 이메일 내용 자체를 암호화하여 오로지 보내는 사람과 받는 사람만이 그 원문(Plain Text)을 알 수 있도록 하는 암호화 방식을 말한다. 물론 이메일 서비스 제공자(Google, Yahoo, Outlook 등)는 이메일의 전송 과정에서 TLS를 적용하는 등의 기본적인 보안을 제공한다. 하지만 이메일 서비스 제공자 자체를 신뢰할 수 없거나[5], 법원이 발부한 압수수색 영장에 의해 수사상 필요로 인해 이메일 서비스 제공자가 이메일을 수사기관과 법원에 제출해야 하는 경우에는 수사와 관련없는 이메일까지 내용이 그대로 노출될 수밖에 없다.[6] PGP등으로 암호화해서 메일을 송수신했더라도 개인키는 컴퓨터등에 있을 것이고, 송수신 과정에 여러 디지털 흔적이 남으므로 디지털 포렌식을 회피하기란 사실상 힘들다. 일반적인 경우에 이메일 제공자조차 이메일의 원문을 알 수 없도록 암호화를 할 필요가 있었고, 그것이 PGP이다.
PGP의 기능은 크게 인증과 기밀성 보장으로 나눌 수 있다. 인증은 전송하려는 메시지의 해시값에 송신자의 개인키를 이용해 암호화(전자서명)을 수행하는것으로 달성할 수 있고. 기밀성 보장은 세션키(대칭키)와 송수신자의 비대칭 키를 통한 암호화로 달성할 수 있다.
송신자는 먼저 전송하려는 메시지를 생성한다. 이 메시지를 해시함수를 이용해 해시값을 생성하고 그 해시값을 송신자의 개인키로 암호화 하면 이 암호문은 해당 메시지에 대한 전자서명이 된다. 그리고 송신자는 의사난수 생성기 등을 이용해 세션키를 생성하고 메시지와 전자서명을 결합한 값을 세션키로 암호화한다. 세션키는 수신자의 공개키로 암호화 하여 세션키로 암호화된 값과 함께 전송한다.
수신자는 전송받은 데이터에서 세션키 부분을 분리해 수신자의 개인키로 복호화 하여 세션키를 획득한다. 이 세션키로 나머지 부분을 복호화하고 전자서명과 메시지를 분리하여 여기서 수신자는 메시지 원문을 획득할 수 있다. 여기서 메시지 변조 여부 혹은 송신자 검증을 위해 인증을 수행한다. 전자서명은 송신자의 공개키로 복호화 하고 획득한 메시지 평문으로 사전에 공유된 해시 함수를 통해 해시값을 구한다. 직접 얻어낸 해시값과 복호화로 얻어낸 해시값이 동일하다면 이 메시지는 변조되거나 타인이 송신하지 않은것이다. 그러나 동일하지 않다면 이 메시지는 변조되었거나 타인이 송신한 값이기에 해당 값은 폐기하고 송신자에게 재송신을 요구한다.
3.3. 기타
처음 개발되었을 때 개인 사용자한테는 무료였지만, 현재는 유료로 시만텍에서 판매하고 있다. 그러나 PGP의 한 갈래인 OpenPGP는 현재 인터넷 표준으로 자리매김 하였으며, 이를 이용한 GnuPG같은 여러 프로그램이 등장했다. 당연하게 윈도우나 맥, 리눅스 버전도 존재한다.리눅스는 패키지 보관소(Repository)에 보관된 소프트웨어를 보관소의 GPG 키를 이용하여 패키지에 문제가 있는지 없는지 확인하며, 몇몇 포럼의 Geek들은 자신이 직접 글을 썼다는걸 증명하기 위해 PGP를 사용해 사인하거나 암호화하여 글을 작성하기도 하며, 이러한 글은 작성자의 공개키를 바탕으로 PGP를 통해 해독하여 본인인지 아닌지 확인할 수 있다.
4. PGP (GnuPG) 사용하기
- Symantec PGP(상용): http://www.symantec.com/encryption/ [7]
- GnuPG(오픈소스): https://www.gnupg.org
4.1. 윈도우
4.1.1. GPG4Win
GPG4Win 간단한 활용법 2가지 @https://www.gpg4win.org/에서 윈도우용 GPG 프로그램인 GPG4Win을 다운로드 받을 수 있다.
4.1.1.1. 주의사항
아래의 주의사항들이 있다.1. 아래의 가이드 글은 '철수'가 '영희'에게 암호문 또는 서명된 메시지를 보내는 상황이라고 가정한다.
2. 아래의 가이드 글은 PGP 공개키 서버를 이용하지 않았다.
3. 개인키는 절대로 유출되어서는 안된다. 만약 유출되었다면 즉시 키를 폐기해야한다. 'BEGIN PGP PRIVATE KEY BLOCK' 문구의 아래 부분이 개인키이다. 참고 링크
4. PGP는 메시지 내용을 암호화해줄 수는 있지만 누가(철수) 누구(영희)에게 메시지를 보냈다는 사실을 숨길 수는 없다. 다시말해 PGP는 메타데이터를 숨겨주지는 못한다.
5. PGP 프로그램 중 gpg4usb가 있는데 이 프로그램은 ECDSA/EdDSA(ed25519)를 지원하지 않는다. 그러므로 만약 상대방이 gpg4usb를 쓴다면 무조건 RSA 4096비트를 선택해야한다.
6. 커뮤니티에 공개키를 입력할 수 있는 공간이 필요하다. 보통 PGP로 소통하는 커뮤니티는 공개키를 입력할 수 있는 프로필란(갤로그 같은 것)이 있다. 상대방에게 PGP로 암호문을 보내고 싶으면 상대방의 프로필란(갤로그 같은 것)을 보고 상대방의 공개키를 알아내면 된다. 디시인사이드의 경우 갤로그의 방명록이 공개키를 게시하기에 적당하지만 안타깝게도 글자수 1000자 제한때문에 갤로그 방명록에 공개키를 게시하기 어렵다.
7. 해당 가이드의 작성자는 PGP에 대한 이해가 빈약하다. 그러므로 만약 다른 사람의 가이드글과 이 가이드글의 내용이 충돌한다면 이 글의 가이드가 틀린 내용이라고 여기는 것이 좋다.
4.1.1.2. 프로그램 설치
1. 철수: GPG4Win 사이트에 들어간다.
2. 철수: Download 클릭
3. 철수: $0 선택하고 Download 클릭
4. 철수: 실행
5. 철수: Next
6. 철수: Next
7. 철수: Install
8. 철수: Next
9. 철수: Finish
10. 철수: 전체적인 모습이다.
4.1.1.3. 키 생성하기
1. 철수: 파일 -> 새 키 쌍 클릭
2. 철수: '개인 OpenPGP 키 쌍 생성' 클릭
3. 철수: 이름입력, '생성한 키를 암구호로 보호합니다' 선택, 유효 기간 적당하게 조절 후 생성한다.
키 구성은 ECDSA/EdDSA(ed25519)+ECDH(cv25519) (=기본 설정 그대로) 또는 RSA 4096비트(3072비트 아님)를 선택한다.
PGP 프로그램 중 gpg4usb가 있는데 이 프로그램은 ECDSA/EdDSA(ed25519)를 지원하지 않는다. 그러므로 만약 상대방이 gpg4usb를 쓴다면 무조건 RSA 4096비트를 선택해야한다.
4. 철수: 비밀번호 입력
5. 철수: 완료 클릭
4.1.1.4. 내 공개키 내보내기
1. 철수: 선택한 상태에서 내보내기 클릭
2. 철수: 저장
3. 철수: 메모장 -> 파일 -> 열기
4. 철수: 모든 파일로 변경 후 파일을 선택하고 열기 클릭
5. 철수: 자신(철수)의 공개키이다.
6. 철수: 전체선택(ctrl+a) 후 복사(ctrl+c)
7. 철수: 자신의 프로필에 공개키 붙여넣기 (아카는 공개키를 넣을 수 있는 프로필 공간이 없어서 임시로 아래와 같이 했음)
영희도 철수와 동일한 과정을 거친다.
4.1.1.5. 상대방 공개키 들여오기
1. 철수: 영희의 공개키를 복사
2. 철수: 도구 -> 클립보드 -> 인증서 가져오기
3. 철수: 영희를 추가한다.
영희도 철수와 동일한 과정을 거친다.
4.1.1.6. 암호문 보내기
1. 철수: 클레오파트라에서 메모장 클릭
2. 철수: 메세지 입력
3. 철수: 받는 사람 탭에서 아래와 같이 설정한다.
4. 철수: 메모장 서명/암호화 클릭
5. 철수: 전체선택(ctrl+a) 후 복사(ctrl+c)
6. 철수: 게시글 작성
7. 영희: 철수의 암호문을 복사한다
파일:GPG4Win사용법32.png
8. 영희: 클레오파트라에서 메모장 클릭
9. 영희: 붙여넣기(ctrl+v) 후 메모장 복호화/검증 클릭
10. 영희: 비밀번호 입력
11. 영희: 결과1: 철수의 키가 '인증됨'으로 되어있을 때
12. 영희: 결과2: 철수의 키가 '인증 안 됨'으로 되어있을 때
13. 영희: 우클릭해서 '인증 안 됨' -> '인증됨' 또는 '인증됨' -> '인증 안 됨' 으로 바꿔줄 수 있다.
4.1.1.7. 메시지 서명하기
1. 철수: 서로 메세지를 보낼 때 정말 자신이 맞다는 것을 인증할 수도 있다. 먼저 메시지를 입력한다.
2. 철수: 받는 사람 클릭하고 아래 이미지와 같이 설정한다.
3. 철수: Sign Notepad 클릭
4. 철수: 게시판에 메시지를 올린다.
5. 영희: 철수의 메시지를 복사한다.
6. 영희: kleopatra의 메모장에 붙어넣은 뒤 메모장 복호화/검증 클릭.
7. 영희: 정말 철수가 보낸 메시지임을 확인할 수 있다.
8. 영희: 만약 제3자가 끼어들어서 사칭했다고 가정했을 때 확인해보자.
9. 영희: 다음과 같이 철수가 아닌 다른 사람이 사칭한 것임을 알 수 있다.
파일:GPG4Win사용법47.png
4.1.2. 컴포넌트
설치 중에 아래의 것을 선택할 수 있다.- Kleopatra: 키를 생성하는 등의 관리와 서명, 암호화, 복호화를 할 수 있다.
- GPA
- GpgOL: 아웃룩 플러그인이다. 아웃룩에 서명 및 암호화를 버튼을 눌러서 활성화시킬 수 있다.
- GpgEx: 윈도우 탐색기용 플러그인이다. 파일이나 폴더를 마우스 우클릭으로 서명 및 암/복호화 할 수 있다.
- Browser integration: Mailvelope확장 프로그램을 설치하는 경우에 gmail.com, outlook.com 등의 웹메일에서 보안메일을 송수신할 수 있다. 설치하지 않아도 Mailvelope 설치만으로 지메일 등에서 보안메일을 사용할 수 있지만, OpenPGP.js를 사용할 수 있도록 하는 것으로 보인다.
Mozilla Thunderbird는 Enigmail라는 플러그인을 찾아서 설치해야 한다. 방법에 대해서는 원문(영어)이나 번역(한국어)을 참고하라.
4.2. 리눅스
리눅스는 대부분의 배포본에 기본적으로 설치 가능한 패키지 형태로 들어있다. 따라서 단순히 패키지 검색 후 설치하는 것으로 사용할 수 있다.리눅스 이외에 많이 사용하는 다른 운영체제용으로, 다음의 링크에서 운영체제별 주요 프로그램에 맞게 설정까지 해주어 편리하게 사용할 수 있는 설치형 패키지를 받을 수 있다.
4.3. 맥
OS X: https://gpgtools.org - 여기서는 애플 메일에다가 플러그인을 박아넣는다.
4.4. 안드로이드
안드로이드에서 PGP를 사용할 수 있는 오픈소스 애플리케이션은 세 가지가 있다.- APG - F-Droid 링크
- GnuPrivacyGuard - F-Droid 링크, 가디언 프로젝트의 일환으로 제작되었다.
- OpenKeychain - F-Droid 링크
이 중 기능이 가장 강력한 것은 GnuPG-cli를 통째로 이식한 GnuPrivacyGuard지만 업데이트가 2014년에 멈췄고 사용이 매우 불편하다. APG 역시 업데이트가 2014년에 멈췄다. OpenKeychain만이 2020년 기준으로 개발, 유지보수가 이루어지고 있는 유일한 오픈소스 PGP 애플리케이션이다.
APG와 OpenKeychain은 K-9 이메일 애플리케이션과 연동하여 사용할 수 있다. 다만 업데이트가 미진한 APG는 차기 버전에선 빠질 예정이다.
4.5. iOS
iOS에서도 PGP를 사용할 수 있다. pgp로 검색하면 많이 나온다.덤으로 OpenPGP.js를 사용한다. 아래는 Objective-C로 짠 ObjectivePGP를 이용한다.
5. PGP 공개키 서버
상대방의 이메일 주소를 가지고 공개키를 받을 수 있게 해 주는 서버. 물론 내 공개키를 제출하여 다른 사람이 검색하게 할 수도 있다.-
PGP Global Directory:
https://keyserver.pgp.com/vkd/GetWelcomeScreen.event
PGP 사에서 운영하는 키서버 군이다. 현재 주로 쓰이는 SKS keyserver과 분리되어 있는 것으며, 6개월에 한번 키를 인증하여 갱신하지 않으면 서버에서 키가 사라진다. -
MIT Key Server:
https://pgp.mit.edu
MIT 에서 독자적으로 운영하는 PGP 키 서버. 위 네트워크와 분리되어 있는 점이 특징. SKS 프로그램을 사용하는 키서버들과 연동된다.
2020년 9월 기준으로, 최근에는 https://keys.openpgp.org/, http://keyserver.ubuntu.com/ 등 또한 활발하게 쓰이고 있다. Where to upload PGP public key? Are KeyServers still surviving?
6. 관련 문서
- 대칭 열쇠 암호
- 공개키 암호화 방식
- gpg4usb
- PEM
- E2EE
- Tor(익명 네트워크)
- 가상 사설망
- 다크 웹
- Tails OS
- Whonix
- GrapheneOS
- 모네로
- Zcash
- VeraCrypt
- 인터넷 프라이버시
- 야한 동영상/좋은 은폐 방법
[1]
참고로 저걸 해독하면
Hello!가 나온다.
[2]
비트코인의 창시자
사토시 나카모토 역시 짐머만의 논문을 참조했다고
비트코인 백서에 써놓았다.
[3]
이때 짐머만과 함께 프로그램을 개발한 사람이 먼 훗날
비트코인 역사에서 가장 중요한 인물로 손꼽히는 암호학자
할 피니(C++의 전문가였던 그는 초기 비트코인을 창시자
사토시 나카모토와 함께 2주간 디버깅하였고, 그의 도움 이후에 비트코인 프로그램은 작은 오류조차 없이 돌아가기 시작했다.)이다. 할 핀니는 죽기 전 비트코인 포럼에 남긴 유서에서, 짐머만이 PGP를 개발하기 위해 세운 회사의 첫번째 직원이 자신이었다고 고백했다. 초반에는 사장과 직원 단 두명이서 프로그램 개발을 했었다고 한다. 할 핀니는 캘리포니아공대(칼텍) 수학과를 졸업한 미국 최고의 엘리트 암호학자 중 한명이었다. 사토시 나카모토가 할 핀니를 크게 존경하고 신뢰하여 할 핀니가 조언하는대로 비트코인을 수정한 건 그가 짐머맨과 PGP를 만든 것을 존경했기 때문.
[4]
1995년에 암호학자 대니얼 J. 번스타인이 소스코드의 출판 통제에 대해 연방대법원에 소를 제기했고, 1997년에 연방대법원은 소스코드 출판에 대한 미국 정부의 통제를 위헌으로 규정했다.
[5]
이메일 서비스 제공자가 악의적으로 범죄에 이용하는 경우는 물론이고, 서버의 보안상 결함으로 이메일 데이터베이스가 유출되는 사고도 있을 수 있다.
[6]
물론 압수수색 영장에 의한 서버의 압수수색이나 법원의 제출명령에 의한 자료제출은 모두 헌법과 법률에 근거가 있는 '적법절차'에 따른 것이다.
[7]
기업용 제품이기 때문에 개인이 사용하기에는 부적절할 수 있다.
[8]
iTunes를 통한 파일공유를 지원하지 않는다.