如何在Python中执行PGP(生成密钥,加密/解密)

Gre*_*reg 32 python encryption gnupg pgp public-key-encryption

我正在用Python创建一个程序,通过安装程序分发给Windows用户.

该程序需要能够每天下载一个使用用户公钥加密的文件,然后对其进行解密.

所以我需要找到一个Python库,让我生成公共和私有PGP密钥,并解密用公钥加密的文件.

这是pyCrypto会做的事情(文档是模糊的)?还有其他纯Python库吗?如何使用任何语言的独立命令行工具?

到目前为止我所看到的只是GNUPG,但是在Windows上安装它会对注册表产生影响,并且无处不在地抛出dll,然后我不得不担心用户是否已经安装了这个,如何备份他们现有的密钥环等等.我宁愿只需要一个python库或命令行工具,并自己管理密钥.

更新:pyME可能会工作,但它似乎与我必须使用的Python 2.4不兼容.

Vin*_*jip 28

你不需要,PyCrypto或者PyMe,虽然这些包可能很好 - 你将在Windows下构建各种各样的问题.相反,为什么不避免兔子洞,做我做的事情?使用gnupg 1.4.9.你不需要做一个完整的安装在最终用户的机器-刚刚gpg.exeiconv.dll从分配是足够的,你只需要在一些地方有他们在的路径,或使用一个全路径名从你的Python代码访问.无需更改注册表,如果需要,可以将所有内容(可执行文件和数据文件)限制在单个文件夹中.

有一个模块GPG.py最初由Andrew Kuchling编写,由Richard Jones改进并由Steve 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#,同样无痛的结果.

PS它适用于Python 2.4以及Python 2.5及更高版本.未经其他版本测试,但我没有预见到任何问题.


Roe*_*uar 9

经过大量的挖掘,我发现了一个适合我的包装。尽管据说它支持密钥的生成,但是我没有对其进行测试。但是,我确实设法解密了使用GPG公钥加密的邮件。该软件包的优点是它不需要计算机上的GPG可执行文件,并且是OpenPGP的基于Python的实现(而不是可执行文件的包装器)。我使用Windows的GPG4win和kleopatra创建了私钥和公钥。请参见下面的代码。

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)
Run Code Online (Sandbox Code Playgroud)

虽然这个问题很老了。希望这对将来的用户有所帮助。

  • @lazyList 这里是包含功能和安装说明的文档。https://pgpy.readthedocs.io/en/latest/index.html (2认同)

小智 7

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
Run Code Online (Sandbox Code Playgroud)

此外,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
Run Code Online (Sandbox Code Playgroud)

  • 不,PyCrypto中的MODE_PGP是遗留的,实验性的代码,可能永远不会正常工作.(参见https://bugs.launchpad.net/pycrypto/+bug/996814).不要使用它.不管怎样,我们很快就会将它从PyCrypto中删除. (3认同)
  • 我没有看到生成密钥或接受另一方的公钥来加密数据的方法.有任何想法吗? (2认同)