如何做到PGP Python(生成密钥进行加密/解密)
-
06-07-2019 - |
题
我在做一个程序在蟒蛇被分发到windows用户通过一个安装程序。
该计划需要能够下载的文件每天都进行加密的用户的公用钥匙然后解密。
所以我需要找到一条巨蟒库,这将让我产生的公共和私人PGP键,并还解密的文件加密的公共关键。
这是什么pyCrypto会做(文件含糊不清的)?还有没有其他的纯Python库?如何对一个独立的命令行的工具,在任何语言?
所有我看到迄今为止是GNUPG但安装在窗不会的东西的登记和投dll的无处不在,那么我担心的用户是否已经有的这个安装,如何备用他们现有的钥匙,等等。我宁愿只有一个python库或命令行工具和管理的钥匙我自己。
更新:pyME可能的工作,但它似乎并不是兼容Python2.4我已经使用。
解决方案
你不需要 PyCrypto
或 PyMe
, ,细虽然这些软件包可以是-你将会有各种各样的问题建设的窗口。相反,为什么避免不了兔子洞,并做我做了什么?使用 gnupg 1.4.9
.你不需要做一个完整的安装在终端用户机-只是 gpg.exe
和 iconv.dll
从分配是足够的,你只需要让他们在某处的路径或访问从你的代码使用一个完整的路径名。没有更改注册是必要的,一切(可执行文件和数据文件),可以局限于一个单一的文件夹,如果你想要的。
有一个模块 GPG.py
它最初是由安德鲁Kuchling,改进通过理查德*琼斯的和改进的进一步通过史蒂夫Traugott.它是可以 在这里,, 但是这不适用于Windows,因为它使用 os.fork()
.虽然最初的一部分 PyCrypto
, 它是完全独立于其他部分 PyCrypto
只需要gpg.exe/iconv.dll 为了工作.
我有一个版本(gnupg.py
)衍生自Traugott的 GPG.py
, ,其采用的 subprocess
模块。它的工作现在Windows,至少对我的目的-我用它来做到以下几点:
- 关键的管理、清单、出口等等。
- 进口键从外部来源(例如公共钥匙接收来自合作公司)
- 进行加密和解密数据
- 签字和验证的签名
该模块我不是想显示,现在,因为它包括一些其他的东西,它不应该存在-这意味着我不能释放这样的时刻。在某一点,也许在未来的几个星期,我希望能够整洁起来,添加一些更多的单元测试(我没有任何单元的测试为登录/核查,例如)和释放(或者在原来的 PyCrypto
许可证或类似的商业友好的许可证).如果你等不及了,去Traugott的模块和修改它自己的-这是不太多的工作,使其工作与 subprocess
模块。
这种做法是一个痛苦很少于其他人(例如 SWIG
-基础的解决方案,或方案要求建筑 MinGW
/MSYS
),我考虑和尝试了。我已经使用的相同(gpg.exe
/iconv.dll
)的办法与系统其他语言编写的,例如 C#
, 与同样痛苦的结果。
P.S.它的工作与Python2.4以及Python2.5和后。不过测试的其他版本,虽然我没有预见任何问题。
其他提示
import pgpy
emsg = pgpy.PGPMessage.from_file(<path to the file from the client that was encrypted using your public key>)
key,_ = pgpy.PGPKey.from_file(<path to your private key>)
with key.unlock(<your private key passpharase>):
print (key.decrypt(emsg).message)
虽然问题很老。我希望这有助于未来的用户。
PyCrypto支持PGP - 尽管你应该测试它以确保它符合你的规格。
虽然很难获得文档,但如果你查看Util / test.py(模块测试脚本),你可以找到他们PGP支持的基本例子:
if verbose: print ' PGP mode:',
obj1=ciph.new(password, ciph.MODE_PGP, IV)
obj2=ciph.new(password, ciph.MODE_PGP, IV)
start=time.time()
ciphertext=obj1.encrypt(str)
plaintext=obj2.decrypt(ciphertext)
end=time.time()
if (plaintext!=str):
die('Error in resulting plaintext from PGP mode')
print_timing(256, end-start, verbose)
del obj1, obj2
此外,PublicKey / pubkey.py提供了以下相关方法:
def encrypt(self, plaintext, K)
def decrypt(self, ciphertext):
def sign(self, M, K):
def verify (self, M, signature):
def can_sign (self):
"""can_sign() : bool
Return a Boolean value recording whether this algorithm can
generate signatures. (This does not imply that this
particular key object has the private information required to
to generate a signature.)
"""
return 1
PyMe 确实声称与Python 2.4完全兼容,我引述:
PyMe的最新版本(截至此版本 写作)是v0.8.0。它的二进制 编译Debian的发行版 SWIG v1.3.33和GCC v4.2.3 for GPGME v1.1.6和Python v2.3.5, v2.4.4和v2.5.2(提供于 当时“不稳定”的分布)。 它的Windows二进制发行版 是用SWIG v1.3.29和。编译的 适用于GPGME v1.1.6和Python的MinGW v4.1 v2.5.2(虽然相同的二进制文件得到 安装并在v2.4.2中正常工作 孔)。
我不确定你为什么说“它似乎与我必须使用的Python 2.4兼容” - 详情请问?
是的,它确实作为GPGME上的半Pythonic(SWIGd)包装存在 - 一旦你有一个基本上完成这项工作的C库,这是一种开发Python扩展的流行方式。
PyPgp 有一个更简单的方法 - 这就是它的原因一个简单的Python脚本:基本上它只是“shell out”而已。命令行PGP命令。例如,解密只是:
def decrypt(data):
"Decrypt a string - if you have the right key."
pw,pr = os.popen2('pgpv -f')
pw.write(data)
pw.close()
ptext = pr.read()
return ptext
即,将加密的密文写入 pgpv -f
的标准输入,读取pgpv的标准输出作为解密的明文。
正如其他人所说,PyMe是这方面的规范解决方案,因为它基于GpgME,它是GnuPG生态系统的一部分。
对于Windows,我强烈建议使用 Gpg4win 作为GnuPG发行版,原因有两个:
它基于GnuPG 2,其中包括 gpg2.exe
,它可以(最后,我可能会添加:) start gpg-agent.exe
按需(gpg v1.x不能)。
其次,它是GnuPG开发人员唯一正式构建的Windows。例如。它完全是从Linux到Windows的交叉编译,所以没有使用大量的非自由软件来准备它(对于安全套件非常重要:)。