web-dev-qa-db-fra.com

Comment utiliser un certificat X509 avec PyCrypto?

Je veux crypter certaines données dans python avec PyCrypto.

Cependant, j'obtiens une erreur lors de l'utilisation de key = RSA.importKey(pubkey):

RSA key format is not supported

La clé a été générée avec:

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

Le code est:

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

PyCrypto ne prend pas en charge les certificats X.509. Vous devez d'abord extraire la clé publique avec la commande:

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

Ensuite, vous pouvez utiliser RSA.importKey sur publickey.pem.


Si vous ne voulez pas ou ne pouvez pas utiliser openssl, vous pouvez prendre le certificat PEM X.509 et le faire en pur Python comme ceci:

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

Voici un bon exemple: 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)
1
earthling