将 PGP public 密钥块导入为字符串:在 shell 中工作但不在 python-gnupg 中工作

import PGP public key block as string : working in shell but not in python-gnupg

如果我正在复制 post(请指点我等等?),请提前致歉:我看到很多 documentation/Q&A 关于导出装甲密钥,但关于如何导出的内容不多以字符串格式导入块。我无法在 python 中复制我可以在 windows 命令行上直接使用以下命令执行的操作:

gpg2 --import <textfilecontaining public key block in python code below>

哪个returns:

gpg: key 2FD34F7F: public key "name (comment) <em@il>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

我用的是python中的python-gnupg library,如下:

import gnupg, tempfile, shutil
pubkey = '''-----BEGIN PGP PUBLIC KEY BLOCK-----

xsBNBFVjnlIBCACibzXOLCiZiL2oyzYUaTOCkYnSUhymg3pdbfKtd4mpBa58xKBj
t1pTHVpw3Sk03wmzhM/Ndlt1AV2YhLv++83WKr+gAHFYFiCV/tnY8bx3HqvVoy8O
CfxWhw4QZK7+oYzVmJj8ZJm3ZjOC4pzuegNWlNLCUdZDx9OKlHVXLCX1iUbjdYWa
qKV6tdV8hZolkbyjedQgrpvoWyeSHHpwHF7yk4gNJWMMI5rpcssL7i6mMXb/sDzO
VaAtU5wiVducsOa01InRFf7QSTxoAm6Xy0PGv/k48M6xCALa9nY+BzlOv47jUT57
vilf4Szy9dKD0v9S0mQ+IHB+gNukWrnwtXx5ABEBAAHNFm5hbWUgKGNvbW1lbnQp
IDxlbUBpbD7CwHUEEwECACkFAlVjnlIJEINgJNgv009/AhsDAhkBBgsJCAcDAgYV
CAIJCgsEFgIDAQAAxqMIAFBHuBA8P1v8DtHonIK8Lx2qU23t8Mh68HBIkSjk2H7/
oO2cDWCw50jZ9D91PXOOyMPvBWV2IE3tARzCvnNGtzEFRtpIEtZ0cuctxeIF1id5
crfzdMDsmZyRHAOoZ9VtuD6mzj0ybQWMACb7eIHjZDCee3Slh3TVrLy06YRdq2I4
bjMOPePtK5xnIpHGpAXkB3IONxyITpSLKsA4hCeP7gVvm7r7TuQg1ygiUBlWbBYn
iE5ROzqZjG1s7dQNZK/riiU2umGqGuwAb2IPvNiyuGR3cIgRE4llXH/rLuUlspAp
o4nlxaz65VucmNbN1aMbDXLJVSqR1DuE00vEsL1AItI=
=XQoy
-----END PGP PUBLIC KEY BLOCK-----'''
"""that block, minus the enveloping triple-quotes,
is all that's inside the file I am importing at the commandline
"""
tempfolder = tempfile.mkdtemp()#creates a temp directory
try:
    gpg = gnupg.GPG(homedir=tempfolder)
    keyfile = tempfolder+"\test.txt"#defining temp pubkey file
    f = open(keyfile, 'w')
    f.write(pubkey)#saves file with string content
    f.close()
    f = file(keyfile, 'r')
    f.close()    
    importres = gpg.import_keys(keyfile)
    print importres
    print importres.results
    currfingerprint = gpg.list_keys()
    print currfingerprint
finally:
    shutil.rmtree(tempfolder)#removes temp directory

哪个returns:

<gnupg._parsers.ImportResult object at 0x00000000038A8400>
[{'status': 'No valid data found', 'fingerprint': None}]
[]

... 似乎我的 Python 实现无法以某种方式识别此 file/string 表示。想知道是否有人可以用 Python 为我指明正确的方向?我试过 dearmor-ing 字符串内容(binascii.a2b_base64)但无济于事。我不想在这里使用沼泽标准 subprocess。也许有些愚蠢的缩进问题?

