Зашифрованный файл Python-GNUPG не может быть расшифрован с помощью закрытого ключа - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь зашифровать текстовый файл в Python 3.6, используя python-gnupg, и открытый ключ, предоставленный клиентом, для которого у них есть закрытый ключ для его расшифровки.У меня нет доступа к этому ключу.Несмотря на то, что 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 / есть бинарный файл gpgbin / gpg, мы используем виртуальную среду conda для самого проекта, который, я думаю, может испортить это.Однако, когда я запустил этот код из командной строки с отключенной средой, я получил тот же результат.Я вижу, что в файле журнала говорится, что он не может найти двоичный файл gpg и что он игнорирует символическую ссылку, указывающую на него, но все его сообщения о состоянии после этого, похоже, указывают на то, что шифрование было в порядке, и снова, оно работало просто отличнонесколько раз с другой парой открытого / закрытого ключа.

  2. Изучение объекта pgp в IDE после его создания заставляет меня думать, что он нашел двоичный файл gpg просто отлично, даже без передачилюбые параметры до gnupg.GPG().Передача gnupghome='/usr/bin/gpg' приводит меня к тому же месту, а передача gnupghome='not/real/path выдает ошибку.

  3. Установка armor=False при вызове на encrypt ничего не изменила.

Я очень ценю любые мысли по этому поводу.Если ответ таков, что он просто не ищет правильные каталоги для бинарного файла gpg или homedir, из-за наших настроек виртуальной среды, рекомендации по обходным путям также приветствуются.

1 Ответ

2 голосов
/ 25 марта 2019

Разрешено.

В данном случае это была ошибка клиента.Позже мы попытались зашифровать файл, используя несколько несколько разных опций, в том числе многие из командной строки и из Python.Они смогли расшифровать каждый из них.

Для того, чтобы помочь некоторым другим в дальнейшем, вот несколько вещей, которые я узнал с начала этого путешествия:

  1. Есть два разных пакета , оба названы python-gnupg.

Поскольку эти пакеты имеют общее имя, очень сбивает с толку при поиске ошибок в одном или другом.Выполнение pip install python-gnupg, кажется, всегда загружает второй.Мой опыт почти полностью связан с этим вторым, поэтому имейте это в виду, когда читаете все остальное в этом посте.

В CentOS 6 /usr/bin/gpg является символической ссылкой, указывающей на /usr/bin/gpg2.Python-GNUPG регистрирует ошибки, отмечая это, но затем кажется, что /usr/bin/gpg2 просто отлично.

Относительно ошибки Could neither invoke nor terminate a gpg process...: Хотя это касается меня, это также, похоже, имелоне влияет ни на какую функциональность.Ваш пробег может отличаться.

Возможны проблемы совместимости между версией Python-GNUPG и бинарной версией gpg.Это может привести к Unknown status message: [SOME-GPG-MESSAGE] ошибкам;например: Unknown status message: PINENTRY_LAUNCHED, который, я полагаю, возникает, когда gpg пытается вызвать приглашение пароля (чего в старых версиях не было!).Если вы НЕ пытаетесь создать модуль с различным использованием в разных ОС (как мы), вы можете попытать счастья, вручную отредактировав исходный код python-gnupg, как только вы pip install отправили пакет.В частности, в pretty_bad_protocol._parsers.py в методе _handle_status есть кортеж известных сообщений о состоянии;просто добавьте туда любое «неизвестное» сообщение о состоянии, и эта ошибка не сработает в будущем.Я имею в виду, что ты сам по себе после этого, но это было кое-что, что мы попробовали, и это, похоже, не повредило ничего.

Удачи всем, кто пытается сделатьшифрование pgp в будущем.

...