이번 포스트에서는 PGP Key가 어떤 것인지 알아보고, PGP키를 생성 / 삭제 및 PGP 키를 이용해서 데이터를 encrypt / decrypt 하는 방법 등에 대해서 소개하겠습니다.
PGP 키
먼저, PGP는 Pretty Good Privacy 의 약자입니다. Phil Zimmermann 에 의해서 개발되었습니다. 초창기 PGP는 보안에 민감한 데이터를 취급할 때, 데이터를 받는 쪽에서만 decrypt 할 수 있게 하기 위해서 사용되었습니다.
PGP key를 이용해서 데이터를 받는 과정입니다.
1. 데이터를 받는 쪽에서 먼저 PGP 키를 생성합니다.
2. 데이터를 보내주는 쪽에 생성한 public key를 전달해 줍니다.
3. 데이터를 보내는 쪽에서는 전달 받은 public key를 이용해서 데이터를 encrypt 합니다.
4. 데이터를 전송합니다.
5. 데이터를 받는 쪽에서는 private key를 이용해서 데이터를 decrypt 합니다.
PGP 키는 발급시 public key 와 private key 가 생성되는데, public key는 encrypt 시에 사용되며, private key는 decrypt 시에 사용이 됩니다. 이런 비대칭성 (asymmetry) 때문에, public key는 공개 되어도 상관이 없습니다.
PGP vs GPG
PGP 키를 발급하는 과정에서, 검색을 하다보면 PGP 대신 GPG 가 검색이 되는 경우가 많습니다. GPG는 GNU Privacy Guard 의 약자로 Open Source 버전의 PGP 라고 생각하면 됩니다. Ubuntu 에서 기본으로 제공이 되기 때문에, 이 포스트에서는 GPG 커맨드를 이용해서 키를 관리해 보도록 하겠습니다.
PGP 키 생성
먼저, PGP키를 생성해 봅니다.
아래 커맨드를 이용하면 키를 생성할 수 있습니다.
> gpg --full-generate-key
참고로, 옵션 중에 --generate-key, --quick-generate-key 를 사용해도 키를 생성할 수 있으나, 알고리즘, 키 사이즈 혹은 유효기간 등을 원하는 방식으로 설정하기 위해서는 --full-generate-key 옵션을 사용해야 합니다.
커맨드를 실행하면, 몇 가지 물어보게 됩니다. 위에서 잠시 이야기 했던, 알고리즘, 키 사이즈, 유효기간을 설정하면 됩니다.
위의 필수 정보를 입력하고 나면, PGP 키 사용자에 대한 정보를 입력해야 합니다. (Real name, Email address, Comment)
이 중에 Real name은 아이디라고 생각하면 되는데, local에서 사용할 경우, Real name 만 입력해도 문제 없습니다. public 사이트에 공개해야 하는 경우에는 Email address도 입력해서 unique 한 인증 정보를 입력해야 합니다.
저는 Real name을 testpgp 로 설정하였습니다. 마지막에 O를 입력해서 Okay를 하면, 키가 생성이 됩니다.
PGP 키 확인
PGP 키가 생성이 되면, 생성된 키들은 key storage에 위치하게 됩니다.
키를 확인하기 위해서는 아래 커맨드를 사용합니다.
Pubilc key 확인 (소문자 k)
> gpg -k
Private key 확인 (대문자 K)
> gpg -K
실제로 입력을 해보면, 아래와 같이 생성된 키 정보를 확인할 수 있습니다.
데이터 encrypt, decrypt
이번에는 public key를 이용해서 데이터를 encrypt 해보고, private key를 이용해서 encrypt 된 데이터를 decrypt 해보도록 하겠습니다.
테스트를 위해서 간단한 텍스트 파일을 하나 생성하였습니다.
아래 커맨드를 이용해서 test.txt 파일을 encrypt 합니다.
> gpg -o test.gpg -e -r testpgp test.txt
커맨드에서 사용한 옵션은 다음과 같습니다.
-o: output filename, 여기서는 encrypt 되서 출력될 파일을 "test.gpg" 로 지정하였습니다.
-e: encrypt, encrypt 하라는 의미입니다.
-r: recipent, 수신자로 public key 이름을 적으면 됩니다.
마지막으로 test.txt는 encrypt 할 입력 파일 이름입니다.
커맨드 실행 후에는 아래와 같이 test.gpg 파일이 생성되었습니다.
이번에는 decrypt 하는 커맨드 입니다.
> gpg -o test_decrypted.txt -d test.gpg
커맨드에서 사용한 옵션은 다음과 같습니다.
-o: output filename, 여기서는 decrypt 되서 출력될 파일을 "test_decrypted.txt" 로 지정하였습니다.
-d: decrypt, decrypt하라는 의미입니다.
마지막으로 test.gpg 는 encrypt 된 입력 파일 이름입니다.
커맨드 실행 후에 생성된 test_decrypted.txt 파일을 열어보면, test.txt 파일과 같은 내용이 있음을 확인할 수 있습니다.
PGP 키 내보내기
이번에는 키를 export 해보겠습니다. public 키와 private 키 각각 export 옵션은 다음과 같습니다.
Pubilc key export
> gpg --export -a -r testpgp -o testpgp_pub.asc
Private key export (password 입력 필요)
> gpg --export-secret-key -a -r testpgp -o testpgp_pri.asc
위의 커맨드를 실행해보면, public key는 "testpgp_pub.asc" 파일로, private key는 "testpgp_pri.asc" 파일로 생성이 됩니다.
PGP 키 삭제하기
이번에는 키박스에 저장된 키들을 삭제해 보겠습니다. public key와 private key가 같이 있는 경우에는 private key 부터 삭제 합니다.
Private key 삭제
> gpg --delete-secert-key testpgp
Public key 삭제
> gpg --delete-key testpgp
커맨드 실행 후, 확인 명령어로 키를 체크해 보면, 삭제된 것을 알 수 있습니다.
PGP 키 가져오기
마지막으로 export 해 뒀던 키를 키박스로 가져오는 커맨드 입니다.
Pubilc key import
> gpg --import testpgp_pub.asc
Private key import (password 입력 필요)
> gpg --import testpgp_pri.asc
위의 명령어를 실행하면 아래와 같이 출력되면서, 키박스에 키들이 저장됩니다.
그런데, 가져오기 후에 PGP 키를 확인해 보면, 아래와 같이 trust 상태가 unknown으로 나오게 됩니다.
trust 상태를 바꿔주기 위해서 --edit-key 옵션을 사용합니다.
> gpg --edit-key testpgp
명령어를 입력하면 아래와 같은 프롬프트 화면이 나오게 됩니다.
프롬프트에 "trust" 를 입력하고, trust 상태를 지정합니다. (여기선 5)
y를 입력해서 변경사항을 확인해 주면 저장이 완료됩니다.
마지막으로 quit 를 입력해서 프롬프트를 종료합니다.
pgp 키 정보를 확인해 보면 trust 상태가 "ultimate" 으로 변경된 것을 확인할 수 있습니다.