GPG 技术研究

PGP, Pretty Good Privacy

PGP 加密

PGP 是 Pretty Good Privacy 的缩写,是一种用于加密和验证电子邮件、文件和其他数据的加密技术。PGP 使用一对密钥来实现安全通信:公钥和私钥。公钥用于加密数据,私钥用于解密数据。

PGP 加密的工作原理如下:

  • 发件人使用收件人的公钥来加密消息。
  • 收件人使用自己的私钥来解密消息。

PGP 加密可以防止未经授权的用户读取或修改数据。它还可以用于验证消息的来源和完整性。

PGP 原理

PGP 加密的优点

PGP 加密具有以下优点:

  • 安全:PGP 加密使用强大的加密算法来保护数据。
  • 可靠:PGP 加密可以防止数据被未经授权的用户读取或修改。
  • 灵活:PGP 可以用于加密和验证电子邮件、文件和其他数据。

PGP 加密的缺点

PGP 加密具有以下缺点:

  • 复杂性:PGP 加密的使用可能比较复杂。
  • 性能:PGP 加密可能会影响数据传输的性能。

PGP 加密的用途

PGP 加密可用于以下场景:

  • 保护敏感数据,例如财务信息、医疗记录和法律文件。
  • 在线交易,例如网上银行和电子商务。
  • 通信安全,例如加密电子邮件和文件共享。

PGP 加密的替代方案

PGP 加密的替代方案包括:

  • S/MIME:S/MIME 是另一种用于加密和验证电子邮件的标准。
  • SSL/TLS:SSL/TLS 是用于加密网络通信的标准。

PGP 加密的安全建议

为了确保 PGP 加密的安全性,应注意以下建议:

  • 使用强大的密码来保护私钥。
  • 定期备份私钥。
  • 注意 PGP 的安全更新。

GnuPG, GNU Privacy Guard

关于 GunPG

GnuPG 是一个自由软件,遵循 IETF 制定的 OpenPGP 技术标准设计,并与 PGP 保持兼容。GnuPG 可以用于加密、签名通信内容及管理非对称密码学的密钥。GnuPG 提供以下功能:

  • 公钥加密:GnuPG 使用公钥加密来保护数据免受未经授权的访问。公钥是公开的,而私钥是私有的。
  • 数字签名:GnuPG 使用数字签名来验证文件的完整性和来源。数字签名使用私钥生成,并可以使用公钥来验证。
  • 信任网:GnuPG 使用信任网来确定其他用户的身份。信任网是用户相互签名以建立信任关系的系统。
  • 钥匙管理:GnuPG 提供了一个钥匙管理系统来存储和管理您的密钥。

GunPG 命令

CMDLINE

gpg 是 GnuPG 命令行的名称,CMDLINE 主要是 gpg。

gpg key 管理逻辑:
  • 安装:yum install gunpg,参考 GnuPG - Download
  • 生成 key:gpg --full-generate-key
  • 导入 key:gpg --import ${filename}.[pub|priv].gpg
  • 导出 public key:gpg --armor --export ${UID} --output ${filename}.pub.gpg
  • 导出 secret key:gpg --armor --export-secret-keys ${UID} --output ${filename}.priv.gpg
  • 删除 public key:gpg --delete-key ${UID}
  • 删除 secret key:gpg --delete-secret-key ${UID}
  • 备份和恢复 gpg:
#backup
gpg -a --export ${UID} > public.gpg
gpg -a --export-secret-keys ${UID} > private.gpg
gpg --export-ownertrust > ${UID}-ownertrust-gpg.txt

#restore
gpg --import private.gpg
gpg --import-ownertrust ${UID}-ownertrust-gpg.txt
gpg key 签名校验:
  1. signed copy
  2. detached sign
  3. decrypt signed copy
  4. verify sign
[root@local tmp]# gpg --armor --sign T1003.008.txt
File 'T1003.008.txt.asc' exists. Overwrite? (y/N) y
[root@iZj6cex3nnjiwsx7lgqazhZ tmp]# cat T1003.008.txt.asc
-----BEGIN PGP MESSAGE-----

