【问题标题】:PythonGnuPG generate keys, encrypt and decrypt a messagePythonGnuPG 生成密钥,加密和解密消息
【发布时间】:2019-10-01 20:27:41
【问题描述】:

使用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 装甲信息 然而,解密导致Crypt 对象具有False 布尔值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

不确定错误发生在哪里以及如何处理它

【问题讨论】:

    标签: python python-3.x encryption gnupg pgp


    【解决方案1】:

    经过几个小时的查找,我发现需要在 gpg init 中添加--pinentry-mode loopback 选项,如下所示:

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

    之后,加密/解密过程应该成功(注意,stderr仍然是生成的,因为它是GPG工具的整个输出)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2016-10-07
      • 1970-01-01
      • 2020-04-23
      • 2022-01-28
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多