如何使GnuPG密钥与Pycryp兼容

2024-09-29 21:45:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用通过GPG生成的带有RSA加密的密钥(这部分是可变的,GnuPG和Pycrypto不是)来加密文件,但是我在实际导入密钥时遇到了困难。我当前使用的代码如下:

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

但是,这会抛出一个错误,因为我的公钥不是DER结构。有没有一种方法可以生成一个与Pycrypto一起工作的公钥?我对密码学还不太熟悉,所以我根本不知道该怎么解决这个问题。在


Tags: 文件key代码密钥publicgpgrsacipher
2条回答

我使用openpgp2pemMonkeysphere完成了此操作。在

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

gpg  list-secret-keys

请注意密钥的8位十六进制ID。E、 g.0123ABCD

公钥

要获取公钥:

^{pr2}$

密钥

{不幸的是,{cdg>必须删除密钥^才能获得密钥。通过以下方式实现:

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")

GPG密钥远不止是一个“普通”密钥,它还添加了许多其他内容。您应该首先使用monkeysphere中的openpgp2pem工具将其转换为标准的opensslppem密钥。在

相关问题 更多 >

    热门问题