← All cheat sheets

PGP

Authorized use only. Offensive reference for systems you own or are explicitly permitted to test. You are responsible for staying within the law.

GPG (GNU Privacy Guard) is the free implementation of OpenPGP standard.
Most commands use 'gpg' or 'gpg2' depending on your system.

BASIC SYNTAX#

gpg [options] [files]
gpg --help                               # Show help
gpg --version                            # Show version and supported algorithms
man gpg                                  # Full manual

KEY GENERATION#

gpg --gen-key                            # Generate new key pair (interactive)
gpg --full-gen-key                       # Full key generation with all options
gpg --quick-gen-key "Name <email>"       # Quick key generation
gpg --quick-gen-key "Name <email>" rsa4096  # Quick with RSA 4096-bit
gpg --quick-gen-key "Name <email>" ed25519  # Quick with Ed25519 (modern)

# Generate key with specific parameters
gpg --full-gen-key --expert              # Expert mode (more algorithm choices)

# Recommended modern setup:
# - Primary key: Ed25519 (sign only)
# - Subkey: Cv25519 (encrypt)
# - Expiration: 1-2 years

LIST KEYS#

gpg --list-keys                          # List all public keys
gpg --list-keys user@email.com           # List specific user's key
gpg -k                                   # Short form: list public keys
gpg --list-secret-keys                   # List private/secret keys
gpg -K                                   # Short form: list secret keys
gpg --list-sigs                          # List keys with signatures
gpg --fingerprint                        # Show key fingerprints
gpg --fingerprint user@email.com         # Fingerprint for specific key
gpg --list-keys --keyid-format long      # Show long key IDs
gpg --list-keys --keyid-format 0xlong    # Show key IDs with 0x prefix

KEY INFORMATION#

gpg --edit-key KEY_ID                    # Interactive key editing
gpg --edit-key KEY_ID check              # Check key signatures
gpg --export-ownertrust                  # Export trust database
gpg --import-ownertrust file             # Import trust database

EXPORT KEYS#

# Export public key
gpg --export -a "User Name" > public.asc           # ASCII armored
gpg --export KEY_ID > public.gpg                   # Binary format
gpg --export --armor user@email.com                # To stdout
gpg --export -a KEY_ID > public_key.asc            # By key ID

# Export secret/private key (PROTECT THIS!)
gpg --export-secret-keys -a KEY_ID > private.asc   # ASCII armored
gpg --export-secret-keys KEY_ID > private.gpg      # Binary format
gpg --export-secret-subkeys -a KEY_ID > subkeys.asc  # Subkeys only

# Export specific subkey
gpg --export-secret-subkeys SUBKEY_ID! > subkey.gpg

IMPORT KEYS#

gpg --import public_key.asc              # Import public key
gpg --import private_key.asc             # Import private key
gpg --import keyfile.gpg                 # Import from binary file
curl URL | gpg --import                  # Import from URL
gpg --fetch-keys URL                     # Fetch and import from URL

DELETE KEYS#

gpg --delete-key KEY_ID                  # Delete public key
gpg --delete-secret-key KEY_ID           # Delete private key
gpg --delete-secret-and-public-key KEY_ID  # Delete both

ENCRYPTION#

# Encrypt for recipient
gpg -e -r recipient@email.com file.txt             # Encrypt file
gpg --encrypt --recipient KEY_ID file.txt          # Long form
gpg -e -r user1@email.com -r user2@email.com file  # Multiple recipients
gpg -e -a -r recipient file.txt                    # ASCII armored output

# Encrypt with specific output file
gpg -e -r recipient -o encrypted.gpg file.txt

# Symmetric encryption (password only, no keys)
gpg -c file.txt                          # Symmetric encrypt
gpg --symmetric file.txt                 # Long form
gpg -c --cipher-algo AES256 file.txt     # Specify cipher

# Encrypt and sign
gpg -e -s -r recipient file.txt          # Encrypt and sign
gpg --encrypt --sign --recipient KEY_ID file.txt

# Encrypt for self (backup)
gpg -e -r YOUR_KEY_ID file.txt

DECRYPTION#

gpg -d file.txt.gpg                      # Decrypt to stdout
gpg --decrypt file.txt.gpg               # Long form
gpg -d -o file.txt file.txt.gpg          # Decrypt to file
gpg --output file.txt --decrypt file.gpg # Long form with output
gpg -d encrypted.asc                     # Decrypt ASCII armored

# Decrypt and verify signature
gpg -d signed_encrypted.gpg              # Automatically verifies

SIGNING#

# Create detached signature
gpg -b file.txt                          # Binary detached signature
gpg --detach-sign file.txt               # Long form
gpg -ab file.txt                         # ASCII armored detached sig
gpg --armor --detach-sign file.txt       # Long form

