python openssl rsa pycrypto

python - ¿Cómo uso un certificado X509 con PyCrypto?



openssl rsa (2)

PyCrypto no es compatible con los certificados X.509. Primero debe extraer la clave pública con el comando:

openssl x509 -inform pem -in mycert.pem -pubkey -noout > publickey.pem

Luego, puede usar RSA.importKey en publickey.pem .

Si no quiere o no puede usar openssl, puede tomar el certificado PEM X.509 y hacerlo en Python puro de esta manera:

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)

Quiero encriptar algunos datos en Python con PyCrypto.

Sin embargo, recibo un error al usar key = RSA.importKey(pubkey) :

RSA key format is not supported

La clave se generó con:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mycert.key -out mycert.pem

El código es:

def encrypt(data): pubkey = open(''mycert.pem'').read() key = RSA.importKey(pubkey) cipher = PKCS1_OAEP.new(key) return cipher.encrypt(data)


Aquí hay un buen ejemplo: 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)