• GPG加密解密


    目录

    一、GPG的用途

    二、安装

    三、GPG命令显示

    四、生成密钥-输出密钥-上传自己公钥-输入他人公钥

    1、生成密钥

    2、列出密钥

    3、如果要从密钥列表删除某个密钥,执行delete-key

    4、输出密钥

    5、上传公钥

    6、输入密钥

    五、加密和解密

    1、加密 encrypt

    2、解密

    六、签名

    1、对文件签名

    2、签名+加密

    3、验证签名


    一、GPG的用途

    1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。

    GPG有许多用途,本文主要介绍文件加密。至于邮件的加密,不同的邮件客户端有不同的设置。

    二、安装

    1. 下载源码安装 
    2. ./configure
    3.   make
    4.   make install
    5. 命令安装
    6. # Debian环境
    7. sudo apt-get install gnupg
    8. # Fedora 环境
    9. yum install gnupg

    三、GPG命令显示

    1. root@kali2022:~# gpg --help
    2. gpg (GnuPG) 2.2.35
    3. libgcrypt 1.10.1
    4. Copyright (C) 2022 g10 Code GmbH
    5. License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
    6. This is free software: you are free to change and redistribute it.
    7. There is NO WARRANTY, to the extent permitted by law.
    8. Home: /root/.gnupg
    9. 支持的算法:
    10. 公钥: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
    11. 密文: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
    12. CAMELLIA128, CAMELLIA192, CAMELLIA256
    13. 散列: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
    14. 压缩: 不压缩, ZIP, ZLIB, BZIP2
    15. 语法:gpg [选项] [文件]
    16. 签名、检查、加密或解密
    17. 默认的操作依输入数据而定
    18. 命令:
    19. -s, --sign 生成一份签名
    20. --clear-sign 生成一份明文签名
    21. -b, --detach-sign 生成一份分离的签名
    22. -e, --encrypt 加密数据
    23. -c, --symmetric 仅使用对称密文加密
    24. -d, --decrypt 解密数据(默认)
    25. --verify 验证签名
    26. -k, --list-keys 列出密钥
    27. --list-signatures 列出密钥和签名
    28. --check-signatures 列出并检查密钥签名
    29. --fingerprint 列出密钥和指纹
    30. -K, --list-secret-keys 列出私钥
    31. --generate-key 生成一个新的密钥对
    32. --quick-generate-key 快速生成一个新的密钥对
    33. --quick-add-uid 快速添加一个新的用户标识
    34. --quick-revoke-uid 快速吊销一个用户标识
    35. --quick-set-expire 快速设置一个过期日期
    36. --full-generate-key 完整功能的密钥对生成
    37. --generate-revocation 生成一份吊销证书
    38. --delete-keys 从公钥钥匙环里删除密钥
    39. --delete-secret-keys 从私钥钥匙环里删除密钥
    40. --quick-sign-key 快速签名一个密钥
    41. --quick-lsign-key 快速本地签名一个密钥
    42. --quick-revoke-sig 快速吊销一个密钥签名
    43. --sign-key 签名一个密钥
    44. --lsign-key 本地签名一个密钥
    45. --edit-key 签名或编辑一个密钥
    46. --change-passphrase 更改密码
    47. --export 导出密钥
    48. --send-keys 将密钥导出到一个公钥服务器上
    49. --receive-keys 从公钥服务器上导入密钥
    50. --search-keys 在公钥服务器上搜索密钥
    51. --refresh-keys 从公钥服务器更新所有密钥
    52. --import 导入/合并密钥
    53. --card-status 打印卡片状态
    54. --edit-card 更改卡片上的数据
    55. --change-pin 更改卡片的 PIN
    56. --update-trustdb 更新信任数据库
    57. --print-md 打印消息摘要
    58. --server 以服务器模式运行
    59. --tofu-policy VALUE 设置一个密钥的 TOFU 政策
    60. 控制诊断输出的选项:
    61. -v, --verbose 详细模式
    62. -q, --quiet 尽量减少提示信息
    63. --options FILE 从 FILE 中读取选项
    64. --log-file FILE 将服务器模式的日志写入到 FILE
    65. 控制配置的选项:
    66. --default-key NAME 使用 NAME 作为默认的私钥
    67. --encrypt-to NAME 同时给以 NAME 为名称的用户标识加密
    68. --group SPEC 设置电子邮件别名
    69. --openpgp 使用严格的 OpenPGP 行为
    70. -n, --dry-run 不做任何更改
    71. -i, --interactive 覆盖前提示
    72. Options controlling the output:
    73. -a, --armor 创建 ASCII 字符封装的输出
    74. -o, --output FILE 写输出到 FILE
    75. --textmode 使用规范的文本模式
    76. -z N 设置压缩等级为 N (0 为禁用)
    77. Options controlling key import and export:
    78. --auto-key-locate MECHANISMS 通过邮件地址定位密钥时使用机制 MECHANISMS
    79. --disable-dirmngr 禁用对 dirmngr 的所有访问
    80. Options to specify keys:
    81. -r, --recipient USER-ID 为 USER-ID 加密
    82. -u, --local-user USER-ID 使用 USER-ID 来签名或者解密
    83. Project-Id-Version: GNU gnupg 2.2.28
    84. Report-Msgid-Bugs-To: translations@gnupg.org
    85. PO-Revision-Date: 2021-06-17 11:52+0900
    86. Last-Translator: bobwxc <bobwxc@yeah.net>
    87. Language-Team: None
    88. Language: zh_CN
    89. MIME-Version: 1.0
    90. Content-Type: text/plain; charset=UTF-8
    91. Content-Transfer-Encoding: 8bit
    92. X-Poedit-SourceCharset: UTF-8
    93. X-Poedit-Basepath: .
    94. Plural-Forms: nplurals=1; plural=0;
    95. X-Generator: Poedit 2.2.1
    96. :
    97. (请参考手册页以获得所有命令和选项的完整列表)
    98. 例子:
    99. -se -r Bob [文件] 为用户 Bob 签名和加密
    100. --clear-sign [文件] 创建一个明文签名
    101. --detach-sign [文件] 创建一个分离签名
    102. --list-keys [名字] 列出密钥
    103. --fingerprint [名字] 显示指纹
    104. 请向 <https://bugs.gnupg.org> 报告程序缺陷。
    105. 请向 <i18n-zh@googlegroups.com> 邮件列表反映简体中文的翻译问题或建议。

    四、生成密钥-输出密钥-上传自己公钥-输入他人公钥

    1、生成密钥

    1. # 使用gen-ken参数生成自己的密钥:
    2. gpg --gen-key
    3. root@kali2022:~# gpg --gen-key
    4. gpg (GnuPG) 2.2.35; Copyright (C) 2022 g10 Code GmbH
    5. This is free software: you are free to change and redistribute it.
    6. There is NO WARRANTY, to the extent permitted by law.
    7. 注意:使用 “gpg --full-generate-key” 以获得一个全功能的密钥生成对话框。
    8. GnuPG 需要构建用户标识以辨认您的密钥。
    9. 真实姓名: kali2022
    10. 电子邮件地址: 123456789@qq.com
    11. 您选定了此用户标识:
    12. “kali2022 <123456789@qq.com>”
    13. 更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o
    14. 我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
    15. 、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
    16. 发生器有更好的机会获得足够的熵。
    17. 我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
    18. 、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
    19. 发生器有更好的机会获得足够的熵。
    20. gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
    21. gpg: 目录‘/root/.gnupg/openpgp-revocs.d’已创建
    22. gpg: 吊销证书已被存储为‘/root/.gnupg/openpgp-revocs.d/A33A11AFD55A36DE3B7E2A245E0D9B67FB67220E.rev’
    23. 公钥和私钥已经生成并被签名。
    24. pub rsa3072 2022-08-13 [SC] [有效至:2024-08-12]
    25. A33A11AFD55A36DE3B7E2A245E0D9B67FB67220E
    26. uid kali2022 <123456789@qq.com>
    27. sub rsa3072 2022-08-13 [E] [有效至:2024-08-12]

    最好再生成一张"撤销证书",以备以后密钥作废时,可以请求外部的公钥服务器撤销你的公钥

    1. # 生成撤销证书
    2. gpg --gen-revoke [用户ID]
    3. root@kali2022:~# gpg --gen-revoke A33A11AFD55A36DE3B7E2A245E0D9B67FB67220E
    4. sec rsa3072/5E0D9B67FB67220E 2022-08-13 kali2022 <123456789@qq.com>
    5. 要为这个密钥创建一个吊销证书吗?(y/N) y
    6. 请选择吊销的原因:
    7. 0 = 未指定原因
    8. 1 = 密钥已泄漏
    9. 2 = 密钥被替换
    10. 3 = 密钥不再使用
    11. Q = 取消
    12. (也许您会想要在这里选择 1
    13. 您的决定是什么? 0
    14. 请输入描述(可选);以空白行结束:
    15. >
    16. 吊销原因:未指定原因
    17. (未给定描述)
    18. 这样可以吗? (y/N) y
    19. 已强行使用 ASCII 字符封装过的输出。
    20. -----BEGIN PGP PUBLIC KEY BLOCK-----
    21. Comment: This is a revocation certificate
    22. iQG2BCABCgAgFiEEozoRr9VaNt47fiokXg2bZ/tnIg4FAmL3V2kCHQAACgkQXg2b
    23. Z/tnIg6SPgwAhcNz/WV2KrfxVbhymowngF1MdHqSoUS0TlVjy2t1HLMMLIDYp7Ua
    24. cuOy4KghGp5jkdSYqTWksvHLfqrL/SugHHQ6zuWoMTgx8pqSpremPWgNLvIuLzdh
    25. grdRBHq+Q/dIWmoH3YkLzR+FfZ9fy9A6hw4Oahqbu7VOrBS/sA1OKvrVg8NWosN7
    26. +lQCU1ss0mD0jos2dHnNYuNuXJaRLxpJ70WUDfICU1po7Jc36FABnKxI8IznWgUa
    27. tOslJvClU7870m42yyN4sfFDqVpmAGbq+YV+1DGc9akpLMtEiO1Hnu/tpN4MvPll
    28. DxVPVQ3sMAIZJGDcfmaigLekf/4On+0M7Uy6WOlA+ZiY59UMBKX/SQCXSBrEcJLT
    29. DolXOrkXiZtGb9/L7RpXHvWwMnXbucrQY/xMbf0alheWwFmdY51OwVf3lPXUF09k
    30. kly+gujMrI1R9ljiddjhlnHfaYuBhxxA1vAhL5M6tFpoOG/WO3F05qpoZah1g7R4
    31. XLY/YKF5LhQe
    32. =L+Pw
    33. -----END PGP PUBLIC KEY BLOCK-----
    34. 已创建吊销证书。
    35. 请把这个文件转移到一个您可以藏起来的介质上;如果坏人获取到了这
    36. 份证书的话,那么他就能使用它并让您的密钥无法继续使用。把此证书
    37. 打印出来再存放到安全的地方也是很好的方法,以免您的保存媒体变得
    38. 不可读。但是千万小心:您机器上的打印系统可能会在打印过程中储存
    39. 这些数据,并使得其他人看到!

    2、列出密钥

    1. # 列出密钥
    2. root@kali2022:~# gpg --list-keys
    3. gpg: 正在检查信任度数据库
    4. gpg: marginals needed: 3 completes needed: 1 trust model: pgp
    5. gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u
    6. gpg: 下次信任度数据库检查将于 2024-08-12 进行
    7. /root/.gnupg/pubring.kbx #公钥文件名(pubring.kbx)
    8. ------------------------
    9. pub rsa3072 2022-08-13 [SC] [有效至:2024-08-12] # 显示公钥特征(4096位,生成时间)
    10. A33A11AFD55A36DE3B7E2A245E0D9B67FB67220E # hash值字符串
    11. uid [ 绝对 ] kali2022 <123456789@qq.com> # 显示用户id
    12. sub rsa3072 2022-08-13 [E] [有效至:2024-08-12] # 显示私钥特征

    3、如果要从密钥列表删除某个密钥,执行delete-key

    gpg --delete-key[用户id]

    4、输出密钥

    公钥文件(/root/.gnnupg/pubring.kbx )以二进制形式存储,armor可以将其转换为ascii码显示

    私钥文件()以ascii码形式存储,export-secret-keys参数可以将其转换成二进制文件

    1. # 将二进制公钥文件转换为ascii码显示 
    2. gpg --armor --output public-key.txt --export [用户ID]
    3. # 将ascii码私钥文件转换未二进制公钥我呢见
    4. gpg --armor --output private-key.txt --export-secret-keys

    5、上传公钥

    公钥服务器是网上专门储存用户公钥的服务器。send-keys参数可以将公钥上传到服务器。然后通过交换机制,所有的公钥服务器都会包含你的公钥。

    由于公钥服务器没有检查机制,任何人都可以用你的名义上传公钥,所以没有办法保证服务器上的公钥的可靠性。通常,你可以在网站上公布一个公钥指纹,核对下载到的公钥是否为真。fingerprint参数生成公钥指纹

    1. # 将公钥上传到公钥服务器
    2. gpg --send-keys [用户ID] --keyserver hkp://subkeys.pgp.net
    3. # 生成公钥指纹,核对下载到的公钥是否为真
    4. gpg --fingerprint [用户ID]

    6、输入密钥

    生成自己的密钥后,还要[import参数]将他人的公钥或者你的其他密钥导入系统。

    想要获得他人的公钥,可以让对方直接发给你,或者到公钥服务器上找。

    1. # 将他人的公钥或者你的其他密钥导入系统
    2. gpg --import [密钥文件]
    3. # 获取他人公钥,下载后记得用其他方法验证密钥的真假
    4. gpg --keyserver hkp://subkeys.pgp.net --search-keys [用户ID]

    五、加密和解密

    1、加密 encrypt

    1. # 对text.txt加密 【encrypt参数用于加密】 
    2. gpg --recipient [用户ID] --output demo.en.txt --encrypt text.txt
    3. # recipient--指定接收者的公钥;
    4. # output--指定加密后的文件名
    5. # encrypt--指定源文件。
    6. # 执行命令后,text.en.txt就是已加密的文件,可以把它发给对方。

    2、解密

    1. # 对方收到加密文件后,用自己的私钥解密,解密后的文件内容直接标准输出显示
    2. gpg --decrypt test.en.txt --output test.de.txt
    3. gpg --decrypt test.en.txt
    4. # decrypt--指定需要解密的文件
    5. # output--指定解密后生成的文件
    6. # 执行命令后,test.de.txt就是解密后的文件。
    7. #GPG允许省略decrypt
    8. gpg test.en.txt

    六、签名

    1、对文件签名

    1. # 有时不需要加密文件,只要对文件签名,表示这个文件确实是我本人发出的;sign--用来签名;
    2. gpg --sign test.txt
    3. # 执行后,生成签名后的文件test.txt.gpg文件,采用二进制储存,
    4. # 如果要生成ASCII码的签名文件,要用clearsign参数。
    5. gpg --clearsign test.txt
    6. # 执行命令后,当前目录下生成test.txt.asc文件,后缀名asc表示该文件是ASCII码形式的。
    7. # 想生成单独的签名文件,与文件内容分开存放,可以用detach-sign
    8. gpg --detach-sign test.txt
    9. # 当前目录下生成一个单独的签名文件test.txt.sig,该文件是二进制形式的,
    10. # 如果想采用ASCII码形式,要加armor参数
    11. gpg --armor --detach-sign test.txt

    2、签名+加密

    1. # 同时签名和加密
    2. gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt tst.txt
    3. # local-user---指定用发信者的私钥签名
    4. # recipient---指定用接收者的公钥加密
    5. # armor---表示采用ASCII码形式显示
    6. # sign---表示需要签名
    7. # encrypt---表示指定源文件

    3、验证签名

    1. # 收到别人签名后的文件,需要用对方的公钥验证签名是否为真;verify---用来验证
    2.   gpg --verify test.txt.asc test.txt
    3. # https://openvpn.net/网站就提供每一个下载包的gpg签名文件.可以根据它的说明,验证这些下载包是否为真。
  • 相关阅读:
    [C#]C#调用cplex
    如何创建rpm包
    2019十大最难A-level科目,看看哪些科目当选
    【附源码】计算机毕业设计SSM网上开发商售楼及管理信息系统
    流媒体集群应用与配置:如何在一台服务器部署多个EasyCVR?
    qt 虚拟键盘中的几个瑕疵
    Web3 | DID赛道之 Galxe(原 Project Galaxy)
    专业游戏翻译公司怎么选择比较合适
    网上的搜索
    【尚硅谷】MyBatis(一)
  • 原文地址:https://blog.csdn.net/single_g_l/article/details/126320243