gpg

  • 这是一个gnu开源的非对称加密工具
  • 核心围绕公私钥展开

0x1 密钥流程

使用流程一般如下:

  1. 用户A 生成密钥对:

    1. A.PUB:公钥,用于加密
    2. A.PRI:私钥,用于解密
  2. A将A.PUB发布到公网或者直接发送给B
  3. B导入A.PUB
  4. B使用A.PUB加密文件
  5. A收到A.PUB加密的文件后使用A.PRI的解密文件

注意:

  1. 每一个密钥拥有userid以及fingerprint两个主键
  2. gpg会将解密用的userid/fingerprint写入加密文件中

0x2 生成密钥

  • 一切开始之前A需要先生成一份密钥,一共有三种主流方式
  • imazes替换成自己想要的userid
# 根据userid 快速创建 gpg
gpg --quick-gen-key imazes
# 交互创建密钥对,可选加密方式等参数
gpg --full-gen-key
# 提供比 --full-gen-key 更多的自定义参数
gpg --gen-key

0x3 密钥管理

  • 列出所有公钥

    gpg -k
  • 列出所有私钥

    gpg -K
  • 删除公钥(必须删除私钥)

    # 根据userid删除
    gpg --delete-keys imazes
    # 根据指纹才能静默删除
    gpg --delete-keys --batch --yes F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
  • 删除私钥

    gpg --delete-secret-keys imazes
    gpg --delete-secret-keys --batch --yes F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
  • 公钥导入导出

    gpg --export --armor imazes > imazes.pub.asc
    gpg --import imazes.pub.asc
  • 私钥导入导出

    gpg --export-secret-keys --armor imazes > imazes.asc 
    gpg --import imazes.asc

特殊参数:

  1. --yes:使用yes回答大多数交互选项
  2. --batch:强制关闭交互选项,使用此选项时只能使用fingerprint标识目标
  3. --armor:将密钥以文本形式存储

0x4 信任密钥

  • 系统默认不信任第三方密钥
  • 直接使用第三方证书时系统会发出警告,类似如下信息

    It is NOT certain that the key belongs to the person named
    in the user ID.  If you *really* know what you are doing,
    you may answer the next question with yes.
    
    Use this key anyway? (y/N)

解决办法有两个

  1. 直接信任证书

    gpg --edit-key imazes
    trust
    5
    yes
    save
  2. 命令行忽略警告

    gpg --batch --yes --trust-model always 
  3. 还有一个不是很推荐的做法,自动信任所有证书

    gpg --list-keys --fingerprint --with-colons |
    sed -E -n -e 's/^fpr:::::::::([0-9A-F]+):$/\1:6:/p' |
    gpg --import-ownertrust

0x5 加密解密

  1. 首先创建一份测试文件

    echo 123 >test.txt
  2. 接着使用指定公钥加密

    # 加密文件
    gpg --recipient imazes --yes  \
    --output test.en.txt --encrypt test.txt 
    
    # 强制使用证书
    gpg --recipient imazes --yes  \
    --batch --yes --trust-model always \
    --output test.en.txt --encrypt test.txt
    1. --recipient:指定使用的公钥
    2. --encrypt:源文件
    3. --output:输出文件
  3. 最后使用私钥解密

    gpg --output test.de.txt --decrypt test.en.txt 

0x6 分发密钥

  • gun等组织提供gpg公共服务器用于公开的分享公钥
  • gpg内置的密钥服务器keys.openpgp.org在使用中有很多限制,不推荐使用

  • 可以选择一些第三方gpg服务器

    # 服务器列表
    hkps://keyserver.ubuntu.com
    hkps://keys.gnupg.net
    hkps://keyserver.linux.it
    hkps://keyring.debian.org
    
    # 参数
    gpg --keyserver hkps://keyserver.ubuntu.com ...
  • 发布到服务器

    # 注意这里要使用指纹
    gpg --keyserver hkps://keyserver.ubuntu.com \
    --send-keys F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
  • 在服务器搜索

    gpg --keyserver hkps://keyserver.ubuntu.com \
    --search-keys F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
  • 从服务器下载

    gpg --keyserver hkps://keyserver.ubuntu.com \
    --recv-keys F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
  • 从服务器删除(需要有私钥)

    # 生成撤销声明
    gpg --output revoke.asc --gen-revoke imazes
    # 导入到本地系统
    gpg --import revoke.asc
    # 同步删除操作到服务器
    gpg --keyserver hkps://keyserver.ubuntu.com \
    --send-keys F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
    

0x7 对称加密

  • gpg提供不是很安全的对称加密
  • 仅在符合安全需求时可以使用
  1. 首先加密文件123.txt

    gpg --quiet --batch --yes --symmetric --passphrase="asd"  123.txt
  2. 接着解密

    gpg --quiet --batch --yes --decrypt --passphrase="asd" \
    --output 123.de.txt 123.txt.gpg
Last modification:May 6, 2022
如果觉得我的文章对你有用,请随意赞赏