如何使用 Python-GnuPG加密、签名数据和通讯



基于PGP的加密与解密
介绍
GnuPG 包[1]为生成和存储加密密钥提供了完整的解决方案。它还允许您对数据和通信进行加密和签名。
在本教程中,您将创建一系列使用 Python 3 和 python-gnupg[2] 模块的脚本。这些脚本将允许您对文件进行签名和加密,并验证文件是否被修改。
PGP、OpenPGP 和 GnuPG 加密之间的区别
对于这三种流行的加密形式,它们的相似之处在于 OpenPGP 是 PGP 的一种开放替代方案(我们稍后会解释原因),而 GnuPG 是基于 OpenPGP 标准的。迷茫了吗?
什么是 PGP?
Pretty Good Privacy[3],也称为 PGP,最初由 Phil Zimmerman 于 1991 年创建,作为人们在不被窃听的情况下进行交流的一种方式。今天,它被用来加密和解密短信和电子邮件。简而言之,这个想法是,当您想在某处发送加密的消息或文件时,您可以使用随机密钥对其进行加密,然后使用接收者的公钥对其进行加密。此公钥只能使用只有指定的私钥才能解密  。
这样,即使人们知道您的公钥,接收者也是唯一可以解密文件或消息的人。PGP 的问题是它不是一项公开专利,目前由赛门铁克持有。再回到 1990 年代,美国曾经有一项法律限制密码技术在美国以外的出口。PGP 在由 Phil Zimmerman 创建后很快就在海外被使用。Zimmerman 发布了 PGP 的源代码,允许任何一方基于原始 PGP 源代码创建自己的加密软件版本。由于源代码受到第一修正案的保护,因此自这些新版本以来,美国政府确实无能为力。几年后,这就是 OpenPGP 发挥作用的地方。
什么是 OpenPGP?
由于前面提到的专利问题,PGP 并不总是适合国际使用。这就是为什么在 Internet 工程任务组 (IETF) 中成立 OpenPGP 工作组[4]的原因。这消除了获得 PGP 许可的需要,并绕过了当时美国一些过时的法律。
如今,许多电子邮件客户端都提供对 OpenPGP 的支持,OpenPGP 仍然受到支持并正在积极开发中。
OpenPGP 是一种基于密钥的加密方法,用于加密文件,以便只有其预期的接收者才能接收和解密它们。OpenPGP 被广泛用于保护电子邮件通信,但它的技术也可以应用于 FTP。
OpenPGP 通过使用两个加密密钥来保护文件。公钥用于加密文件,以便只有其对应的私钥才能解密文件。
与 SSL 和 SSH 不同,OpenPGP 不是一种连接方式,而是一种在上传文件之前对其进行加密的方法。因此,OpenPGP 模式可以与标准 FTP、SSL 或 SSH 连接结合使用。
如您所见,它类似于 PGP 的工作方式。现在,由于 OpenPGP 是由 PGP 社区支持和开发的 IETF 支持的加密标准,因此当然还有其他标准从 OpenPGP 分支出来。最常见的是称为 GnuPG 的开源加密标准,也称为 Gnu Privacy Guard,简称 GPG。
什么是 GnuPG?
GnuPG[5] 是公司可以使用的另一种基于 OpenPGP 的免费加密标准。GnuPG 可替代赛门铁克的 PGP。主要区别在于支持的算法。然而,GnuPG 在设计上与 PGP 配合得很好。由于 GnuPG 是开放的,一些企业更喜欢赛门铁克 PGP 附带的技术支持和用户界面。需要注意的是,GnuPG 和 PGP 的兼容性之间存在一些细微差别,例如某些算法之间的兼容性,但在大多数应用程序(例如电子邮件)中,都有解决方法。一种这样的算法是 IDEA 模块[6],由于专利问题,它没有包含在 GnuPG 中。
准备工作
安装 GnuPG 程序
macOS,可以通过 brew install gpg 命令安装
Windows,建议下载安装 Gpg4win
Ubuntu 或者 Debian : sudo apt install gnupg
CentOS: sudo yum install gnupg2
创建 GnuPG 密钥对
不管 macOS、Linux 还是 Windows,都可以通过运行这个命令来生成密钥对
gpg --full-generate-key
Windows 下还可以通过运行 Gpg4win 的 Kleopatra 来生成密钥对。
macOS 和 Linux 可以从这里寻找自己喜欢的 GUI, https://www.openpgp.org/software/。
安装 python-gnupg
pip install python-gnupg
python-gnupg 是对 gnupg 的封装。
代码实现
接下来,我们按如下步骤来实现代码,
为文件创建分离的签名,通过将签名与文件分离来为签名过程添加一层安全性。
加密文件
解密文件
验证分离的签名。
签名
分离签名选项(--detach-sign)可用于为每个人提供在没有公钥的情况下查看消息的选项。如果需要,这将创建一个单独的签名文件,用于验证原始消息。在最简单的形式中,该文件包含原始消息的散列,并使用私钥加密。任何拥有公钥的人都可以打开签名,然后比较哈希值来验证签名文件的完整性。

