PythonGNUPG加密文件不能用私钥解密

2024-09-30 12:20:42 发布

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

我试图用pythongnupg加密python3.6中的文本文件,以及客户机提供的公钥,他们有一个私钥来解密它。我拿不到那把钥匙。尽管pythongnupg出现了来成功加密文件(尽管日志中出现了一些令人困惑的错误),但客户机无法对其进行解密。我们被告知他们得到的错误是gpg: decryption failed: No secret key

当我们测试使用Cryptophane(不同的计算机,运行Windows而不是Ubuntu)和相同的公钥加密文件时,他们能够解密它。这就是几个月来手动加密的成功方式。当使用我们的公司公钥测试相同的代码时,我们能够使用私钥和加密纸对其进行解密。在

我在google上搜索了大量的错误信息和一般问题,但没有找到任何似乎是相同问题的解决方案。在

这是相关代码。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

以及日志的相关部分:

^{pr2}$

(这个错误后来没有出现,我在Google上找不到任何相关的信息,也找不到与之相关的堆栈溢出。)

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.

我们尝试过的一些想法和事情:

  1. 虽然在/usr/bin/gpg中有一个gpg二进制文件,但我们为项目本身使用了conda虚拟环境,我认为这可能会把事情搞砸。然而,当我从命令行运行这段代码时,在环境被停用的情况下,我得到了相同的结果。 我看到日志文件说它找不到gpg二进制文件,它忽略了指向它的符号链接,但是它之后的所有状态消息似乎都表明加密没问题,而且,它使用不同的公钥/私钥对多次运行良好。

  2. 检查IDE中的pgp对象一旦实例化,我就会认为它发现gpg二进制文件很好,即使没有向gnupg.GPG()传递任何参数。传入gnupghome='/usr/bin/gpg'会将我带到同一个地方,传入gnupghome='not/real/path会引发一个错误。

  3. 在对encrypt的调用中设置armor=False并没有更改任何内容。

我真的很感激你对这件事的任何想法。 如果答案是由于我们的虚拟环境设置,它只是没有在正确的目录中查找gpg二进制文件或homedir,那么对于如何解决这一问题的建议也会很感激。在


Tags: 文件keynameinfooutputstatusmsglogger
1条回答
网友
1楼 · 发布于 2024-09-30 12:20:42

解决了。在

在这种情况下,这是客户的错误。我们后来尝试使用各种稍有不同的选项对文件进行加密,包括从命令行和Python中执行的许多选项。 他们能解密每一个。在

为了帮助其他人,从这次旅程开始,我学到了以下几点:

  1. 有两个不同的包都命名为python-gnupg。在

由于这些包共享一个名称,所以当google搜索其中一个或另一个错误时,这会非常令人困惑。做pip install python-gnupg似乎总是下载第二个。我的经验几乎完全与第二本书有关,所以在阅读本文其他内容时,请记住这一点。在

  1. 在CentOS 6上,/usr/bin/gpg是指向/usr/bin/gpg2的符号链接。pythongnupg会记录错误并注意到这一点,但是它似乎发现/usr/bin/gpg2很好。

  2. 关于错误Could neither invoke nor terminate a gpg process...:虽然这让我担心,但这似乎对任何功能都没有任何影响。您的里程数可能会有所不同。

  3. Python-GNUPG版本和gpg二进制版本之间可能存在兼容性问题。这可能会导致Unknown status message: [SOME-GPG-MESSAGE]错误;例如:Unknown status message: PINENTRY_LAUNCHED,我认为当gpg试图打开密码短语提示时会出现这种情况(在旧版本中不会这样做!)。如果您不想让一个模块在不同的操作系统上有不同的用途(我们曾经这样做过),那么您可以在pip install包之后手动编辑pythongnupg源代码。具体地说,在_handle_status方法中的pretty_bad_protocol._parsers.py中,有一个已知状态消息的元组;只需在其中添加任何“未知”状态消息,以后就不会出错。我是说,在那之后你就只能靠自己了,但这是我们尝试过的事情,似乎没有伤害到任何东西。

祝将来想进行pgp加密的人好运。在

相关问题 更多 >

    热门问题