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.exe
和iconv.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及更高版本.未经其他版本测试,但我没有预见到任何问题.
经过大量的挖掘,我发现了一个适合我的包装。尽管据说它支持密钥的生成,但是我没有对其进行测试。但是,我确实设法解密了使用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)
虽然这个问题很老了。希望这对将来的用户有所帮助。
小智 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)
归档时间: |
|
查看次数: |
48594 次 |
最近记录: |