python gnupg.encrypt: ошибок нет, но данные или файлы не шифруются

используя python-gnupg v0.3.5 в Windows 7 с Python 2.7 и GPG4Win v2.2.0

test_gnupg.py приводит к 2 ошибкам:

Проверить, работает ли поиск ключей... FAIL

Доктест: gnupg.GPG.recv_keys ... FAIL

В каждом из этих мест существует 2 брелка (защита и публикация в каждом):

в каталоге GPGHome (C:\Program Files (x86)\GNU\GnuPG)

под профилем пользователя (C:\Users\\AppData\Roaming\gnupg)

Если я создаю экземпляр GPG и устанавливаю путь к файлу набора ключей для профиля пользователя pubring.pgp, я получаю результат от GPG.list_keys(). Если я позволю ему использовать каталог gpghome pubring.pgp, я не получу результатов от list_keys(), потому что этот набор ключей пуст.

Итак, учитывая, что я указываю связку ключей профиля пользователя, и у меня есть ключ для использования, вот что происходит:

    >>>data = '1234 abcd 56678'
    >>>fingerprint = u'<fingerprint>'
    >>>enc = gpg.encrypt(data,fingerprint)
    >>>enc.data
    ''

encrypt_file() дает те же результаты, ничего не происходит, никаких ошибок. Я не особенно сообразителен во всем этом, но кажется, что если у меня есть данные и открытый ключ, это должно быть очень просто. У меня ужасное время, пытаясь определить, что не так, учитывая, что я нигде не вижу файлов журнала, и у меня нет ошибок при попытке это сделать.

Как я могу определить, что здесь происходит не так? Я прочитал практически все, что смог найти здесь, на StackOverflow, http://pythonhosted.org/python-gnupg/#getting-started и группу google для python-gnupg.

Кроме того, почему у меня вообще 2 отдельных набора брелоков?

редактировать: уточнено, что есть 2 отдельных набора публикаций и секретов

редактировать 2: ответ ниже сыграл важную роль в возникновении реальной проблемы. конструктор gnupg.GPG() устанавливает параметры командной строки gpg, которые включают «no-tty», вызов gnupg.GPG(options='') решает проблему и успешно шифрует как данные, так и файлы.


person torpy    schedule 10.10.2013    source источник
comment
По умолчанию у вас есть файлы pubring.gpg и secring.gpg в домашнем каталоге. Первый хранит открытые ключи, а второй хранит закрытые ключи. Что касается остальной части вашего вопроса... Обычно я просто вызываю GPG из командной строки, поэтому позже мне придется покопаться в этом модуле и вернуться к нему (если только кто-то не опередит меня). Кроме того, на этой стороне планеты уже разлито вино, так что это может занять некоторое время.   -  person Ben    schedule 10.10.2013
comment
Действительно, я знаком с pubring и secring, но у меня их по 2, один под профилем пользователя и один в доме GPG. Внесение поправок в вопрос, чтобы указать эту информацию.   -  person torpy    schedule 10.10.2013
comment
Один набор будет набором ключей для вашей учетной записи пользователя в системе, а другой набор будет глобальными значениями по умолчанию для системы. Наверное.   -  person Ben    schedule 11.10.2013


Ответы (1)


Хорошо, я наконец-то посмотрел на это и заставил базовое шифрование работать из командной строки. Вот пример, который будет работать для шифрования данных, введенных из командной строки:

import gnupg

gpg_home = "/path/to/gnupg/home"
gpg = gnupg.GPG(gnupghome=gpg_home)

data = raw_input("Enter data to encrypt: ")
rkey = raw_input("Enter recipient's key ID: ")

encrypted_ascii_data = gpg.encrypt(data, rkey)

print(encrypted_ascii_data)

Измените gpg_home на любой из этих двух путей GnuPG, который вы хотите использовать. Первое выглядит как место установки по умолчанию, а второе похоже на вашу учетную запись пользователя. Сценарий запросит некоторый текст для шифрования и идентификатор ключа для шифрования, а затем выведет зашифрованные данные в формате ASCII на стандартный вывод.

РЕДАКТИРОВАТЬ: я не уверен, но я подозреваю, что причина сбоя вашего кода была связана либо с использованием всего отпечатка пальца для идентификатора ключа получателя, что не нужно (я использовал формат 0xLONG, пример которого есть в моем профиле), или вы назвали неправильный домашний каталог GPG.

РЕДАКТИРОВАТЬ 2: Это работает для шифрования файлов и записи вывода в файл в том же каталоге, он будет работать как в системах * nix. Вам нужно будет изменить gpg_home, как в приведенном выше примере:

import gnupg

gpg_home = "~/.gnupg"
gpg = gnupg.GPG(gnupghome=gpg_home)

data = raw_input("Enter full path of file to encrypt: ")
rkeys = raw_input("Enter key IDs separated by spaces: ")
savefile = data+".asc"

afile = open(data, "rb")
encrypted_ascii_data = gpg.encrypt_file(afile, rkeys.split(), always_trust=True, output=savefile)
afile.close()

Моя работа здесь закончена! :)

Кстати, в обоих этих примерах используется Python 2.7, для Python 3 вам нужно будет изменить строки raw_input(), чтобы вместо этого использовать input().

person Ben    schedule 12.10.2013
comment
Спасибо, что посмотрели на этого Бена. К сожалению, я не могу воспроизвести рабочие результаты. Результат тот же; никакие данные не инкапсулируются в объект gnupg.Crypt после вызова encrypt(). Я пытался использовать полный отпечаток пальца, идентификатор ключа и значение в поле подключа. Я собираюсь работать над ведением журнала, чтобы получить больше информации. Я пытался работать с этим из командной строки, чтобы создать прототип нового кода, но это выглядит довольно мрачно. - person torpy; 14.10.2013
comment
Что-то более фундаментальное не так. DEBUG:gnupg:gpg: Извините, терминал вообще не запрошен - не могу получить ввод DEBUG:gnupg:encrypt результат: '' - person torpy; 14.10.2013
comment
Это сообщение об ошибке GPG, а не от python-gnupg. Проверьте свой gpg.conf на наличие строки no-tty и, если она есть, удалите ее. - person Ben; 15.10.2013
comment
В gpg.conf нет строки для 'no-tty'. Я решительно рассматриваю возможность отказаться от этой идеи и посмотреть, что я могу сделать с C#. - person torpy; 15.10.2013
comment
Мне удалось изолировать проблему. конструктор устанавливает параметры по умолчанию, которые включают флаг «no-tty», использование GPG (options = '') отключает этот флаг и, похоже, решает проблему. Большое спасибо Бен, ваша помощь была неоценима в отслеживании этого. - person torpy; 15.10.2013
comment
Превосходно! Думаю, теперь моя работа действительно сделана... ;) - person Ben; 16.10.2013