Monkeysphereopenpgp2pem
を使用してこれを行いました。
まず、次のようにしてキーの ID を取得します。
gpg --list-secret-keys
キーの 8 桁の 16 進数 ID に注意してください。例: 0123ABCD
公開鍵
公開鍵を取得するには:
gpg --export --no-armor 0123ABCD | openpgp2pem 0123ABCD
秘密鍵
を使用して秘密鍵を取得するにはopenpgp2pem
、残念ながら GPG キーのパスフレーズを削除する必要があります。これを行うには:
gpg --edit-key 0123ABCD
次に、passwd
コマンドを使用してパスフレーズを削除します。(元の GPG ホームディレクトリのコピーに対してこれを行い、 gpg--homedir
オプションを使用して一時コピーを操作することができます。)
その後、次のことができます。
gpg --export-secret-keys --no-armor 0123ABCD | openpgp2pem 0123ABCD
Python で使用するために PEM を変換する
実際には、このように生成された秘密鍵は、次を使用して PyCrypto で直接使用できることがわかりました。
from Crypto.PublicKey import RSA
with open('secret-key.pem', 'rb') as f:
key_secret = RSA.importKey(f.read())
ただし、上記で生成された公開鍵は PyCrypto で直接使用できませんでした (何かが欠けています)。次のように PyCrypto 互換の PEM を生成する必要がありました。
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")
または、次のように秘密鍵から生成することもできます。また、次のようにすると、パスフレーズを秘密鍵に戻すことができます。
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)
秘密鍵にパスフレーズが追加されると、次の方法で使用できます。
from Crypto.PublicKey import RSA
with open('secret-key.pem', 'rb') as f:
key_secret = RSA.importKey(f.read(), passphrase="xxxxxxxxxxxxxxxxxxxx")