python gnupg.encrypt:无错误,但不加密数据或文件

python gnupg.encrypt:无错误,但不加密数据或文件,python,encryption,gnupg,Python,Encryption,Gnupg,在windows 7 w/python 2.7和GPG4Win v2.2.0上使用python gnupg v0.3.5 测试_gnupg.py导致2次失败: 测试搜索关键字是否有效。。。失败 Doctest:gnupg.GPG.recv_密钥。。。失败 每个位置都有2个钥匙环(每个位置都有密码环和密码环): 在GPGHome目录下(C:\ProgramFiles(x86)\GNU\GnuPG) 在用户配置文件下(C:\Users\\AppData\Roaming\gnupg) 如果我创建GPG

在windows 7 w/python 2.7和GPG4Win v2.2.0上使用python gnupg v0.3.5

测试_gnupg.py导致2次失败:

测试搜索关键字是否有效。。。失败

Doctest:gnupg.GPG.recv_密钥。。。失败

每个位置都有2个钥匙环(每个位置都有密码环和密码环):

在GPGHome目录下(C:\ProgramFiles(x86)\GNU\GnuPG)

在用户配置文件下(C:\Users\\AppData\Roaming\gnupg)

如果我创建GPG实例并将keyring文件路径设置为user profile pubring.pgp,我将从GPG.list_keys()获得一个结果。如果我让它使用gpghome目录pubring.pgp,我不会从list_keys()中得到任何结果,因为该keyring是空的

因此,如果我指定了用户配置文件keyring,并且我有一个要使用的密钥,则会发生以下情况:

    >>>data = '1234 abcd 56678'
    >>>fingerprint = u'<fingerprint>'
    >>>enc = gpg.encrypt(data,fingerprint)
    >>>enc.data
    ''
>>数据='1234 abcd 56678'
>>>指纹=u“
>>>enc=gpg.encrypt(数据、指纹)
>>>附件数据
''
encrypt_file()会给出相同的结果,不会发生任何事情,也不会出现错误。我对这些都不是特别在行,但如果我有数据和公钥,这应该非常简单。考虑到我在任何地方都看不到日志文件,而且在尝试此操作时也没有任何错误,因此我在尝试确定错误时经历了一段可怕的时间

我如何确定这里出了什么问题? 我已经阅读了StackOverflow和python gnupg的google组的所有内容

还有,为什么我首先要有两套独立的钥匙圈

编辑: 澄清有两套独立的pubring和secring

编辑2: 下面的答案有助于解决实际问题。
gnupg.GPG()构造函数正在设置包含“no tty”的GPG命令行选项,调用gnupg.GPG(options='')解决了这个问题,并成功地对数据和文件进行了加密。

好的,我终于开始研究这个问题,并从命令行获得了基本的加密。下面是一个用于加密从命令行输入的数据的示例:

import gnupg

gpg_home = "/path/to/gnupg/home"
gpg = gnupg.GPG(gnupghome=gpg_home)

data = raw_input("Enter data to encrypt: ")
rkey = raw_input("Enter recipient's key ID: ")

encrypted_ascii_data = gpg.encrypt(data, rkey)

print(encrypted_ascii_data)
将gpg_home更改为您想要使用的这两个GnuPG路径中的任意一个。第一个看起来像默认的安装位置,第二个看起来像特定于您的用户帐户。脚本将提示输入一些要加密的文本和要加密的密钥ID,然后将ASCII加密数据打印到标准输出

编辑:我不确定,但我怀疑您的代码失败的原因可能是因为对收件人密钥ID使用了整个指纹,这是不必要的(我使用了0xLONG格式,我的配置文件中有一个示例),或者您调用了错误的GPG主目录

编辑2:它用于加密文件并将输出写入同一目录中的文件,它将像在*nix系统上一样工作。您需要更改gpg_主页,如上例所示:

import gnupg

gpg_home = "~/.gnupg"
gpg = gnupg.GPG(gnupghome=gpg_home)

data = raw_input("Enter full path of file to encrypt: ")
rkeys = raw_input("Enter key IDs separated by spaces: ")
savefile = data+".asc"

afile = open(data, "rb")
encrypted_ascii_data = gpg.encrypt_file(afile, rkeys.split(), always_trust=True, output=savefile)
afile.close()
我在这里的工作完成了!:)


顺便说一句,这两个示例都使用Python2.7,对于Python3,您需要修改原始输入()行以使用输入()。

默认情况下,主目录中有一个pubring.gpg和secring.gpg文件。前者存储公钥,后者存储私钥。至于你剩下的问题。。。我通常只是在命令行上调用GPG,所以我以后必须深入研究这个模块并返回到它(除非有人比我更了解它)。此外,在地球的这一边已经有了葡萄酒,所以可能需要一段时间。事实上,我对pubring和secring很熟悉,但我有两种,一种在用户档案下,另一种在GPG主页上。修改问题以指定该信息。一组是系统上用户帐户的密钥环,另一组是系统的全局默认值。可能吧。谢谢你看这个,本。不幸的是,我无法复制工作结果。结果是一样的;调用encrypt()后,没有数据封装在gnupg.Crypt对象中。我尝试使用完整指纹、密钥id和“子密钥”字段中的值。我将致力于实现一些日志记录以获取更多信息。我一直在尝试从命令行开始编写一些新代码的原型,但它看起来很糟糕。一些更基本的东西出了问题。DEBUG:gnupg:gpg:抱歉,根本没有请求任何终端-无法获取输入DEBUG:gnupg:encrypt结果:“”这是一条gpg错误消息,不是来自python gnupg。检查gpg.conf中是否有“no tty”行,如果有,请将其删除。gpg.conf中不存在“no tty”行。我正在强烈考虑放弃这个想法,看看我能用C#做些什么。我已经能够孤立这个问题。构造函数正在设置包含“no tty”标志的默认选项,使用GPG(options='')禁用该标志并显示为解决问题。非常感谢本,你的帮助在追踪这件事上是无价的。