소개
이 실습에서는 GPG(GNU Privacy Guard)를 사용하여 Linux 환경에서 파일을 암호화하고 복호화하는 필수 기술을 배웁니다. 먼저 GPG 보안 모델의 기초가 되는 공개/개인 키 쌍을 생성합니다. 키 생성 후에는 자신을 위해 파일을 암호화하고, 비밀 키와 암호를 사용하여 이를 다시 복호화하는 핵심 작업을 연습합니다.
이러한 기초를 바탕으로 다른 사람과 정보를 안전하게 교환하는 방법을 살펴봅니다. 여기에는 공유를 위한 공개 키 내보내기와 다른 사용자의 공개 키 가져오기가 포함됩니다. 또한 공개 키의 진위 여부를 확인하기 위해 서명하는 방법과 비밀 키 백업 및 키가 손상될 경우를 대비한 폐기 인증서 생성과 같은 중요한 키 유지 관리 작업을 수행하는 방법도 배웁니다.
gpg --gen-key를 사용하여 GPG 키 쌍 생성하기
이 단계에서는 개인 GPG(GNU Privacy Guard) 키 쌍을 생성합니다. GPG 키 쌍은 공개 키와 개인 키라는 서로 다르지만 관련된 두 개의 키로 구성됩니다. 공개 키는 다른 사람들이 파일을 암호화할 수 있도록 공유할 수 있습니다. 개인 키는 공개 키로 암호화된 파일을 복호화할 수 있는 유일한 키이므로 반드시 비밀로 유지해야 합니다.
먼저 GPG 기능을 제공하는 gnupg 패키지가 시스템에 설치되어 있는지 확인합니다.
sudo apt-get update && sudo apt-get install -y gnupg
이제 키 쌍을 생성할 준비가 되었습니다. gpg --gen-key 명령을 사용하면 대화형 프로세스를 통해 키를 생성할 수 있습니다.
터미널에서 다음 명령을 실행하세요.
gpg --gen-key
이 명령은 간소화된 키 생성 방식을 사용한다는 알림이 표시됩니다. 더 고급 옵션을 사용하려면 gpg --full-generate-key를 사용할 수 있지만, 기본 옵션으로도 이 실습을 진행하기에 충분합니다.
다음 정보를 입력하라는 메시지가 표시됩니다.
- Real name:
labex입력 - Email address:
labex@example.com입력 - Confirm User ID: 세부 정보를 검토합니다.
Change (N)ame, (E)mail, or (O)kay/(Q)uit?메시지가 나오면O를 입력하고Enter를 누릅니다.
시스템은 자동으로 다음과 같은 보안 기본값을 사용합니다.
- Key type: RSA and RSA (기본값)
- Key size: 3072 bits (보안 기본값)
- Key validity: 2 years (보안을 위한 자동 만료)
참고: 이전 버전과 달리 최신 GPG는 --gen-key를 사용할 때 키 생성 과정에서 암호를 묻지 않을 수 있습니다. 추가 보안을 위해 키에 암호를 추가하려면 나중에 다음 명령을 사용할 수 있습니다.
gpg --edit-key labex
그런 다음 GPG 프롬프트에서 passwd를 입력하여 암호를 설정하고, save를 입력하여 종료합니다.
이제 시스템이 키 쌍을 생성합니다. 이 과정은 무작위 데이터(엔트로피)가 필요하며 시간이 조금 걸릴 수 있습니다.
완료되면 다음과 유사한 확인 메시지가 표시됩니다.
gpg: key <KEY_ID> marked as ultimately trusted
gpg: revocation certificate stored as '/home/labex/.gnupg/openpgp-revocs.d/<FINGERPRINT>.rev'
public and secret key created and signed.
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
키가 생성되었으므로 이제 확인할 수 있습니다. 새 공개 키를 보려면 다음을 실행하세요.
gpg --list-keys
출력에는 방금 생성한 키를 포함하여 키링에 있는 모든 공개 키가 나열됩니다.
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
개인 키를 보려면 다음을 실행하세요.
gpg --list-secret-keys
출력은 비슷하지만 공개 키(pub) 대신 비밀 키(sec)임을 나타냅니다.
/home/labex/.gnupg/pubring.kbx
------------------------------
sec rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid [ultimate] labex <labex@example.com>
ssb rsa3072 2025-07-01 [E] [expires: 2027-07-01]
이제 GPG 키 쌍을 성공적으로 생성하고 확인했습니다.
gpg -e 및 gpg --decrypt를 사용하여 로컬 파일 암호화 및 복호화하기
이 단계에서는 생성한 GPG 키 쌍을 사용하여 파일을 암호화하고 복호화합니다. 이는 데이터의 기밀성을 보호할 수 있는 GPG의 기본적인 사용 사례입니다. 암호화는 읽을 수 있는 데이터를 읽을 수 없는 형식으로 변환하며, 올바른 개인 키를 가진 사람만이 원래 형태로 복호화할 수 있습니다.
먼저 작업할 간단한 텍스트 파일을 만듭니다. 모든 작업은 현재 디렉토리인 ~/project에서 수행됩니다.
echo "This is a secret message for the lab." > mytestfile.txt
이제 공개 키를 사용하여 이 파일을 암호화할 수 있습니다. gpg -e 명령은 암호화에 사용됩니다. 또한 -r 플래그를 사용하여 암호화된 메시지의 수신자를 지정해야 하며, 이는 GPG 키와 연결된 이름(labex)이어야 합니다.
gpg -e -r labex mytestfile.txt
GPG는 공개 키를 사용하여 파일을 암호화합니다. 암호화는 비밀이 아닌 공개 키로 수행되므로 암호를 묻지 않습니다.
명령이 완료되면 ls 명령을 사용하여 새로 생성된 암호화된 파일을 확인합니다.
ls
출력에서 원본 파일과 함께 mytestfile.txt.gpg를 볼 수 있습니다.
mytestfile.txt mytestfile.txt.gpg
mytestfile.txt.gpg 파일에는 암호화된 데이터가 포함되어 있습니다. 내용을 보려고 하면 읽을 수 없는 바이너리 데이터가 표시됩니다.
이제 파일을 복호화해 보겠습니다. 이를 위해 gpg --decrypt 명령을 사용합니다. 복호화 시에는 GPG가 개인 키를 사용합니다.
--output 플래그를 사용하여 복호화된 내용을 저장할 새 파일인 mytestfile.txt.decrypted를 지정합니다. 이렇게 하면 원본 파일을 덮어쓰지 않고 어떤 파일이 어떤 것인지 명확하게 구분할 수 있습니다.
gpg --output mytestfile.txt.decrypted --decrypt mytestfile.txt.gpg
키에 암호가 설정되어 있다면 암호를 입력하라는 메시지가 표시됩니다. 키 생성 시 암호를 설정하지 않았다면 복호화가 자동으로 진행됩니다. 다음과 유사한 출력이 표시됩니다.
gpg: encrypted with 3072-bit RSA key, ID <KEY_ID>, created 2025-07-01
"labex <labex@example.com>"
복호화가 완료되면 새 파일의 내용을 확인하여 원본 메시지와 일치하는지 확인합니다.
cat mytestfile.txt.decrypted
출력은 처음에 작성한 원본 텍스트여야 합니다.
This is a secret message for the lab.
이제 자신을 위해 파일을 성공적으로 암호화하고 GPG 키 쌍을 사용하여 복호화했습니다.
gpg --export 및 gpg --import를 사용하여 공개 키 교환하기
이 단계에서는 다른 사람과 공개 키를 교환하는 방법을 배웁니다. 다른 사람을 위해 파일을 암호화하려면 그 사람의 공개 키가 필요합니다. 마찬가지로 누군가가 암호화된 파일을 보내려면 당신의 공개 키가 필요합니다. 이 과정에는 공개 키를 파일로 내보내고 다른 사람으로부터 받은 공개 키를 GPG 키링으로 가져오는 작업이 포함됩니다.
먼저 자신의 공개 키를 내보냅니다. gpg --export 명령을 사용합니다. 키의 텍스트 기반(ASCII) 버전을 생성하는 --armor 옵션을 사용하는 것이 좋습니다. 이렇게 하면 이메일이나 기타 텍스트 기반 통신 채널에 쉽게 복사하여 붙여넣을 수 있습니다. labex.pub라는 파일로 저장하겠습니다.
터미널에서 다음 명령을 실행하세요. labex를 키 생성 시 사용한 사용자 ID로 바꿉니다.
gpg --export --armor -o labex.pub labex
ls를 사용하여 파일이 생성되었는지 확인할 수 있습니다.
ls
파일 목록에서 labex.pub를 볼 수 있습니다. 내용을 확인할 수도 있습니다.
cat labex.pub
출력은 -----BEGIN PGP PUBLIC KEY BLOCK-----으로 시작하는 텍스트 블록입니다. 이것이 다른 사람과 공유할 수 있는 공개 키입니다.
다음으로, 다른 사용자로부터 공개 키를 받는 상황을 시뮬레이션하고 이를 키링으로 가져옵니다. 실제 상황에서는 보안 채널을 통해 다른 사람으로부터 공개 키를 받게 됩니다. 이 실습에서는 임시 Alice 키 쌍을 만들고 Alice의 공개 키를 내보내 이 과정을 시뮬레이션합니다.
먼저 Alice를 위한 키 쌍을 일시적으로 생성합니다. 대화형 프롬프트 없이 이 과정을 자동화하기 위해 배치 모드를 사용합니다.
cat > alice-key-params << 'EOF'
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: Alice
Name-Email: alice@example.com
Expire-Date: 2y
%no-protection
%commit
EOF
매개변수 파일을 사용하여 Alice의 키 쌍을 생성합니다.
gpg --batch --generate-key alice-key-params
키 생성을 확인하는 출력이 표시됩니다.
gpg: key <KEY_ID> marked as ultimately trusted
public and secret key created and signed.
이제 Alice의 공개 키를 파일로 내보내어 Alice로부터 받은 것처럼 시뮬레이션합니다.
gpg --export --armor -o alice.pub alice@example.com
이 실습 데모에서는 실제로는 Alice의 공개 키만 가지고 있을 것이므로 키링에서 Alice의 비밀 키를 제거합니다.
gpg --delete-secret-keys alice@example.com
메시지가 표시되면 y를 입력하고 Enter를 눌러 삭제를 확인합니다.
gpg --delete-keys alice@example.com
다시 y를 입력하고 Enter를 눌러 삭제를 확인합니다.
이제 alice.pub 파일에 Alice의 공개 키가 있으며, 이는 다른 사용자로부터 받은 상황을 시뮬레이션합니다.
임시 키 생성 파일을 정리합니다.
rm alice-key-params
이제 파일에 Alice의 공개 키가 있으므로 gpg --import 명령을 사용하여 GPG 키링으로 가져옵니다.
gpg --import alice.pub
키가 가져와졌음을 확인하는 출력이 표시됩니다.
gpg: key <KEY_ID>: public key "Alice <alice@example.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
Alice의 키가 키링에 있는지 확인하려면 모든 공개 키를 다시 나열하세요.
gpg --list-keys
이제 출력에는 자신의 키(labex)와 새로 가져온 키(Alice)가 모두 표시됩니다.
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_LABEX>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
pub rsa2048 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_ALICE>
uid [ unknown] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
Alice의 키가 [ unknown] 신뢰도로 표시되어 있음을 확인하세요. 다음 단계에서 키 신뢰도를 관리하는 방법을 배웁니다.
공개 키 서명 및 다른 사용자를 위한 파일 암호화하기
이 단계에서는 받은 공개 키에 대한 신뢰를 구축하고 이를 사용하여 해당 소유자를 위한 파일을 암호화하는 방법을 배웁니다. 공개 키를 가져올 때 GPG는 그것이 진짜인지 알 방법이 없습니다. 자신의 개인 키로 키에 "서명"함으로써 암호화 보증을 생성하게 되며, 이는 본질적으로 GPG 설정에 "이 키가 이 사람의 것임을 신뢰한다"고 알리는 것입니다. 이는 GPG의 "신뢰의 웹(Web of Trust)" 모델에서 핵심적인 개념입니다.
먼저 이전 단계에서 가져온 "Alice"의 공개 키에 서명해야 합니다. gpg --sign-key 명령을 사용하고 이메일 주소(alice@example.com)로 키를 식별합니다.
gpg --sign-key alice@example.com
GPG는 Alice 키의 세부 정보를 표시하고 서명할 것인지 확인을 요청합니다.
pub rsa2048/XXXXXXXXXXXXXXXX 2025-07-01
created: 2025-07-01 expires: 2027-07-01 usage: SC
trust: unknown validity: unknown
sub rsa2048/YYYYYYYYYYYYYYYY 2025-07-01
created: 2025-07-01 expires: 2027-07-01 usage: E
[ unknown] (1). Alice <alice@example.com>
Really sign? (y/N)
y를 입력하고 Enter를 누릅니다. 키에 암호가 설정되어 있다면 암호를 입력하라는 메시지가 표시됩니다. 서명은 비밀 키로만 수행할 수 있는 암호화 작업이기 때문입니다. 메시지가 표시되면 암호를 입력하고 Enter를 누릅니다.
완료되면 키를 다시 나열하여 서명을 확인할 수 있습니다.
gpg --list-keys
Alice 키 항목의 변경 사항을 확인하세요. 가져온 키에 서명한 후에는 GPG가 더 이상 이를 [unknown]으로 표시하지 않습니다. 로컬 키링 상태에 따라 키가 [full] 또는 [ultimate]와 같은 더 강력한 유효성 표시와 함께 나타날 수 있습니다.
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_LABEX>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
pub rsa2048 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_ALICE>
uid [full] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
서명을 직접 확인하려면 다음을 실행하세요.
gpg --list-sigs alice@example.com
labex <labex@example.com>에 대한 서명 라인이 표시되어야 하며, 이는 귀하의 키가 Alice의 가져온 공개 키에 서명했음을 확인해 줍니다.
이제 Alice에 대한 신뢰할 수 있는 공개 키를 확보했으므로 그녀만 열 수 있는 파일을 암호화할 수 있습니다. 먼저 이 목적을 위한 새 파일을 만듭니다.
echo "This is a confidential message for Alice." > message-for-alice.txt
다음으로 gpg -e 명령을 사용하여 이 파일을 암호화합니다. 이번에는 -r 플래그를 사용하여 Alice를 수신자로 지정합니다.
gpg -e -r alice@example.com message-for-alice.txt
GPG는 Alice의 공개 키를 사용하여 암호화를 수행합니다. ls를 사용하여 결과를 확인합니다.
ls
디렉토리에 새로 암호화된 파일 message-for-alice.txt.gpg가 표시됩니다.
labex.pub mytestfile.txt
alice.pub mytestfile.txt.decrypted
message-for-alice.txt mytestfile.txt.gpg
message-for-alice.txt.gpg
이제 이 파일은 안전하게 암호화되었습니다. Alice의 개인 키(및 해당 암호)에 액세스할 수 있는 사람만이 메시지를 복호화하고 읽을 수 있습니다.
gpg --export-secret-keys 및 gpg --gen-revoke를 사용하여 키 유지 관리 수행하기
마지막 단계에서는 GPG 키에 대한 두 가지 중요한 유지 관리 작업인 비밀 키의 안전한 백업 생성과 폐기 인증서 생성을 수행합니다. 비밀 키는 대체할 수 없습니다. 분실하면 해당 공개 키로 암호화된 모든 데이터에 액세스할 수 없게 됩니다. 폐기 인증서는 안전망으로, 비밀 키를 분실하거나 손상된 경우 공개 키를 무효화할 수 있게 해줍니다.
먼저 비밀 키의 백업을 생성합니다. 이는 GPG 키 관리에서 가장 중요한 단계 중 하나입니다.
gpg --export-secret-keys 명령이 이 목적으로 사용됩니다. --armor 플래그를 사용하여 저장 및 전송이 쉬운 ASCII 아머 텍스트 파일을 생성합니다. 사용자 ID로 내보낼 키를 지정해야 합니다.
gpg --export-secret-keys --armor -o gpgkey.asc labex
이 명령은 사용자 labex의 비밀 키를 gpgkey.asc라는 파일로 내보냅니다. 이 파일은 매우 민감합니다. 실제 상황에서는 이 파일을 암호화된 USB 드라이브나 보안 금고와 같이 매우 안전한 오프라인 위치에 저장해야 합니다.
다음으로 폐기 인증서를 생성합니다. 이는 키 생성 직후에 수행해야 하며 비밀 키 백업과 별도로 안전하게 보관해야 합니다. 비밀 키를 분실하거나 도난당한 경우 이 인증서를 게시하여 다른 사람들에게 해당 키를 더 이상 사용하거나 신뢰해서는 안 된다는 것을 알릴 수 있습니다.
gpg --gen-revoke 명령을 사용합니다. --output 플래그를 사용하여 인증서를 revoke.asc라는 파일로 저장합니다.
gpg --output revoke.asc --gen-revoke labex
대화형 프로세스가 안내됩니다.
Create a revocation certificate for this key? (y/N)메시지가 나오면y를 입력하고Enter를 누릅니다.- 폐기 이유를 선택하라는 메시지가 표시됩니다. 이 실습에서는
Enter를 눌러 기본값인0 = No reason specified를 수락합니다. - 선택적 설명을 추가할 수 있습니다. 지금은 그냥
Enter를 눌러 비워둡니다. - 마지막으로
Is this okay? (y/N)메시지가 나오면y를 입력하고Enter를 눌러 세부 정보를 확인합니다. - 키에 암호가 설정되어 있다면 GPG가 이 인증서 생성을 승인하기 위해 암호를 요구합니다. 메시지가 표시되면 암호를 입력하고
Enter를 누릅니다.
폐기 인증서가 생성되었음을 확인하는 메시지가 표시됩니다.
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The printout
might be scanned and reconstructed by a determined attacker.
ls 명령을 사용하여 ~/project 디렉토리에 두 개의 새 파일이 모두 생성되었는지 확인합니다.
ls
이제 파일 목록에서 gpgkey.asc와 revoke.asc를 볼 수 있습니다. 필수 키 유지 관리 작업을 성공적으로 수행했습니다.
요약
이 실습에서는 Linux 환경에서 GNU Privacy Guard(GPG)의 기본 작업을 배웠습니다. gpg --gen-key 명령을 사용하여 공개 키와 개인 키로 구성된 개인 GPG 키 쌍을 생성하는 것으로 시작했습니다. 이 과정에는 키 사양을 선택하고 안전한 암호로 보호되는 사용자 ID를 만드는 작업이 포함되었습니다. 키 생성 후에는 gpg -e를 사용하여 로컬 파일을 암호화하고, 이후 개인 키와 gpg --decrypt 명령을 사용하여 복호화함으로써 GPG의 핵심 기능을 연습했으며, 이를 통해 비대칭 암호화의 기본 원리를 확인했습니다.
이러한 기초를 바탕으로 다른 사람과 안전하게 통신하는 방법을 살펴보았습니다. gpg --export를 사용하여 키를 공유하고 gpg --import를 사용하여 다른 사용자의 키를 받는 공개 키 교환 방법을 배웠습니다. 또한 가져온 공개 키에 서명하여 신뢰를 구축하고 이를 사용하여 해당 사용자를 위한 파일을 암호화하는 것의 중요성도 다루었습니다. 마지막으로 gpg --export-secret-keys를 사용하여 비밀 키를 백업하고, 키가 손상될 경우를 대비해 gpg --gen-revoke를 사용하여 폐기 인증서를 생성하는 등 필수적인 키 유지 관리 작업을 수행했습니다.