owGbwMvMwMGo+k5r/pd9mqcZ1zI3JPGGGBoYGOsZGFjolVSUpAoaKhTl55dYqVSq
ZFmGqCR6+4eUVQQFhvuXuZcFOfs4J4frGxmqlHpkBaSa55qEJFfpmbulGhTrVQQZ
eHsnB/g5+aWHuYYllYaH53uklJh4mlsZWpqam1sZWFmCgJW5lZUVV1JmnpUWUMLY
DE0iJTE1Nx+HXGJKLnaJnALs4sWVeck4ZDJKS1Lyy3FYlJGYU4JdJjcxMwe7TH5B
alFiSX4Rdtn0xNzUYuxSaSU4XJ+Xn5SfUokjmJJKi60UFUFBa2JqBQZcJcUYQsWV
xSWpuSm6eakl5flF2VaKWlil8/NzcUkVpRbn55SloksX5OdkZ5akYNhXXIxFLAND
LDmjKD+vEpdrk/OLUlNKcwtwuakkExiYoKhFky9JLoBoQzU2Ma+0OLUIlp7Dw82T
Ew3S9ZNSTM0rk80Ckp3MLcz1VdJDqhwzvPLSqpJczQP89SwtA8yCMr0So3IrjCLy
vL31k1OdKov13ExySkyghqPER0lqcQnIFkOo5eYWmPJQKQtjVKlOJmMWBkYOBlkx
RZbV5Qzn39ktOpYpu2ErLI+yMoGyJAMXpwBM5BwL/z/j8jrxc77rWMWLfB5XbWEw
uxm7d5/0YuGp02ISegwFG9iPKdrN53827+8s948bWTX+SD7/b/Vnr/3Fcgch5u1L
FfQO8cf8WGLZda1g+Te3DdWJLJ19R0s+cN33M9ry7uiqjRP2qxr9Oc3GkRTnGfrg
/EkdQ72o1QdCDnnnmy78ve7Lzw6L/l3vpjw82Hr8RvBG/7jz3ucVd3FKNc5I+H7u
6DOnQ3H8wRs/pC1extq77vB99ua0sChG0bvnwt/xrqj5fF1NWOlmrXptaG3P18Za
Nt426bN7d53Z9nJV4fuZSwODv3yY923VjkUcAjbT6pb4TzpzPOVp6+3cUr0vEibn
Xr+sVWCK0KyK39L0vF1RZLupp/XJtxs6ZWe+DLRT2nGjfOc5pVybS5/PlJ7sda4R
jNnHbrP37492sW6TnCu/jjfPk0hoOlF/Yb636QM9k7PasfbmyUs/HU+U/fG+/ei3
7libG84WJTfYVcK2hLXfYd1wTDROeZrIke8im7tbNy5cVX//fqbY893LfqzQM7Rz
WrPvjfjPow/mX7gsX3245qbTxajrB7T2qXv+bC50eF+dFTLJx+jKp19tJxaGTu0R
l6ttnzUnQFHfaifTKVPFJ9asjxvll6Wc1vPU//fzoDxb5I/l+kKVu0obF+6amPWs
57itQfCTlTZyjx+dDjj2vLBAnC3t8f6a3u8T+w/ldeWfXsnry5FzpPhejfkVAA==
=UTKO
-----END PGP MESSAGE-----
[root@local tmp]# gpg --decrypt T1003.008.txt.asc
bin:*:19367:0:99999:7:::
daemon:*:19367:0:99999:7:::
adm:*:19367:0:99999:7:::
lp:*:19367:0:99999:7:::
sync:*:19367:0:99999:7:::
shutdown:*:19367:0:99999:7:::
halt:*:19367:0:99999:7:::
mail:*:19367:0:99999:7:::
operator:*:19367:0:99999:7:::
games:*:19367:0:99999:7:::
ftp:*:19367:0:99999:7:::
nobody:*:19367:0:99999:7:::
dbus:!!:19545::::::
tss:!!:19545::::::
systemd-network:!*:19545::::::
systemd-oom:!*:19545::::::
systemd-resolve:!*:19545::::::
polkitd:!!:19545::::::
sssd:!!:19545::::::
sshd:!!:19545::::::
chrony:!!:19545::::::
systemd-coredump:!*:19545::::::
systemd-timesync:!*:19545::::::
tcpdump:!!:19545::::::
gpg: Signature made Mon 25 Sep 2023 03:05:04 PM CST
gpg:                using RSA key AB7700CFEE3EA2C6691DB0B525EE2A9FF4BE29CB
gpg: Good signature from "tmp-test-gpg (TMP Test GPG) <TMP@example.com>" [ultimate]

