如何在PyCrypto中使用X509证书?
我想用PyCryptoencryptionpython中的一些数据。
但是,当我使用key = RSA.importKey(pubkey)
时出现错误:
RSA key format is not supported
密钥是由以下产生的:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mycert.key -out mycert.pem
代码是:
def encrypt(data): pubkey = open('mycert.pem').read() key = RSA.importKey(pubkey) cipher = PKCS1_OAEP.new(key) return cipher.encrypt(data)
PyCrypto不支持X.509证书。 您必须先使用以下命令提取公钥:
openssl x509 -inform pem -in mycert.pem -pubkey -noout > publickey.pem
然后,您可以在publickey.pem
上使用RSA.importKey
。
如果你不想或不能使用openssl,你可以拿PEM X.509证书,像这样用纯Python来完成:
from Crypto.Util.asn1 import DerSequence from Crypto.PublicKey import RSA from binascii import a2b_base64 # Convert from PEM to DER pem = open("mycert.pem").read() lines = pem.replace(" ",'').split() der = a2b_base64(''.join(lines[1:-1])) # Extract subjectPublicKeyInfo field from X.509 certificate (see RFC3280) cert = DerSequence() cert.decode(der) tbsCertificate = DerSequence() tbsCertificate.decode(cert[0]) subjectPublicKeyInfo = tbsCertificate[6] # Initialize RSA key rsa_key = RSA.importKey(subjectPublicKeyInfo)
这是一个很好的例子: https : //www.dlitz.net/software/pycrypto/api/2.6/Crypto.Cipher.PKCS1_OAEP-module.html
from Crypto.Cipher import PKCS1_OAEP from Crypto.PublicKey import RSA # sender side message = 'To be encrypted' key = RSA.importKey(open('pubkey.der').read()) cipher = PKCS1_OAEP.new(key) ciphertext = cipher.encrypt(message) # receiver side key = RSA.importKey(open('privkey.der').read()) cipher = PKCS1_OAP.new(key) message = cipher.decrypt(ciphertext)