OpenSSL Generate ECDH Public Key

0

Estoy tratando de usar la línea de comandos OpenSSL para generar una clave pública ECDH que cumpla con las siguientes especificaciones:

  

Utilice una estructura XPP.PublicKeyInfo codificada en Base64 que contiene una clave pública ECDH para el grupo P256

Los siguientes comandos me proporcionan una clave:

openssl ecparam -name prime256v1 -out prime256v1.pem
openssl ecparam -in prime256v1.pem -genkey -noout -out prime256v1-key.pem
openssl ec -in prime256v1-key.pem -pubout -out pubkey.pem

Key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq23h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==

Sin embargo, la API a la que estoy accediendo no acepta esta clave.

Un ejemplo de clave que funciona es:

MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgACKoJz0lSBocGMsdl8TiMasRsBOxpMywCqzAoOLwZfUl0=

Esta clave de ejemplo es 44 (Base64) bytes más corta y tiene una firma SubjectPublickKeyInfo ligeramente diferente.

Mi pregunta es cuál es la diferencia entre estas dos claves y cómo podría usar las herramientas de línea de comandos de OpenSSL para generar un par de claves de este tipo.

    
pregunta PassKit 28.07.2016 - 20:48
fuente

1 respuesta

3

Probar versión comprimida

Lo que publicaste allí como "clave de ejemplo que funciona" es una clave de tipo CE codificada en base64 sin el envoltorio PEM y sin los saltos de línea habituales. Y más específicamente es una versión COMPRIMIDA de la clave de acceso de la CE. Pero openssl escribe teclas sin comprimir por defecto .

Puede convertir entre las versiones comprimidas y sin comprimir de la siguiente manera:

$ cat ExampleOfRejectedKey.headerlesspem
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq23h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==

Haz un openssl parse en la clave

$ openssl ec -inform DER -pubin -in <(base64 -d ExampleOfRejectedKey.headerlesspem)
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq2
3h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==
-----END PUBLIC KEY-----

De nuevo, pero con "-conv_form comprimido"

$ openssl ec -inform DER -pubin -in <(base64 -d ExampleOfRejectedKey.headerlesspem) -conv_form compressed
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAC85KGK3YiX7tC7mFm+Te1xRYOeDq2
3h80MPPt1nMZ/ZQ=
-----END PUBLIC KEY-----

Como puedes ver: ahora es mucho más corto. Y más cerca en longitud a la llave de trabajo. Prueba esto. (Por qué cualquier API insistiría en una representación comprimida, y no decirlo, me supera).

Lectura adicional

Vea esta pregunta: 2011-07-12, ¿Existe una codificación estandarizada de longitud fija para las claves públicas de la CE?

    
respondido por el StackzOfZtuff 27.12.2016 - 12:27
fuente

Lea otras preguntas en las etiquetas