########################################################################################################################################

[root@local tmp]# gpg --armor --output T1003.008.txt.detached.sig --detach-sign T1003.008.txt
File 'T1003.008.txt.detached.sig' exists. Overwrite? (y/N) y
[root@local tmp]# cat T1003.008.txt.detached.sig
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEq3cAz+4+osZpHbC1Je4qn/S+KcsFAmURMXcACgkQJe4qn/S+
Kcuw3RAArIno+GHp29NPLsCP26i/bKQWEEpxLbcT5Z22RSTPh4Zvrr+N36MicEEg
oIYYTLt7ftlx0xQ3+SI2viWWKR+liWvn+iYlT75tgxoa2tjk6mipfB/bnP+lOQPc
AVGrr4ddVy9OA8vjY/xT9aBAsTfBQASSwBUzCBozIwG/7rSo1U/YBxqco8jXdJNS
289WiQuVRUOpMzKCE4DXS4in5Lwns9lgB7QCnmPiaWPAoOQ/Cn72vCqzTIJwy/q1
VDo4pTlsh/YiyvEmJteUtSFXJREuCbNM6kDzqdJpMjKyrrHyaD/lw/aVB5dO1/zq
QzCnXBCnri7fH8yHIVa4XW1eWKGp6EM70vpF+Y3XKb84se4jF3+b2cbD1pvbtMMB
b6cTii69/rAvpHM2yrxUEY3pgL7LVKh3x984m/hH56IhwlrO3XZLrXgX9JH0nYBq
x/xlbSD1cqyIMcPNekT4i0OU7Gi3A5f+iDoeO6EyRO8qoUFML7ZAOg8GYffgUahX
I0XA5r04YJdMvHsYqLkv4I3sqsX6Oo4M2VD9ny4+qfg/9boBVAQiblEKBGdrj1D9
SB1JI3XvMopzlgRTIvFwdG2VBVtf1sQiwL3Mctdk3jVarF/q2UmkHENbDcZh3xMa
o8AtMs9X6iL8KKpc7tyjvQNlbG5onLcq5iIWmgSv0nwjfi6zbz0=
=nLh9
-----END PGP SIGNATURE-----
[root@local tmp]# gpg --verify T1003.008.txt.detached.sig T1003.008.txt
gpg: Signature made Mon 25 Sep 2023 03:06:31 PM CST
gpg:                using RSA key AB7700CFEE3EA2C6691DB0B525EE2A9FF4BE29CB
gpg: Good signature from "tmp-test-gpg (TMP Test GPG) <tmp@example.com>" [ultimate]

API

GnuPG 提供了 library gpgme,它是 C 技术栈。

Go 对于 GnuPG 也有的支持,只是 golang 官方不再维护了,可以参考这个讨论,目前还有一个 go 的 library 就是 ProtonMail/gopenpgp

References

  1. What is PGP Encryption? Pretty Good Privacy Explained | Fortinet
  2. Pretty Good Privacy - Wikipedia
  3. Getting Started (The ‘GnuPG Made Easy’ Reference Manual)
  4. GopenPGP | An easy-to-use OpenPGP wrapper library written in golang