4

ファイルを暗号化するために GPG で生成された RSA 暗号化 (この部分は変更可能で、GnuPG と Pycrypto は変更できません) を使用してキーを使用しようとしていますが、実際にキーをインポートするのに問題があります。現在、次のようなコードを使用しています。

key = cryptoRSA.importKey(public_key)
cipher = PKCS1_OAEP.new(RSAkey)
file = open(filename)

ただし、私の public_key は DER 構造ではないため、これはエラーをスローしています。Pycrypto で動作する public_key を生成する方法はありますか? 私は暗号化に本当に慣れていないので、この問題についてどうすればよいかまったくわかりません。

4

2 に答える 2

3

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")
于 2015-06-17T01:24:52.733 に答える
2

GPG キーは「通常の」キー以上のものです。それは他の多くのものを追加します。monkeysphere のopenpgp2pemツールを使用して、最初に標準の OpenSSL PEM キーに変換する必要があります。

于 2013-10-30T10:56:13.027 に答える