Python 如何使GnuPG密钥与Pycrypto兼容

Python 如何使GnuPG密钥与Pycrypto兼容,python,pycrypto,gnupg,openpgp,Python,Pycrypto,Gnupg,Openpgp,我试图使用通过GPG生成的密钥和RSA加密(这部分是可更改的,GnuPG和Pycrypto不是)来加密文件,但实际导入密钥时遇到了问题。我目前使用的代码如下: key = cryptoRSA.importKey(public_key) cipher = PKCS1_OAEP.new(RSAkey) file = open(filename) 但是,这会引发错误,因为我的公钥不是DER结构。有没有一种方法可以生成一个可以与Pycrypto一起使用的公钥?我对密码学真的很陌生,所以我根本不知道该怎

我试图使用通过GPG生成的密钥和RSA加密(这部分是可更改的,GnuPG和Pycrypto不是)来加密文件,但实际导入密钥时遇到了问题。我目前使用的代码如下:

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

但是,这会引发错误,因为我的公钥不是DER结构。有没有一种方法可以生成一个可以与Pycrypto一起使用的公钥?我对密码学真的很陌生,所以我根本不知道该怎么处理这个问题。

GPG密钥比“普通”密钥要多得多;它增加了很多其他的东西。您应该首先使用中的openpgp2pem工具将其转换为标准的OpenSSL PEM密钥。

我已经使用中的
openpgp2pem
完成了此操作

首先,通过执行以下操作获取密钥ID:

gpg --list-secret-keys
请注意键的8位十六进制ID。例如,0123ABCD

公钥 要获取公钥,请执行以下操作:

gpg --export --no-armor 0123ABCD | openpgp2pem 0123ABCD
密钥 要使用
openpgp2pem
获取密钥,不幸的是,必须删除GPG密钥的密码短语。为此,请执行以下操作:

gpg --edit-key 0123ABCD
然后使用
passwd
命令删除其密码短语。(您可以在原始GPG homedir的副本上执行此操作,并使用GPG
--homedir
选项对临时副本进行操作。)

然后,您可以执行以下操作:

gpg --export-secret-keys --no-armor 0123ABCD | openpgp2pem 0123ABCD
转换PEM以供Python使用 在实践中,我发现这样生成的密钥可以通过以下方式直接用于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")

肯定有比我更全面的答案:-)