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.
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 conload_der_public_key
.Aquí hay un ejemplo de fragmento de código:
Asegúrate de establecer correctamente la ruta y la contraseña para la clave privada antes de usarla.