我在做一个程序在蟒蛇被分发到windows用户通过一个安装程序。

该计划需要能够下载的文件每天都进行加密的用户的公用钥匙然后解密。

所以我需要找到一条巨蟒库,这将让我产生的公共和私人PGP键,并还解密的文件加密的公共关键。

这是什么pyCrypto会做(文件含糊不清的)?还有没有其他的纯Python库?如何对一个独立的命令行的工具,在任何语言?

所有我看到迄今为止是GNUPG但安装在窗不会的东西的登记和投dll的无处不在,那么我担心的用户是否已经有的这个安装,如何备用他们现有的钥匙,等等。我宁愿只有一个python库或命令行工具和管理的钥匙我自己。

更新:pyME可能的工作,但它似乎并不是兼容Python2.4我已经使用。

有帮助吗?

解决方案

你不需要 PyCryptoPyMe, ,细虽然这些软件包可以是-你将会有各种各样的问题建设的窗口。相反,为什么避免不了兔子洞,并做我做了什么?使用 gnupg 1.4.9.你不需要做一个完整的安装在终端用户机-只是 gpg.exeiconv.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和后。不过测试的其他版本,虽然我没有预见任何问题。

其他提示

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

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的标准输出作为解密的明文。

PyPgp也是一个非常古老的项目,虽然它的简单性意味着它使用现代Python(例如,子流程而不是现在已经弃用的os.popen2)并不难。但是你仍然需要安装 PGP ,否则PyPgp将不会做任何事情; - )。

M2Crypto 有PGP模块,但是我实际上从未试过要使用它。如果你尝试,它的工作,请让我知道(I am目前M2Crypto维护者).一些链接:

更新: PGP模块并没有提供方式产生键,但据推测这些可能是创建具有较低的水平 RSA, 每日生活津贴 等等。模块。我不知道PGP内,所以你必须要挖掘的详细信息。此外,如果你知道如何产生这些使用openssl command line命令,则应合理容易地转换,以M2Crypto话。

正如其他人所说,PyMe是这方面的规范解决方案,因为它基于GpgME,它是GnuPG生态系统的一部分。

对于Windows,我强烈建议使用 Gpg4win 作为GnuPG发行版,原因有两个:

它基于GnuPG 2,其中包括 gpg2.exe ,它可以(最后,我可能会添加:) start gpg-agent.exe 按需(gpg v1.x不能)。

其次,它是GnuPG开发人员唯一正式构建的Windows。例如。它完全是从Linux到Windows的交叉编译,所以没有使用大量的非自由软件来准备它(对于安全套件非常重要:)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top