我试图使用python-gnupg加密Python 3.6中的文本文件,以及客户端提供的公钥,他们有一个私钥来解密它。我无法访问该密钥。尽管python-gnupg似乎成功加密了文件(虽然日志中出现了一些令人困惑的错误),但客户端无法解密它。我们被告知他们得到的错误是gpg: decryption failed: No secret key
当我们测试使用Cryptophane(不同的计算机,运行Windows而不是Ubuntu)和相同的公钥加密文件时,他们能够解密它。这是几个月手动成功完成加密的方法。使用我们公司的公钥测试相同的代码时,我们可以使用我们的私钥和Cryptophane对其进行解密。
我已经广泛搜索了错误消息和一般问题,并没有找到任何似乎是同样的问题得到解决。
这是相关的代码。 filepath
是要加密的文件的相对路径。 pgp_key_name
是包含公钥的.asc文件的名称。 pgp_key_dir
是它的目录。
def pgp_encrypt_file(filepath, pgp_key_name, pgp_key_dir):
gpg = gnupg.GPG()
output_full_filepath = filepath + '.pgp'
try:
with open(pgp_key_dir + pgp_key_name) as file:
key_data = file.read()
import_result = gpg.import_keys(key_data)
logger.info(msg='Public key imported: {}'.format(pgp_key_name))
public_keys = gpg.list_keys()
fingerprint = public_keys[0]['fingerprint']
logger.info(msg='Attempting to encrypt file: ' +
output_full_filepath)
with open(filepath, 'r') as f:
newfile = f.read()
status = gpg.encrypt(newfile, fingerprint,
output=output_full_filepath)
logger.info(msg='status.ok : ' + str(status.ok))
logger.info(msg='status.status : ' + str(status.status))
except FileNotFoundError as e:
logger.error(msg='File not found: ' + str(e))
except TypeError as e:
logger.error(msg='GNUPG TypeError: ' + str(e))
return output_full_filepath
以及日志的相关部分:
03-01 15:18:58 gnupg INFO Setting homedir to
'/home/[user]/.config/python-gnupg'
03-01 15:18:58 gnupg ERROR Could neither invoke nor terminate a
gpg process... Are you sure you specified the corrent (and full) path to the
gpg binary?
(该错误未在稍后出现,我无法在Google或Stack Overflow上找到任何相关内容。)
03-04 09:04:39 gnupg WARNING Ignoring '/usr/bin/gpg' (path is a symlink)
03-04 09:04:39 gnupg ERROR Could not find binary for 'gpg'.
03-04 09:04:39 gnupg INFO Setting homedir to
'/home/[user]/.config/python-gnupg'
03-04 09:04:39 gnupg INFO
Initialised settings:
binary: /usr/bin/gpg2
binary version: `2.0.14\ncfg:pubkey:1;16;17\ncfg:cipher:2;3;4;7;8;9;10;11;12;13\ncfg:ciphername:3DES;CAST5;BLOWFISH;AES;AES192;AES256;TWOFISH;CAMELLIA128;CAMELLIA192;CAMELLIA256\ncfg:digest:1;2;3;8;9;10;11\ncfg:digestname:MD5;SHA1;RIPEMD160;SHA256;SHA384;SHA512;SHA224\ncfg:compress:0;1;2;3\n'
homedir: /home/[user]/.config/python-gnupg
ignore_homedir_permissions: False
keyring: /home/[user]/.config/python-gnupg/pubring.gpg
secring: /home/[user]/.config/python-gnupg/secring.gpg
default_preference_list: SHA512 SHA384 SHA256 AES256 CAMELLIA256 TWOFISH
AES192 ZLIB ZIP Uncompressed
keyserver: hkp://wwwkeys.pgp.net
options: None
verbose: False
use_agent: False
03-04 09:04:39 gnupg INFO Importing: [first few lines of public key]
03-04 09:04:39 root INFO Public key imported: [name of key]
03-04 09:04:39 root INFO Attempting to encrypt file: [file]
03-04 09:04:39 gnupg INFO Writing encrypted output to file:
[file.pgp]
03-04 09:04:39 gnupg INFO Encrypted output written successfully.
我们尝试过的一些想法和事情:
pgp
对象,我就会认为它发现gpg二进制文件很好,即使没有将任何参数传递给gnupg.GPG()
。通过gnupghome='/usr/bin/gpg'
导致我到同一个地方,并且通过gnupghome='not/real/path
投掷错误。armor=False
时设置encrypt
并没有改变任何东西。我非常感谢任何关于此事的想法。如果答案是它没有在gpg二进制文件或homedir
的正确目录中查找,由于我们的虚拟环境设置,关于如何解决这个问题的建议也将受到赞赏。
解决。
在这种情况下,这是客户端的错误。我们后来尝试使用各种稍微不同的选项加密文件,包括从命令行和Python完成的许多选项。他们能够解密每一个。
为了帮助其他人下线,以下是我从这次旅程开始以来学到的一些事情:
由于这些包共享一个名称,因此在一个或另一个中使用Google搜索错误时会非常困惑。做pip install python-gnupg
似乎总是下载第二个。我的经验几乎完全是第二个,所以在阅读本文中的其他内容时请记住这一点。
/usr/bin/gpg
是一个指向/usr/bin/gpg2
的符号链接。 Python-GNUPG记录错误,注意到这一点,但它似乎找到/usr/bin/gpg2
就好了。Could neither invoke nor terminate a gpg process...
:虽然这关心我,但这似乎对任何功能都没有任何影响。你的旅费可能会改变。Unknown status message: [SOME-GPG-MESSAGE]
错误;例如:Unknown status message: PINENTRY_LAUNCHED
,我相信当gpg尝试调出密码短语提示时出现(在旧版本中没有这样做!)。如果你不是想在不同的操作系统上创建一个具有不同用途的模块(我们曾经),你可以尝试一下pip install
包后手动编辑python-gnupg源代码。具体来说,在pretty_bad_protocol._parsers.py
方法的_handle_status
中,有一个已知状态消息的元组;只需添加任何“未知”状态消息,该错误将来不会发生。我的意思是,在那之后你就自己了,但这是我们尝试过的东西,它似乎并没有伤害到任何东西。祝所有试图在将来进行pgp加密的人好运。