PythonGnuPG генерирует ключи, шифрует и дешифрует сообщение - PullRequest
1 голос
/ 01 октября 2019

Использование Python-GnuPG Я хочу

  1. Создать ключи PGP
  2. Зашифровать сообщение
  3. Расшифровать сообщение

В настоящее время код выглядит следующим образом:

import string
import random
import gnupg

random_string_length = 20
random_gpg_key_passphrase = "".join(
        random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(random_string_length))

gpg = gnupg.GPG(homedir="gpg")
cs_gpg_key_input_dict = {
    "key_type":  "RSA",
    "key_length": 4096,
    "passphrase": random_gpg_key_passphrase
}
python_gnupg_key_generation_input_data = gpg.gen_key_input(**cs_gpg_key_input_dict)
gpg_key_pair = gpg.gen_key(python_gnupg_key_generation_input_data)

encrypted_data = gpg.encrypt("message", gpg_key_pair.fingerprint,
                                             passphrase=random_gpg_key_passphrase, always_trust=True)

msg = str(encrypted_data)
decrypted_data = gpg.decrypt(msg, passphrase=random_gpg_key_passphrase, always_trust=True)

К сожалению, шифрование возвращает ошибку:

raise ValueError("Unknown status message: %r" % key)
ValueError: Unknown status message: 'ENCRYPTION_COMPLIANCE_MODE'

Тем не менее, оно все еще генерирует сообщение ASCII для защиты брони. Расшифровка Hovewer приводит к Cryptобъект со значением False bool свойства ok и следующим свойством stderr:

[GNUPG:] ENC_TO <XXX> 1 0
[GNUPG:] KEY_CONSIDERED <YYY> 0
[GNUPG:] PINENTRY_LAUNCHED 7570 gnome3:curses 1.1.0 - - :0
[GNUPG:] KEY_CONSIDERED <YYY> 0
gpg: encrypted with 4096-bit RSA key, ID <XXX>, created 2019-10-01
      "ZZZ"
gpg: public key decryption failed: Inappropriate ioctl for device
[GNUPG:] ERROR pkdecrypt_failed <QQQ>
[GNUPG:] BEGIN_DECRYPTION
[GNUPG:] DECRYPTION_FAILED
gpg: decryption failed: No secret key
[GNUPG:] END_DECRYPTION

Не уверен, где именно происходит ошибка и как ее устранить

1 Ответ

0 голосов
/ 02 октября 2019

После нескольких часов поиска я обнаружил, что необходимо добавить опцию --pinentry-mode loopback в gpg init следующим образом:

cs_gpg_options = ['--pinentry-mode loopback']
gpg = gnupg.GPG(homedir="gpg", options=cs_gpg_options)

После этого процесс шифрования / дешифрования должен пройти успешно (обратите внимание, что,stderr все еще создается, так как он является целым выводом инструмента GPG)

...