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)