在没有用户交互的情况下使用pyme在python中解密PGP的问题

时间:2010-09-07 15:34:28

标签: python pgp gnupg gpgme pyme

我正在尝试使用pyme(来自gpgme的python包装器)解密消息。如果我在提示时键入密码但我无法使密码短语回调起作用,它可以正常工作。这是代码

import pyme.core

def Callback( x, y, z ):
    print 'in passphrase callback'
 return 'passphrase'

plain = pyme.core.Data()
cipher = pyme.core.Data(sys.stdin.read())
c = pyme.core.Context()
c.set_armor(1)
c.set_passphrase_cb(Callback)
c.op_decrypt( cipher, plain )
plain.seek(0,0)
print plain.read()

当我运行此并且不以交互方式提供密码时,程序然后尝试在密码短语回调中进行回调打印,但随后失败并显示错误:

pyme.errors.GPGMEError: Invocation of gpgme_op_decrypt: Unspecified source: General error (0,1)

首先,为什么密码短语回调不起作用?其次,如何在调用密码短语回调之前阻止程序提示用户输入密码?

这是在Ubuntu 10.04上运行

2 个答案:

答案 0 :(得分:2)

显然,您需要解释关键字hook

   def Callback( x, y, z, hook=None):
   ...

效果很好。

答案 1 :(得分:0)

我可以通过从密码短语回调中返回None来重现您报告的错误。如果Python函数在没有到达None语句的情况下到达执行函数的末尾,则默认情况下返回return。您是否有可能意外地从回调中返回None,可能是由于您的代码错误地提前结束了您的功能? (错误的想法只是基于你的例子中的非法缩进的猜测。)