env=Windows10, Python 2.7

您的代码示例正在将包含密钥的文件的名称传递给 import_keys:

keyfile = tempfolder+"\test.txt"#defining temp pubkey file
...
importres = gpg.import_keys(keyfile)

但是,import_keys 函数不接受文件名并从该文件读取。相反,它希望收到实际的密钥文件内容。例如,这里是程序的简化版本,它只是将 pubkey 直接传递给 import_keys,而不使用临时文件:

import gnupg

pubkey = '''-----BEGIN PGP PUBLIC KEY BLOCK-----
xsBNBFVjnlIBCACibzXOLCiZiL2oyzYUaTOCkYnSUhymg3pdbfKtd4mpBa58xKBj
t1pTHVpw3Sk03wmzhM/Ndlt1AV2YhLv++83WKr+gAHFYFiCV/tnY8bx3HqvVoy8O
CfxWhw4QZK7+oYzVmJj8ZJm3ZjOC4pzuegNWlNLCUdZDx9OKlHVXLCX1iUbjdYWa
qKV6tdV8hZolkbyjedQgrpvoWyeSHHpwHF7yk4gNJWMMI5rpcssL7i6mMXb/sDzO
VaAtU5wiVducsOa01InRFf7QSTxoAm6Xy0PGv/k48M6xCALa9nY+BzlOv47jUT57
vilf4Szy9dKD0v9S0mQ+IHB+gNukWrnwtXx5ABEBAAHNFm5hbWUgKGNvbW1lbnQp
IDxlbUBpbD7CwHUEEwECACkFAlVjnlIJEINgJNgv009/AhsDAhkBBgsJCAcDAgYV
CAIJCgsEFgIDAQAAxqMIAFBHuBA8P1v8DtHonIK8Lx2qU23t8Mh68HBIkSjk2H7/
oO2cDWCw50jZ9D91PXOOyMPvBWV2IE3tARzCvnNGtzEFRtpIEtZ0cuctxeIF1id5
crfzdMDsmZyRHAOoZ9VtuD6mzj0ybQWMACb7eIHjZDCee3Slh3TVrLy06YRdq2I4
bjMOPePtK5xnIpHGpAXkB3IONxyITpSLKsA4hCeP7gVvm7r7TuQg1ygiUBlWbBYn
iE5ROzqZjG1s7dQNZK/riiU2umGqGuwAb2IPvNiyuGR3cIgRE4llXH/rLuUlspAp
o4nlxaz65VucmNbN1aMbDXLJVSqR1DuE00vEsL1AItI==XQoy
-----END PGP PUBLIC KEY BLOCK-----'''

gpg = gnupg.GPG()
importres = gpg.import_keys(pubkey)
print importres
print importres.results
currfingerprint = gpg.list_keys()
print currfingerprint

这个版本的输出是:

<gnupg._parsers.ImportResult object at 0x10d1cd910>
[{'status': 'Entirely new key\n', 'fingerprint': u'A3F68FF91ABFE2486D830E99836024D82FD34F7F'}]
[{'dummy': u'', 'keyid': u'836024D82FD34F7F', 'expires': u'', 'rev': {}, 'sigs': {u'name (comment) <em@il>': []}, 'subkeys': [], 'length': u'2048', 'ownertrust': u'-', 'algo': u'1', 'fingerprint': u'A3F68FF91ABFE2486D830E99836024D82FD34F7F', 'date': u'1432591954', 'trust': u'-', 'type': u'pub', 'uids': [u'name (comment) <em@il>']}]

如果您需要通过从文件导入来工作的东西,那么您需要编写一些额外的代码来先将文件的内容读入一个变量,然后将其传递给 import_keys . (或者,您可以退回到 subprocess 解决方案,像您提到的那样直接调用 gpg --import。)