簡體   English   中英

Python-GNUPG 加密文件無法用私鑰解密

[英]Python-GNUPG encrypted file cannot be decrypted with private key

我正在嘗試使用 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.

我們嘗試過的一些想法和事情:

  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 binary 或homedir ,那么關於如何解決這個問題的建議也將不勝感激。

解決。

在這種情況下,這是客戶的錯誤。 我們后來嘗試使用各種略有不同的選項加密文件,包括許多從命令行和 Python 完成的選項。 他們能夠解密每一個。

為了幫助其他人,以下是我從開始這個旅程以來學到的一些東西:

  1. 兩個不同的包都命名為 python-gnupg。

由於這些包共享一個名稱,因此在搜索其中一個錯誤時會非常混亂。 pip install python-gnupg似乎總是下載第二個。 我的經驗幾乎完全與第二個有關,因此在閱讀本文中的其他所有內容時請記住這一點。

  1. 在 CentOS 6 上, /usr/bin/gpg是指向/usr/bin/gpg2的符號鏈接。 Python-GNUPG 會記錄錯誤並指出這一點,但隨后似乎找到/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包后手動編輯 python-gnupg 源代碼來試試運氣。 具體來說,在pretty_bad_protocol._parsers.py中的_handle_status方法中,有一個已知狀態消息的元組; 只需在那里添加任何“未知”狀態消息,該錯誤將來就不會發生。 我的意思是,在那之后你就靠自己了,但這是我們嘗試過的,它似乎沒有傷害任何東西。

祝將來嘗試進行 pgp 加密的任何人好運。

感謝您提供所有詳細信息。 我已經解決了這個問題

gpg = gnupg.GPG(binary='/usr/bin/gpg2', homedir='/tmp')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM