¿Por qué openssl escribe parámetros EC al generar una clave privada?

7

Cuando estoy generando una clave privada con openssl , escribe los parámetros de la curva y la clave privada real:

❯ openssl ecparam  -name secp256k1 -genkey
-----BEGIN EC PARAMETERS-----
BgUrgQQACg==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIKYV1xoz6smkpdMksfgI8/3465V02UZdaKj4JSH30bBhoAcGBSuBBAAK
oUQDQgAEO1O+/xRGEVJgBEAOQorBveXPTQS3c7MA+9R+HEMP7TkscI9FONPclcRb
5sXZJjYHNYWhvxuXdGl8QrFVRIVBYg==
-----END EC PRIVATE KEY-----

Tenga en cuenta que los parámetros no contienen datos reales, solo haga referencia al estándar utilizado:

❯ openssl ecparam  -name secp256k1 | openssl asn1parse
    0:d=0  hl=2 l=   5 prim: OBJECT            :secp256k1

Sin embargo, cuando miro la clave privada, ¡puedo ver que contiene el tipo de curva utilizada! Mira la línea que comienza con 41:d

❯ openssl ecparam  -name secp256k1 -genkey -noout | openssl asn1parse
    0:d=0  hl=2 l= 116 cons: SEQUENCE          
    2:d=1  hl=2 l=   1 prim: INTEGER           :01
    5:d=1  hl=2 l=  32 prim: OCTET STRING      [HEX DUMP]:872F67D0B852C6FE9BD1F5B93AF54B7555D21267200DA2F8ED735729BF32730A
   39:d=1  hl=2 l=   7 cons: cont [ 0 ]        
   41:d=2  hl=2 l=   5 prim: OBJECT            :secp256k1
   48:d=1  hl=2 l=  68 cons: cont [ 1 ]        
   50:d=2  hl=2 l=  66 prim: BIT STRING

¿Hay alguna razón por la que necesito los parámetros EC? ¿Por qué los produce por defecto?

(La única razón por la que puedo pensar en necesitar esos parámetros de EC, es para usarlos como entrada cuando se genera una clave privada, pero ¿no es mejor dar su nombre en la línea de comandos?)     

pregunta Elazar Leibovich 27.01.2013 - 23:00
fuente

1 respuesta

6

Es una peculiaridad de OpenSSL. El comando ecparam está diseñado para manejar los parámetros de EC, es decir, la definición de una curva para jugar, y permite la generación de una clave privada como una característica secundaria. Puede utilizar el argumento de línea de comando -noout para suprimir la producción de los propios parámetros de CE codificados:

$ openssl ecparam -name secp256k1 -genkey -noout
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIHyx/m9I6/ZbvqN5XJ/fZSM6P7PIuvNDnWdp8STjlGqQoAcGBSuBBAAK
oUQDQgAEVGRwTHlFRgxmhnJNO4Vfdojmg2pni44U4SMFEziNM8YVhd62UzwB5L0+
n8EXsvTIv5Uj7COQd/1cTsdL9kin4w==
-----END EC PRIVATE KEY-----

Además, la existencia de una estructura independiente de "parámetros EC" se justifica por el hecho de que la codificación de la clave privada podría carecer de la información; Consulte RFC 5915 que proporciona el siguiente tipo de ASN.1:

ECPrivateKey ::= SEQUENCE {
  version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
  privateKey     OCTET STRING,
  parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
  publicKey  [1] BIT STRING OPTIONAL
}

donde los campos parameters y publicKey están debidamente marcados como "opcionales".

En cuanto a la representación interna de los parámetros (ya sea de forma independiente o como parte de la estructura de clave privada), el uso de un OID simple es bastante normal. Generar su propia curva elíptica es sustancialmente más difícil que producir nuevos parámetros DSA; Además, seguir unas cuantas curvas estándar hace que la implementación de la criptografía EC sea más fácil y más rápida. Por lo tanto, la mayoría de las implementaciones están restringidas a unas pocas curvas estándar, a menudo la P-256 y la P-384 de NIST (en realidad de SEC, luego" anexado "por NIST). Las implementaciones que soportan las 15 curvas NIST estándar son una rareza; las implementaciones que soportan curvas "arbitrarias" (donde los valores de la curva completa están codificados en la estructura de parámetros) son míticas (nunca tropecé con una, aunque me acerqué a escribir una en algún momento).

    
respondido por el Thomas Pornin 27.01.2013 - 23:27
fuente

Lea otras preguntas en las etiquetas