# Create signed file (signature embedded)
gpg -s file.txt                          # Binary signed file
gpg --sign file.txt                      # Long form
gpg --clear-sign file.txt                # Cleartext signature (readable)
gpg --clearsign file.txt                 # Alternative spelling

# Sign with specific key
gpg -u KEY_ID -s file.txt                # Specify signing key
gpg --local-user KEY_ID --sign file.txt  # Long form

# Sign and encrypt
gpg -se -r recipient file.txt            # Sign and encrypt

VERIFICATION#

gpg --verify file.txt.sig                # Verify detached signature
gpg --verify file.txt.sig file.txt       # Verify with explicit file
gpg --verify signed_file.gpg             # Verify embedded signature
gpg -d signed_file.gpg                   # Decrypt and verify
gpg --verify message.asc                 # Verify cleartext signature

KEY SERVERS#

# Search for keys
gpg --search-keys user@email.com         # Search keyserver
gpg --keyserver hkps://keys.openpgp.org --search-keys user@email.com

# Download/receive keys
gpg --recv-keys KEY_ID                   # Receive key from server
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys KEY_ID
gpg --recv-keys 0xKEY_ID                 # With 0x prefix

# Upload/send keys
gpg --send-keys KEY_ID                   # Send key to server
gpg --keyserver hkps://keys.openpgp.org --send-keys KEY_ID

# Refresh keys (update from server)
gpg --refresh-keys                       # Refresh all keys
gpg --refresh-keys KEY_ID                # Refresh specific key

# Popular keyservers
# hkps://keys.openpgp.org (recommended, email verification)
# hkps://keyserver.ubuntu.com
# hkps://pgp.mit.edu
# hkps://keys.gnupg.net

TRUST MANAGEMENT#

gpg --edit-key KEY_ID trust              # Set trust level interactively

# Trust levels:
# 1 = Don't know
# 2 = I do NOT trust
# 3 = I trust marginally
# 4 = I trust fully
# 5 = I trust ultimately (only for your own keys)

gpg --edit-key KEY_ID sign               # Sign someone's key (certify)
gpg --edit-key KEY_ID lsign              # Local signature (not exported)
gpg --edit-key KEY_ID tsign              # Trust signature
gpg --check-trustdb                      # Update trust database
gpg --update-trustdb                     # Rebuild trust database

KEY EDITING#

gpg --edit-key KEY_ID                    # Enter edit mode

# Commands in edit mode:
# help      - Show available commands
# list      - List key and subkeys
# key N     - Select subkey N
# adduid    - Add user ID
# deluid    - Delete user ID
# addkey    - Add subkey
# delkey    - Delete subkey
# expire    - Change expiration
# passwd    - Change passphrase
# revkey    - Revoke key
# save      - Save and exit
# quit      - Exit without saving

# Add new subkey
gpg --edit-key KEY_ID addkey

# Change expiration
gpg --edit-key KEY_ID expire

# Change passphrase
gpg --edit-key KEY_ID passwd

REVOCATION#

# Generate revocation certificate (DO THIS AFTER KEY CREATION!)
gpg --gen-revoke KEY_ID > revoke.asc
gpg --output revoke.asc --gen-revoke KEY_ID

# Revoke a key (import revocation certificate)
gpg --import revoke.asc

# Revoke a subkey
gpg --edit-key KEY_ID
# > key 1 (select subkey)
# > revkey
# > save

CONFIGURATION#

# Config file location
~/.gnupg/gpg.conf                        # Main config
~/.gnupg/gpg-agent.conf                  # Agent config

# Useful gpg.conf options:
# default-key KEY_ID                     # Default signing key
# encrypt-to KEY_ID                      # Always encrypt to self
# armor                                  # Always ASCII output
# no-emit-version                        # Don't show version
# keyserver hkps://keys.openpgp.org      # Default keyserver
# keyserver-options auto-key-retrieve    # Auto-fetch keys
# personal-cipher-preferences AES256 AES192 AES
# personal-digest-preferences SHA512 SHA384 SHA256
# cert-digest-algo SHA512

# Reload agent after config changes
gpg-connect-agent reloadagent /bye

GPG AGENT#

gpg-agent --daemon                       # Start agent
gpgconf --kill gpg-agent                 # Stop agent
gpgconf --reload gpg-agent               # Reload agent
gpg-connect-agent reloadagent /bye       # Reload via socket
echo "RELOADAGENT" | gpg-connect-agent   # Alternative reload

# Agent config (~/.gnupg/gpg-agent.conf):
# default-cache-ttl 600                  # Cache passphrase 10 min
# max-cache-ttl 7200                     # Max cache 2 hours
# pinentry-program /usr/bin/pinentry-gtk-2

BATCH OPERATIONS#

# Batch encryption
for f in *.txt; do gpg -e -r recipient "$f"; done

