Linux 환경에서 GPG 를 이용한 파일 암호화 및 복호화

CompTIABeginner
지금 연습하기

소개

이 실습에서는 GPG(GNU Privacy Guard) 를 사용하여 Linux 환경에서 파일을 암호화하고 복호화하는 데 필요한 핵심 기술을 습득합니다. 먼저 GPG 보안 모델의 기초인 본인만의 공개키/개인키 쌍을 생성하는 것으로 시작합니다. 키 생성 후에는 본인을 위해 파일을 암호화하고, 비밀키와 암호 구문을 사용하여 이를 다시 복호화하는 핵심 작업을 연습합니다.

이러한 기초를 바탕으로 다른 사용자와 정보를 안전하게 교환하는 방법을 살펴봅니다. 여기에는 공유를 위해 본인의 공개키를 내보내는 방법과 다른 사용자의 공개키를 가져오는 방법이 포함됩니다. 또한 공개키의 진위 여부를 확인하기 위해 키에 서명하는 방법과, 키가 유출될 경우를 대비한 비밀키 백업 및 폐기 인증서 생성과 같은 중요한 키 유지 관리 작업도 배우게 됩니다.

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드형 실습입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 통계 데이터에 따르면 이 실습은 초급 수준이며, 완료율은 93%입니다. 학습자들로부터 94%의 긍정적인 평가를 받았습니다.

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를 사용할 수 있지만, 이 실습에서는 기본 옵션으로도 충분합니다.

다음 정보들을 입력하라는 메시지가 표시됩니다.

  1. Real name: labex 입력
  2. Email address: labex@example.com 입력
  3. Confirm User ID: 입력한 내용을 확인합니다. Change (N)ame, (E)mail, or (O)kay/(Q)uit? 메시지가 뜨면 O를 입력하고 Enter를 누릅니다.

시스템은 자동으로 다음과 같은 보안 기본값을 사용합니다.

  • 키 유형: RSA 및 RSA (기본값)
  • 키 크기: 3072 비트 (보안 권장 기본값)
  • 키 유효 기간: 2 년 (보안을 위한 자동 만료 설정)

참고: 이전 버전과 달리 최신 GPG 는 --gen-key를 사용한 키 생성 중에 암호 구문 (passphrase) 을 묻지 않을 수 있습니다. 보안 강화를 위해 키에 암호 구문을 추가하고 싶다면 나중에 다음 명령어로 설정할 수 있습니다.

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 로 공개키 교환하기

이 단계에서는 다른 사람과 공개키를 교환하는 방법을 배웁니다. 다른 사람을 위해 파일을 암호화하려면 그 사람의 공개키가 필요합니다. 마찬가지로 누군가 당신에게 암호화된 파일을 보내려면 당신의 공개키가 필요합니다. 이 과정은 본인의 공개키를 파일로 내보내고 (export), 다른 사람으로부터 받은 공개키를 본인의 GPG 키링으로 가져오는 (import) 작업을 포함합니다.

먼저, 본인의 공개키를 내보내겠습니다. gpg --export 명령어를 사용합니다. 이때 --armor 옵션을 사용하는 것이 관례인데, 이는 키를 텍스트 기반 (ASCII) 버전으로 생성하여 이메일이나 기타 텍스트 통신 채널에 복사하여 붙여넣기 쉽게 만들어 줍니다. 파일 이름은 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 의 비밀키를 삭제하겠습니다.

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"의 공개키에 서명해야 합니다. 이메일 주소 (alice@example.com) 로 키를 식별하여 gpg --sign-key 명령어를 사용합니다.

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 키 항목의 변화를 확인하십시오. 신뢰 수준이 더 이상 [unknown]이 아닙니다. 서명을 통해 명시적으로 신뢰했기 때문에 이제 [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           [ultimate] Alice <alice@example.com>
sub   rsa2048 2025-07-01 [E] [expires: 2027-07-01]

이제 신뢰할 수 있는 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

대화형 프로세스가 진행됩니다.

  1. Create a revocation certificate for this key? (y/N) 질문에 y를 입력하고 Enter를 누릅니다.
  2. 폐기 사유를 선택하라는 메시지가 뜹니다. 이 실습에서는 기본값인 0 = No reason specified를 사용하기 위해 Enter를 누릅니다.
  3. 선택 사항으로 설명을 추가할 수 있습니다. 지금은 빈칸으로 두기 위해 Enter를 누릅니다.
  4. 마지막으로 Is this okay? (y/N) 질문에 y를 입력하고 Enter를 눌러 상세 내용을 확인합니다.
  5. 키에 암호 구문이 설정되어 있다면 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.ascrevoke.asc가 보여야 합니다. 필수적인 키 유지 관리 작업을 성공적으로 완료했습니다.

요약

이 실습에서는 Linux 환경에서 GPG(GNU Privacy Guard) 의 기본 작업을 배웠습니다. 먼저 gpg --gen-key 명령어를 사용하여 공개키와 개인키로 구성된 개인 GPG 키 쌍을 생성했습니다. 이 과정에서 키 사양을 선택하고 보안 암호 구문으로 보호되는 사용자 ID 를 생성했습니다. 키 생성 후에는 gpg -e로 로컬 파일을 암호화하고, 개인키와 gpg --decrypt 명령어를 사용하여 이를 다시 복호화하는 실습을 통해 비대칭 암호화의 기본 원리를 확인했습니다.

이러한 기초를 바탕으로 타인과 안전하게 통신하는 방법을 살펴보았습니다. gpg --export로 본인의 키를 공유하고 gpg --import로 다른 사용자의 키를 받는 공개키 교환 방법을 익혔습니다. 또한 가져온 공개키에 서명하여 신뢰를 구축하는 것의 중요성과, 해당 사용자를 위해 파일을 암호화하는 방법도 다루었습니다. 마지막으로 gpg --export-secret-keys를 이용한 비밀키 백업과 gpg --gen-revoke를 이용한 폐기 인증서 생성 등, 키 유출 시 키 쌍을 무효화하기 위한 필수적인 유지 관리 작업을 수행했습니다.