import gnupgfrom  pathlib import  Pathgpg = gnupg.GPG(gnupghome="/Users/steven/.gnupg")path ="abc.txt"with open(path, "rb") as f:  signed = gpg.sign_file(f,passphrase="qwert",detach = True, output=path+".sig")  print ('status: ', signed.status)
/Users/steven/.gnupg 为 gnupg 存放密钥的位置,默认为当前用户的.gnupg 目录。
passphrase="qwert" 为密钥中私钥加密密码
detach = True 创建分离的签名
返回
status:  signature created
加密
import gnupggpg = gnupg.GPG(gnupghome="/Users/steven/.gnupg")path ="abc.txt"with open(path, 'rb') as f:    status = gpg.encrypt_file(        f, passphrase="qwert",recipients=['Steven Lee <steven@alitrack.com>'],        output=path+".gpg"    )    print ('status: ', status.status)
recipients=['Steven Lee <steven@alitrack.com>'] 这个是创建密钥的时候输入的姓名和邮箱,创建的时候,姓名可以为空,如果为空,则 recipients 为
recipients=['steven@alitrack.com']
status:  encryption ok
解密
import gnupgfrom  pathlib import  Pathgpg = gnupg.GPG(gnupghome="/Users/steven/.gnupg")path ="abc.txt.gpg"with open(path, 'rb') as f:    status = gpg.decrypt_file(f, passphrase="qwert",output=Path(path).stem+"_dec")    print ('status: ', status.status)
返回
status:  decryption ok
验证
import gnupgfrom  pathlib import  Pathgpg = gnupg.GPG(gnupghome="/Users/steven/.gnupg")path ="abc.txt.sig"with open(path, "rb") as f:  verify = gpg.verify_file(f,Path(path).stem+"_dec")  print ('status: ', verify.status)
返回
status:  signature valid
参考资料
[1]
GnuPG 包: https://www.gnupg.org/[2]
python-gnupg: https://pythonhosted.org/python-gnupg/[3]
Pretty Good Privacy: https://www.binance.vision/security/what-is-pgp[4]
OpenPGP 工作组: https://www.openpgp.org/about/[5]
GnuPG: https://gnupg.org/[6]
IDEA 模块: http://www.spywarewarrior.com/uiuc/gpg-idea/gpg-idea.htm
P.S. Gpg4win 简介
Gpg4win 是用于 Microsoft Windows 上的电子邮件与文件的加密软件, 使用了 GnuPG 公钥加密。Gpg4win 最初得到了德国联邦信息安全办公室的资助。Gpg4win 及其所有包含的工具都是自由及开放源代码软件,Windows 平台上典型的非商用选择。
Gpg4win 安装内容简介:
GnuPG: 核心加密工具
Kleopatra: 用于 OpenPGP 与 X.509 的证书管理。
GPA: 另一个可选的证书管理
GpgOL: Microsoft Outlook 插件,用于电子邮件加密
GpgEX: Windows Explorer 插件,用于文件加密
Gpg4win Compendium : Gpg4win2 的文档
到顶部