我正在尝试在 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 库是否支持多个私钥?
在 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>>"])
让我们知道哪个最适合您。
--encrypt
只使用对方的公钥时,这种情况下该-u
选项被忽略options.recipients
列表中设置。--decrypt
ing-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'])
# ...