<p>我使用<code>openpgp2pem</code>从<a href="http://web.monkeysphere.info/" rel="nofollow">Monkeysphere</a>完成了此操作。在</p>
<p>首先,通过以下操作获取密钥的ID:</p>
<pre><code>gpg list-secret-keys
</code></pre>
<p>请注意密钥的8位十六进制ID。E、 g.0123ABCD</p>
<h3>公钥</h3>
<p>要获取公钥:</p>
^{pr2}$
<h3>密钥</h3>
<p>{不幸的是,{cdg>必须删除密钥^才能获得密钥。通过以下方式实现:</p>
<pre><code>gpg edit-key 0123ABCD
</code></pre>
<p>然后使用<code>passwd</code>命令删除其密码短语。(可以在原始GPG homedir的副本上执行此操作,并使用GPG<code> homedir</code>选项对临时副本进行操作。)</p>
<p>之后,您可以:</p>
<pre><code>gpg export-secret-keys no-armor 0123ABCD | openpgp2pem 0123ABCD
</code></pre>
<h3>转换PEM供Python使用</h3>
<p>在实践中,我发现这样生成的密钥可以直接在PyCrypto中使用:</p>
<pre><code>from Crypto.PublicKey import RSA
with open('secret-key.pem', 'rb') as f:
key_secret = RSA.importKey(f.read())
</code></pre>
<p>但是,上面生成的公钥不能直接用于PyCrypto(它缺少一些东西)。我必须生成一个与PyCrypto兼容的PEM,如下所示:</p>
<pre><code>from base64 import b64encode, b64decode
from Crypto.PublicKey import RSA
def publicpem2pycrypto(public_pem):
public_64 = public_pem.replace(b" -BEGIN RSA PUBLIC KEY -", b"").replace(b" -END RSA PUBLIC KEY -", b"")
pub_der = b64decode(public_64)
key_pub = RSA.importKey(pub_der)
key_public_export = key_pub.exportKey('PEM')
print(key_public_export.decode('ascii'))
with open('public-key.pem', 'wb') as f:
f.write(key_public_export)
print("Saved to public-key.pem")
</code></pre>
<p>或者,它可以从密钥生成,如下所示。另外,下面允许将密码短语重新添加到密钥中:</p>
<pre><code>from base64 import b64encode, b64decode
from Crypto.PublicKey import RSA
def secretpem2pycrypto(out_secret_filename, out_public_filename, secret_pem, passphrase=None):
secret_64 = secret_pem.replace(b" -BEGIN RSA PRIVATE KEY -", b"").replace(b" -END RSA PRIVATE KEY -", b"")
secret_64 = secret_64.replace(b"\n", b"")
#print(secret_64)
secret_der = b64decode(secret_64)
#print(b64encode(secret_der))
key_secret = RSA.importKey(secret_der)
key_secret_export = key_secret.exportKey('PEM', passphrase=passphrase)
key_public_export = key_secret.publickey().exportKey('PEM')
print(key_secret_export.decode('ascii'))
with open(out_secret_filename, 'wb') as f:
f.write(key_secret_export)
print("Saved to " + out_secret_filename)
if True:
print()
print(key_public_export.decode('ascii'))
with open(out_public_filename, 'wb') as f:
f.write(key_public_export)
print("Saved to " + out_public_filename)
</code></pre>
<p>一旦密钥添加了密码短语,就可以通过以下方式使用:</p>
<pre><code>from Crypto.PublicKey import RSA
with open('secret-key.pem', 'rb') as f:
key_secret = RSA.importKey(f.read(), passphrase="xxxxxxxxxxxxxxxxxxxx")
</code></pre>