¿Por qué la longitud de la clave openssl es diferente de los bytes especificados?

4

Me doy cuenta de que esta es una pregunta rudimentaria, pero parece que ni siquiera puedo diagnosticarla por google. ¿Por qué la longitud de la clave openssl es diferente de los bytes especificados? Por ejemplo cuando uso el comando:

openssl genrsa -out testKey 512

Produzco una clave dentro de mi archivo testKey con el mensaje "Generando clave privada RSA, módulo de 512 bits de largo". Sin embargo, cuando verifico la longitud de solo la parte de la clave dentro del archivo, solo tiene 424 caracteres.

¿Por qué es eso, y por qué no tiene en realidad 512 caracteres?

¿Hay una manera de generar una clave RSA a través de openssl con una longitud específica en mente, como 512 caracteres? Me doy cuenta de que mi malentendido puede deberse a mi falta de conocimiento de lo que realmente está haciendo el comando anterior, pero solo necesito un empujón en la dirección correcta.

    
pregunta void.massive 12.10.2015 - 18:59
fuente

2 respuestas

3

Está generando una clave privada RSA con un módulo 512. Sin embargo, RSA necesita bastante más elementos para trabajar (el artículo de wikipedia es bastante bueno aquí). Como esta no es una pregunta relacionada con RSA, no entraré en detalles y le daré el comando que está buscando.

Para procesar la clave privada RSA y ver todo lo que contienen estos datos, ejecute el siguiente comando:

openssl rsa -noout -text -in testKey

El primer bloque es su módulo privado de 512 bits.

    
respondido por el Zonk 12.10.2015 - 22:00
fuente
3

Las longitudes de clave para los cifrados generalmente se expresan en bits, no en bytes. 8 bits = 1 byte. Por lo tanto, lo que realmente esperaría ver es una clave de 512 bits = 64 bytes, ¿por qué no lo hizo?

Primero: el formato. El archivo de salida de su comando es un archivo PEM, lo que significa que es un Base64 -codificado DER estructura de datos codificados donde los datos de Base64 se incluyen en estas líneas -----BEGIN … ----- y -----END … ----- . Base64 es una codificación que genera 4 caracteres por cada 3 bytes de entrada. Entonces, sus 424 caracteres después de la codificación Base64 eran 318 bytes (= 2544 bits) antes de la codificación. Pero eso todavía no es de 64 bytes, ¿verdad?

Segundo: Datos adicionales. Cuando solicita una clave con un tamaño de 512 bits, lo que solicita es una clave cuyo módulo público tiene un tamaño de 512 bits. Pero una clave RSA consiste en este módulo público y el exponente publico El último generalmente es bastante pequeño, en su ejemplo, era de 17 bits (almacenado como 3 bytes). ¿Qué más?

Tercero: La clave privada. Luego, el comando genrsa genera realmente un par de claves RSA que consta de claves privadas y públicas. No hay comando para generar una clave pública, ya que sería inútil. En cambio, por convención, cuando almacena la clave privada, también almacena la clave pública, ya que de todos modos es solo un valor adicional. Normalmente, la clave privada sería aproximadamente del mismo tamaño que el exponente público, por lo que aún no hemos explicado el tamaño del archivo. Esto se debe a que openssl usa una optimización basada en el teorema del resto chino y para esto necesita para almacenar tres valores adicionales con la clave privada.

¿Cómo puedes ver todo esto por ti mismo?

  • openssl base64 -d -in testKey -out testKey.raw decodificará la codificación base64 y generará los datos en bruto. Esto tiene un tamaño de 318 bytes.
  • openssl asn1parse -in testKey (o alternativamente: openssl asn1parse -in testKey.raw -inform der para decirle que no espere PEM sino DER sin procesar) genéricamente analizará la codificación ASN.1 DER y le mostrará los campos individuales.
  • openssl rsa -in testKey -text -noout analizará el archivo como una clave RSA y le dará una interpretación de todos los campos, es decir, sus valores.
respondido por el Henryk Plötz 12.10.2015 - 23:46
fuente

Lea otras preguntas en las etiquetas