¿Cómo imprimir una clave pública como cadena y cifrarla?

Así que he generado un certificado autofirmado y una clave privada con OpenSSL.

Ahora mismo estoy tratando de:

a) imprime la clave pública como una cadena. Esta:

f = open(CERT_FILE) cert_buffer = f.read() f.close() cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_buffer) pub_key = cert.get_pubkey() print pub_key 

Imprime algo como:

  

b) cifrar una cadena con esta clave pública

c) descifrar la cadena encriptada con una clave privada

Me gustaría ver algunos ejemplos de código. Por favor use solo OpenSSL, no envoltorios.

¿Es esto lo que quieres? Utiliza PyCrypto , no PyOpenSSL (no estoy seguro de si esto es lo que quería evitar cuando no menciona envoltorios )

 #!/usr/bin/env python from Crypto.Cipher import AES from Crypto.Cipher import PKCS1_OAEP from Crypto.PublicKey import RSA def step1(): rsaKey = RSA.importKey(open("./myKey.der", 'r')) print "Step 1: This is my rsa-key:\n%s" % rsaKey.exportKey() def step2_encrypt(string): rsaKey = RSA.importKey(open("./myKey.der", 'r')) pkcs1CipherTmp = PKCS1_OAEP.new(rsaKey) encryptedString = pkcs1CipherTmp.encrypt(string) print "Step 2: encrypted %s is %s" % (string, encryptedString) return encryptedString def step3_decrypt(encryptedString): rsaKey = RSA.importKey(open("./myKey.der", 'r')) pkcs1CipherTmp = PKCS1_OAEP.new(rsaKey) decryptedString = pkcs1CipherTmp.decrypt(encryptedString) print "Step 3: decryptedString %s is %s" % (encryptedString, decryptedString) return decryptedString if __name__ == "__main__": step1() encryptedString = step2_encrypt("hello, duuude") decryptedString = step3_decrypt(encryptedString) print "Tadaaaa: %s" % decryptedString 

Los archivos clave contienen las partes públicas / privadas, por lo que los módulos de cifrado / descifrado sabrán qué hacer.

¿Necesita la clave pública / privada en dos archivos separados (debe ser sencillo, correcto)?

Tenga en cuenta que al usar el cifrado asimétrico, la cantidad máxima de caracteres que puede cifrar depende del módulo utilizado en su clave. En el ejemplo anterior, si usa una clave RSA normal (SHA-1, con módulo de 20 bytes), obtendrá errores para cadenas de más de 214 bytes. Como señaló cyroxx en los comentarios, no hay una limitación teórica para el algoritmo (puede cifrar cadenas largas con claves muy largas), pero el tiempo de cálculo que tomaría lo hace bastante inviable para fines prácticos.

Si necesita cifrar grandes porciones de datos, probablemente querrá cifrar esos datos con un algoritmo simétrico (como AES) y enviar la contraseña cifrada con las claves RSA (asimétricas) a lo largo de los datos transferidos … pero eso es un asunto diferente con una serie de otros problemas 🙂