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

2024-05-17 07:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

test_gnupg.py导致两个失败:

Test that searching for keys works ... FAIL

Doctest: gnupg.GPG.recv_keys ... FAIL

每个位置都有两个钥匙圈(每个位置都有一个钥匙圈和一个钥匙圈):

under the GPGHome directory (C:\Program Files (x86)\GNU\GnuPG)

under the user profile(C:\Users\\AppData\Roaming\gnupg)

如果我创建GPG实例并将keyring文件路径设置为用户配置文件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
    ''

encrypt_file()给出相同的结果,没有发生任何事情,没有错误。我对这些都不是特别了解,但如果我有数据和公钥,这应该非常简单。我有一个可怕的时间试图确定什么是错误的,因为我没有看到任何地方的日志文件,我没有错误时,试图这样做。

我怎样才能确定这里出了什么问题? 我在StackOverflow,http://pythonhosted.org/python-gnupg/#getting-started和python gnupg的google组上看到了几乎所有的内容。

为什么我一开始就有两套独立的钥匙圈?

编辑: 澄清有两套独立的发布和发布

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


Tags: 文件the用户data配置文件错误keysgpg
1条回答
网友
1楼 · 发布于 2024-05-17 07:33:39

好吧,我终于开始研究这个,从命令行得到基本的加密。下面是一个对从命令行输入的数据进行加密的示例:

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铠装加密数据打印到stdout。

编辑:我不确定,但我怀疑您的代码失败的原因可能是使用了收件人密钥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,您需要修改原始的input()行来使用input()。

相关问题 更多 >