¿OpenSSL ecparam genera la misma clave privada cada vez?

0

Actualmente estoy tratando de hacer que mi servidor web sea lo más seguro posible y estoy probando diferentes conjuntos de cifrado en el lado del servidor, algunos de ellos utilizando el intercambio de claves ECDHE.

Al generar claves EC privadas, noté que la mayoría de los datos generados son idénticos cuando se generan dos claves. La salida en bruto:

root@spock:/etc/letsencrypt/live/binarus.home.omeganet.de# openssl ecparam -name secp256k1 -param_enc explicit -genkey
-----BEGIN EC PARAMETERS-----
MIGiAgEBMCwGByqGSM49AQECIQD////////////////////////////////////+
///8LzAGBAEABAEHBEEEeb5mfvncu6xVoGKVzocLBwKb/NstzijZWfKBWxb4F5hI
Otp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuAIhAP//////////////////
//66rtzmr0igO7/SXozQNkFBAgEB
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MIIBEwIBAQQgpCZwVgJpH7t70lK0V1MSGvCe8IcOtXPP+S/luqFsr/eggaUwgaIC
AQEwLAYHKoZIzj0BAQIhAP////////////////////////////////////7///wv
MAYEAQAEAQcEQQR5vmZ++dy7rFWgYpXOhwsHApv82y3OKNlZ8oFbFvgXmEg62ncm
o8RlXaT7/A4RCKj9F7RIpoVUGZxH0I/7ENS4AiEA/////////////////////rqu
3OavSKA7v9JejNA2QUECAQGhRANCAASXlnk1RIp1fKlGxcZMsm0mJLJ6xoIG4Z8t
AYn30X5pA3P00BpweidnzeqLlytPBuFeqwbJBuH3rXnpIvMe2W89
-----END EC PRIVATE KEY-----

root@spock:/etc/letsencrypt/live/binarus.home.omeganet.de# openssl ecparam -name secp256k1 -param_enc explicit -genkey
-----BEGIN EC PARAMETERS-----
MIGiAgEBMCwGByqGSM49AQECIQD////////////////////////////////////+
///8LzAGBAEABAEHBEEEeb5mfvncu6xVoGKVzocLBwKb/NstzijZWfKBWxb4F5hI
Otp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuAIhAP//////////////////
//66rtzmr0igO7/SXozQNkFBAgEB
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MIIBEwIBAQQgXccG/nHnL17f60wwQq7zwngdSIg9c+ATwy2CSMY+2PWggaUwgaIC
AQEwLAYHKoZIzj0BAQIhAP////////////////////////////////////7///wv
MAYEAQAEAQcEQQR5vmZ++dy7rFWgYpXOhwsHApv82y3OKNlZ8oFbFvgXmEg62ncm
o8RlXaT7/A4RCKj9F7RIpoVUGZxH0I/7ENS4AiEA/////////////////////rqu
3OavSKA7v9JejNA2QUECAQGhRANCAASzr/OIB4ab1o6++PPJCg/TdbdmDHIiYxOD
Gi7hfp5VGe8d++PrAb3B5Pnvn2TmrDsbNzeysGp0IPjpH+ns56vn
-----END EC PRIVATE KEY-----

Como puede ver, la mayoría de la clave privada es idéntica. Pero mi comprensión de generar una clave privada siempre ha sido que cada clave privada debe ser única. ¿Alguien podría arrojar algo de luz sobre esto?

Tenga en cuenta que he observado esto con diferentes versiones de OpenSSL, entre ellas la más reciente (OpenSSL 1.0.2e). Tenga en cuenta también que el resultado es el mismo si dejo de lado el interruptor de la línea de comandos -param_enc explícito.

Si bien al menos hay unos pocos bytes diferentes en los resultados anteriores, estoy completamente perdido al permitir que OpenSSL traduzca los datos generados a un formato legible para humanos:

root@spock:/etc/letsencrypt/live/binarus.home.omeganet.de# openssl ecparam -name secp256k1 -param_enc explicit -genkey | openssl asn1parse
    0:d=0  hl=3 l= 162 cons: SEQUENCE          
    3:d=1  hl=2 l=   1 prim: INTEGER           :01
    6:d=1  hl=2 l=  44 cons: SEQUENCE          
    8:d=2  hl=2 l=   7 prim: OBJECT            :prime-field
   17:d=2  hl=2 l=  33 prim: INTEGER           :FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
   52:d=1  hl=2 l=   6 cons: SEQUENCE          
   54:d=2  hl=2 l=   1 prim: OCTET STRING      [HEX DUMP]:00
   57:d=2  hl=2 l=   1 prim: OCTET STRING      [HEX DUMP]:07
   60:d=1  hl=2 l=  65 prim: OCTET STRING      [HEX DUMP]:0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
  127:d=1  hl=2 l=  33 prim: INTEGER           :FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
  162:d=1  hl=2 l=   1 prim: INTEGER           :01

root@spock:/etc/letsencrypt/live/binarus.home.omeganet.de# openssl ecparam -name secp256k1 -param_enc explicit -genkey | openssl asn1parse
    0:d=0  hl=3 l= 162 cons: SEQUENCE          
    3:d=1  hl=2 l=   1 prim: INTEGER           :01
    6:d=1  hl=2 l=  44 cons: SEQUENCE          
    8:d=2  hl=2 l=   7 prim: OBJECT            :prime-field
   17:d=2  hl=2 l=  33 prim: INTEGER           :FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
   52:d=1  hl=2 l=   6 cons: SEQUENCE          
   54:d=2  hl=2 l=   1 prim: OCTET STRING      [HEX DUMP]:00
   57:d=2  hl=2 l=   1 prim: OCTET STRING      [HEX DUMP]:07
   60:d=1  hl=2 l=  65 prim: OCTET STRING      [HEX DUMP]:0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
  127:d=1  hl=2 l=  33 prim: INTEGER           :FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
  162:d=1  hl=2 l=   1 prim: INTEGER           :01

Ahora todas las cuerdas de OCTET son exactamente iguales. A mi entender, una de estas debe ser la clave privada, ¿no es así?

Estaría agradecido por cualquier explicación. Tengo antecedentes matemáticos y de programación, y he comprendido los conceptos detrás de la criptografía asimétrica de base RSA. Pero casi no tengo conocimiento acerca de la criptografía de curva elíptica. Solo quiero usarlo para el intercambio de claves ECDHE para fortalecer las consultas HTTPS con perfecto secreto hacia adelante.

Muchas gracias de antemano ...

    
pregunta user94421 13.12.2015 - 12:15
fuente

1 respuesta

1

Engañando a PEM

Estas teclas no son idénticas. Ellos son muy diferentes. Todos comienzan con 'MI', pero eso es solo una propiedad de la codificación PEM Base-64.

También: Supongo que su ASN1PARSE solo analiza el PRIMER OBJETO PEM en esa salida. Y esa es la curva nombrada que querías. Así que eso se supone que es idéntico. Analice el segundo objeto PEM (la clave privada real) y verá que las claves privadas (los PUNTOS DE CURVA) NO son idénticas.

    
respondido por el StackzOfZtuff 13.12.2015 - 12:51
fuente

Lea otras preguntas en las etiquetas