¿Por qué se necesita un código de cadena para la entropía en las billeteras HD?

En los documentos y artículos que he leído, se afirma que el "código de cadena" en las billeteras HD existe para proporcionar entropía a la derivación de claves públicas/privadas secundarias. Si entiendo bien el proceso, es el siguiente:

MyHash = HMAC-SHA512(Parent_PublicKey + Parent_ChainCode + Index)
Special_Integer = Leftmost256Bits(MyHash)
Child_ChainCode = Rightmost256Bits(MyHash)
Child_PublicKey = Parent_PublicKey + Special_Integer
Child_PrivateKey = Child_PrivateKey + Special_Integer

Mi pregunta es por qué exactamente el código de cadena es necesario. Incluso con solo HMAC-SHA512 (Parent_PublicKey + Index), la salida debería "verse" muy diferente para diferentes índices, entonces, ¿el problema es que todavía está matemáticamente cerca?

Un par de preguntas relacionadas:

  1. Supongo que el objetivo es evitar el uso de una clave para derivar a sus hijos o hermanos. ¿Está mal o hay otras garantías de seguridad que las billeteras HD buscan proporcionar en su estructura de árbol?

  2. ¿Es el código de cadena tan "público" como la clave pública, o es deseable mantenerlo privado en la medida de lo posible?

Respuestas (1)

Como referencia, la especificación original se encuentra aquí .

Algunos ajustes menores a sus ecuaciones básicas de cómo funciona la derivación de clave secundaria de billetera HD. (Y también tenga en cuenta que estas ecuaciones solo se aplican a índices no endurecidos)

MyHash = HMAC-SHA512(Parent_PublicKey + Parent_ChainCode + Index)
Special_Integer = Leftmost256Bits(MyHash)
Child_ChainCode = Rightmost256Bits(MyHash)
Child_PublicKey = Parent_PublicKey + Special_Integer * G
Child_PrivateKey = Parent_PrivateKey + Special_Integer

Agregué el * G, y cambié Child_PrivateKeya Parent_PrivateKeyen la última ecuación. Esto * Gse debe a que necesita usar la multiplicación de curva elíptica antes de poder agregar a Parent_PublicKey, que es un punto de curva elíptica.

Ahora veamos cómo se verían estas ecuaciones si no se usara el código de cadena.

MyHash = HMAC-SHA512(Parent_PublicKey + Index)
Special_Integer = Leftmost256Bits(MyHash)
Child_PublicKey = Parent_PublicKey + Special_Integer * G
Child_PrivateKey = Parent_PrivateKey + Special_Integer

Ahora, si conoce el Parent_PublicKey(que es de conocimiento público y se puede encontrar en la cadena de bloques, por ejemplo), puede probar muchos valores Indexy derivar todas las claves secundarias

Ahora suponga que alguien obtuvo (de alguna manera) una de sus claves privadas en algún lugar del árbol. Sin la presencia de un código de cadena, pueden derivar todas las claves privadas del árbol desde el nodo donde tienen la clave privada. Lo que es peor, si pueden obtener acceso a las claves públicas más arriba en el árbol, también pueden derivar las claves privadas con un poco de ingeniería inversa de las ecuaciones (básicamente, Parent_PrivateKey = Child_PrivateKey - Special_Integer). Esto no es deseable, ya que sería mejor si la pérdida de una sola clave privada no comprometiera mucho o nada del resto del árbol de claves HD.

Todo esto no es posible con el código de cadena presente. Así que hay muy buenas razones de privacidad y seguridad para usar el código de cadena.

¿Es el código de cadena tan "público" como la clave pública, o es deseable mantenerlo privado en la medida de lo posible?

Definitivamente es deseable mantenerlo en privado, porque filtrarlo lo expone a los problemas mencionados anteriormente.