Я пытаюсь зашифровать текстовый файл в 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.
Некоторые мысли и вещи, которые мы попробовали:
Хотя в / usr / есть бинарный файл gpgbin / gpg, мы используем виртуальную среду conda для самого проекта, который, я думаю, может испортить это.Однако, когда я запустил этот код из командной строки с отключенной средой, я получил тот же результат.Я вижу, что в файле журнала говорится, что он не может найти двоичный файл gpg и что он игнорирует символическую ссылку, указывающую на него, но все его сообщения о состоянии после этого, похоже, указывают на то, что шифрование было в порядке, и снова, оно работало просто отличнонесколько раз с другой парой открытого / закрытого ключа.
Изучение объекта pgp
в IDE после его создания заставляет меня думать, что он нашел двоичный файл gpg просто отлично, даже без передачилюбые параметры до gnupg.GPG()
.Передача gnupghome='/usr/bin/gpg'
приводит меня к тому же месту, а передача gnupghome='not/real/path
выдает ошибку.
Установка armor=False
при вызове на encrypt
ничего не изменила.
Я очень ценю любые мысли по этому поводу.Если ответ таков, что он просто не ищет правильные каталоги для бинарного файла gpg или homedir
, из-за наших настроек виртуальной среды, рекомендации по обходным путям также приветствуются.