La salida de OpenSSL Base64 tiene una longitud incorrecta

0

Intento generar un par de claves ECDH P-256 según se requiere para los mensajes de inserción web.

openssl ecparam -name prime256v1 -genkey -noout -out priv_key.pem

... genera las claves.

openssl ec -noout -text -in priv_key.pem

... se ve bien: como se esperaba, la clave privada tiene 33 bytes, la clave pública 65. Cuando exporto la clave pública:

openssl ec -in priv_key.pem -pubout -out pub_key.pem

... Espero que la salida base64 tenga 88 caracteres, pero lo que obtengo es 126. El servidor no acepta esta clave. Leí sobre base64 comprimido ( enlace ) pero esto tampoco resuelve el problema (da como resultado un byte de 80 bytes). cadena base64). De todos modos, no entiendo cómo OpenSSL genera esta salida base64.

    
pregunta wortwart 22.03.2018 - 11:44
fuente

2 respuestas

1

Así que tienes razón acerca de las longitudes. Como señaló Steffen Ullrich, tiene una forma de mostrar la estructura del objeto asn1 utilizando openssl asn1parse .

Si desea extraer la clave pública, y solo la clave pública, debe extraerla del objeto asn1 .

Para hacerlo:

openssl ec -in priv_key.pem -pubout -outform DER 2> /dev/null | \
dd bs=1 skip=$((2+2+19+2+1)) 2> /dev/null > raw_pub.key

Puede verificar que la clave tenga una longitud de 65 bytes. Una vez que base64 es 88 como dijiste.

El significado de $((2+2+19+2)) son los bytes que debe omitir para alcanzar el objeto BIT STRING que produce la clave pública. También tuvimos 1 byte adicional para omitir porque la clave pública tiene el siguiente formulario:

  • 0x00 para el relleno
  • 0x02 o 0x04 comprimido / sin comprimir
  • la carga útil de la clave pública real

hl significa header length creo y donde se almacena el tipo de objeto, por lo que explica todo el 2 s.

l representa length y es la longitud de todo el objeto.

d significa depth e indica objetos anidados, como usted tendría en json , por ejemplo.

Entonces, BIT STRING está en depth=1 después de 2:d=1 hl=2 l= 19 cons: SEQUENCE . Tenemos que agregar 19 bytes a nuestro salto para alcanzar el encabezado BIT STRING que saltamos - otro 2 bytes entonces estamos en nuestro destino.

EDITAR:

Según los comentarios que he agregado y 1 byte adicional debido al relleno.

Fuente: rfc5480 # section-2.2

    
respondido por el tehmoon 22.03.2018 - 15:16
fuente
2

No obtiene los bits en bruto de la clave solo cuando lo exporta utilizando openssl ec -pubout sino una estructura con más información:

$ openssl asn1parse -in pub_key.pem -dump
    0:d=0  hl=2 l=  89 cons: SEQUENCE          
    2:d=1  hl=2 l=  19 cons: SEQUENCE          
    4:d=2  hl=2 l=   7 prim: OBJECT            :id-ecPublicKey
   13:d=2  hl=2 l=   8 prim: OBJECT            :prime256v1
   23:d=1  hl=2 l=  66 prim: BIT STRING        
      0000 - 00 04 11 5e 44 51 b0 95-4e 9b 14 42 e7 60 21 10   ...^DQ..N..B.'!.
      0010 - f0 05 5d b4 bb 76 22 6d-2e 45 66 ad 3a 89 eb f2   ..]..v"m.Ef.:...
      0020 - 15 00 57 89 29 98 ce 84-5e b2 58 83 fb 8d 7a 59   ..W.)...^.X...zY
      0030 - 6d 11 2e 5d c3 7c e1 df-4a c9 ce a6 94 89 61 2a   m..].|..J.....a*
      0040 - dc 06

Por lo tanto, obtiene esencialmente 91 octetos binarios que se traducen en 124 caracteres cuando se codifican como base64.

    
respondido por el Steffen Ullrich 22.03.2018 - 14:25
fuente

Lea otras preguntas en las etiquetas