# Batch decryption
for f in *.gpg; do gpg -d -o "${f%.gpg}" "$f"; done

# Batch signing
for f in *.tar.gz; do gpg -b "$f"; done

# Non-interactive operations
gpg --batch --yes --passphrase "pass" -d file.gpg
gpg --batch --pinentry-mode loopback --passphrase "pass" -d file.gpg

ARMOR OPTIONS#

gpg -a                                   # ASCII armor (short)
gpg --armor                              # ASCII armor (long)

# Armored output is base64 encoded, suitable for:
# - Email
# - Copy/paste
# - Text files
# - Web forms

# Binary output is smaller and faster for:
# - File storage
# - Automated processing

ALGORITHMS#

# List available algorithms
gpg --version                            # Shows supported algorithms

# Specify cipher for symmetric encryption
gpg -c --cipher-algo AES256 file         # AES-256
gpg -c --cipher-algo CAMELLIA256 file    # Camellia-256
gpg -c --cipher-algo TWOFISH file        # Twofish

# Specify digest for signing
gpg -s --digest-algo SHA512 file         # SHA-512
gpg -s --digest-algo SHA256 file         # SHA-256

# Modern recommended algorithms:
# Asymmetric: Ed25519 (sign), Cv25519 (encrypt), RSA-4096
# Symmetric: AES-256, Camellia-256
# Hash: SHA-512, SHA-256

SMARTCARD / YUBIKEY#

gpg --card-status                        # Show card info
gpg --card-edit                          # Edit card settings
gpg --edit-key KEY_ID keytocard          # Move key to card

# Card edit commands:
# admin     - Enable admin commands
# passwd    - Change PIN
# name      - Set cardholder name
# generate  - Generate key on card
# fetch     - Fetch key from URL on card

BACKUP AND RESTORE#

# Backup entire GPG directory
tar -czf gpg-backup.tar.gz ~/.gnupg/

# Backup specific key
gpg --export-secret-keys -a KEY_ID > private-key.asc
gpg --export -a KEY_ID > public-key.asc
gpg --export-ownertrust > trust.txt

# Restore
gpg --import private-key.asc
gpg --import public-key.asc
gpg --import-ownertrust trust.txt

# Backup to paper (paperkey)
gpg --export-secret-keys KEY_ID | paperkey --output paper-backup.txt

COMMON USE CASES#

# Encrypt file for someone
gpg -e -a -r recipient@email.com secret.txt

# Decrypt file sent to you
gpg -d secret.txt.asc > secret.txt

# Sign a release/file
gpg -ab release.tar.gz
# Creates release.tar.gz.asc (signature file)

# Verify downloaded file
gpg --verify file.tar.gz.asc file.tar.gz

# Encrypt password/credentials file
gpg -c -a passwords.txt

# Sign git commits (configure git)
git config --global user.signingkey KEY_ID
git config --global commit.gpgsign true

# Export public key for sharing
gpg --export -a "Your Name" > my_public_key.asc

TROUBLESHOOTING#

# Check GPG installation
gpg --version
which gpg

# Test encryption/decryption
echo "test" | gpg -e -r YOUR_KEY_ID | gpg -d

# Debug output
gpg -v --decrypt file.gpg               # Verbose
gpg -vv --decrypt file.gpg              # More verbose
gpg --debug-all --decrypt file.gpg      # Full debug

# Fix permissions
chmod 700 ~/.gnupg
chmod 600 ~/.gnupg/*

# Clear passphrase cache
gpg-connect-agent reloadagent /bye

# "No secret key" error
gpg --list-secret-keys                   # Check if key exists
gpg -K KEY_ID                            # Check specific key

# "Unusable public key" error
gpg --edit-key KEY_ID                    # Check key status
# Look for expired/revoked keys

SECURITY BEST PRACTICES#

1. Use strong passphrase for private key
2. Generate revocation certificate immediately after key creation
3. Store revocation certificate securely offline
4. Use subkeys for daily operations, keep primary key offline
5. Set expiration dates on keys (1-2 years)
6. Verify key fingerprints through secure channel
7. Back up private keys securely
8. Use hardware token (YubiKey) for high-security needs
9. Keep GPG software updated
10. Don't share private keys

QUICK REFERENCE#

gpg --gen-key                    # Generate key pair
gpg -k                           # List public keys
gpg -K                           # List private keys
gpg --fingerprint KEY_ID         # Show fingerprint
gpg -e -r recipient file         # Encrypt
gpg -d file.gpg                  # Decrypt
gpg -s file                      # Sign
gpg --verify file.sig            # Verify signature
gpg --import key.asc             # Import key
gpg --export -a KEY_ID           # Export public key
gpg --send-keys KEY_ID           # Upload to keyserver
gpg --recv-keys KEY_ID           # Download from keyserver