es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Generación de clave compartida desde EC con pycryptodome

Actualmente estoy trabajando en un proyecto en el que necesito calcular una clave simétrica hkdf.
Para hacerlo, necesito generar un secreto compartido a partir de la clave privada y una clave pública efímera.

Para el resto de mi trabajo, utilizo pycryptodome, pero no puedo encontrar en la documentación si permite la generación de secretos compartidos. Vi en los planes futuros su intención de agregar Curvas Elípticas (ECIES, ECDH), ya que ECDH se basa en la clave compartida, no sería sorprendente si la generación de la clave compartida aún no estuviera implementada.

También intenté usar la librería cryptography, pero no pude cargar mi clave efímera.

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import ec

def _compute_shared_secret(ephemeral_public_key: bytearray) -> bytes:
    client_public_key = serialization.load_der_public_key(ephemeral_public_key)
    server_private_key = serialization.load_der_private_key(b"mi clave privada", password=None)
    shared_secret = server_private_key.exchange(ec.ECDH(), client_public_key)
    return shared_secret
No se pudo descifrar la clave. Los datos pueden estar en un formato incorrecto o estar cifrados con un algoritmo no compatible.

ephemeral_public_key está codificada en base64 y es proporcionada por la API de GPay.

Me gustaría saber si puedo hacerlo con pycryptodome y, si no, si usar la librería cryptography solo para esta parte es una buena idea.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Generando un Secreto Compartido para una Clave Simétrica HKDF usando Python

    Para generar un secreto compartido a partir de la clave privada y una clave pública efímera, se puede utilizar el cifrado Elíptico de Curva Diffie-Hellman (ECDH) que se basa en una clave compartida.

    Si estás utilizando pycryptodome, actualmente no soporta ECDH pero tal vez lo agreguen en el futuro.

    Alternativamente, se puede usar la biblioteca cryptography para calcular el secreto compartido, pero asegúrate de formatear correctamente la clave pública efímera antes de cargarla con load_der_public_key.

    Aquí hay un ejemplo de fragmento de código:

    from cryptography.hazmat.primitives import serialization
    from cryptography.hazmat.primitives.asymmetric import ec
    
    def compute_shared_secret(ephemeral_public_key: str) -> bytes:
        # descodifica la clave púbica en base64
        public_key_bytes = base64.b64decode(ephemeral_public_key)
        public_key = serialization.load_der_public_key(public_key_bytes)
    
        # carga la clave privada del servidor 
        with open('/ruta/a/clave_privada.pem', 'rb') as f:
            pem_data = f.read()
        clave_privada_servidor = serialization.load_pem_private_key(pem_data, password=None)
    
        secreto_compartido = clave_privada_servidor.exchange(ec.ECDH(), public_key)
        return secreto_compartido
    

    Asegúrate de establecer correctamente la ruta y la contraseña para la clave privada antes de usarla.

Comments are closed.