1

我正在尝试在 python-gnupg 中使用备用密钥,相当于命令的 -u 开关:

gpg --encrypt --armor -r <<theirkeyid>> -u <<my_nondefault_key_id>>
gpg --decrypt -r <<theirkeyid>> -u <<my_nondefault_key_id>>

但无法弄清楚,python-gnupg 总是使用我的默认私钥。我唯一想到的可能是使用另一个钥匙圈,还是有办法?或者另一个 py 库是否支持多个私钥?

4

2 回答 2

0

在 python-gnupg 中,接收者键 "-r <<theirkeyid>>" 接受一个列表,方便您只使用一个字符串。

将您的 nondefaultkeyid 添加到收件人列表中,python-gnupg 似乎注意到包含的私有并将其用作默认密钥。例子:

recipients=["<<theirkeyid>>", "<<nondefault_key_id>>"]
encrypt_file(file, recipients)

以上对我有用,虽然不是很明显“为什么”?

提示:我将自己添加到收件人列表中,因此我可以解密文件以验证加密文件没有损坏(如果原始原始文件已经消失,则恢复原始文件。)

其他两个选项(如果您正在寻找更多确定性)

  • 符号
  • 额外参数

符号

签署加密文件时明确支持设置“默认密钥”。

例如,您的函数调用如下所示:

encrypt_file( file, "<<theirkeyid>>", armor=True, sign="<<nondefault_key_id>>") 

python-gnupg 代码中的一个片段告诉我们,要对文件进行“签名”,python-gnupg 将命令行选项设置为“--sign”,然后将“--default-key”设置为为'签字'。

        if sign is True:  # pragma: no cover
            args.append('--sign')
        elif sign:  # pragma: no cover
            args.extend(['--sign', '--default-key', no_quote(sign)])

参考:https ://bitbucket.org/vinay.sajip/python-gnupg/src/master/gnupg.py

额外参数

如果你不想签名,走自己的路怎么办?

我们想要的是将以下命令行选项添加到 'gpg'

--default-key <<nondefault_key_id>>

从上述相同的文档中,您似乎也可以通过使用 extra_args 选项来摆脱困境:

encrypt_file 和 extra_args 的文档参数是:

    def encrypt_file(self,
                     file,
                     recipients,
                     sign=None,
                     always_trust=False,
                     passphrase=None,
                     armor=True,
                     output=None,
                     symmetric=False,
                     extra_args=None):
...
...
        if extra_args:
            args.extend(extra_args)

其中extra_args是命令行选项的 python 列表。

我们可以使用 extra_args 为 encrypt_file 传递进一步的自定义选项。下面是一个例子:

encrypt_file( file, "<<theirkeyid>>", armor=True, extra_args=["--default-key", "<<nondefault_key_id>>"]) 

让我们知道哪个最适合您。

于 2022-02-21T04:53:54.723 回答
-1
  • --encrypt只使用对方的公钥时,这种情况下该-u选项被忽略
  • 收件人的密钥可以在options.recipients列表中设置。
  • 同样,当--decrypting-r选项被忽略时。通常用于解密的密钥是根据消息中的密钥 ID 自动确定的。除非您的消息使用多个公钥加密,并且您的密钥库中有多个匹配的私钥。
  • 你可以设置默认键options.default_key
  • 如果你想使用不同的密钥库文件,你可以将它添加到额外的参数中,或者在call参数列表中直接使用它:

    gpg = GnuPGIntreface.GnuPG()
    #    ...
    gpg.options.recipients += ['spam', 'eggs']
    gpg.options.extra_args += ['--keyring', 'keyringfile']
    #    ...
    #    or:
    gpg.call(['--encrypt', '--keyring', 'keyringfile'])
    #    ...
    
于 2012-05-21T10:42:50.970 回答