我正在尝试使用通过GPG生成的密钥和RSA加密(这部分是可更改的,GnuPG和Pycrypto不是)来加密文件,但是我实际导入密钥时遇到了麻烦。我目前正在使用这样的代码:
key = cryptoRSA.importKey(public_key)
cipher = PKCS1_OAEP.new(RSAkey)
file = open(filename)
但是,这会引发错误,因为我的public_key不是DER结构。有没有办法生成一个与Pycrypto合作的public_key?我对密码学很陌生,所以我不完全确定如何解决这个问题。
答案 0 :(得分:2)
GPG密钥不仅仅是“普通”密钥;它增加了很多其他的东西。您应该使用monkeysphere中的openpgp2pem工具将其首先转换为标准的OpenSSL PEM密钥。
答案 1 :(得分:2)
我是使用Monkeysphere中的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
在实践中,我发现这样生成的密钥可以直接在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")