¿Probar que dos claves públicas se derivan de la misma semilla, sin revelar el xpub y la ruta?

Pensemos en el siguiente escenario:

  1. Key0 se deriva de SEED en la ruta m/44'/0'/0'/0/0
  2. Key1 se deriva de SEED en la ruta m/44'/0'/0'/0/1

Me pregunto si hay una manera de probar que Key0 y Key1 comparten la misma semilla SIN tener que compartir la SEED o cualquier Xpub en el camino.

Básicamente, quiero poder probar que dos claves están relacionadas de alguna manera sin poner en riesgo la seguridad (donde si comparte un Xpub y una de sus claves privadas secundarias se filtra, todo el conjunto de hermanos se ve comprometido).

No tiene que ser exactamente esto, pero mi objetivo es demostrar que dos claves están relacionadas sin sacrificar la seguridad, por lo que si hay formas de hacerlo, también agradecería esas soluciones.

Respuestas (1)

Esto es posible con pruebas de conocimiento cero, pero no con las matemáticas utilizadas solo en BIP32.

Esto se debe a que Key0 y Key1 no están relacionados entre sí matemáticamente, excepto que se derivaron de la misma clave principal, utilizando el mismo código de cadena (32 bytes adicionales de entropía descritos en BIP32 ) . Por lo tanto, para demostrar que se derivan de la misma clave pública principal, debe revelar esa clave pública principal y el código de cadena, y estos son los dos valores más importantes contenidos en un xpub (también hay algunos metadatos) .

Tenga en cuenta que no tiene que revelar la clave pública MAESTRA de la semilla, solo la clave principal que en su ejemplo está en la ruta m/44'/0'/0'/0.

Para obtener más información, lea cómo las claves públicas secundarias se derivan de su clave pública principal en BIP32 .

(resumido):

let I = HASH512(<chain code> || <parent public key> || <index>).
let J = the first 256 bits of I
child public key = <J> * <G (generator point of curve)> + <parent public key>

Entonces, la única relación entre Key0 y Key1 es que ambos se derivaron de esta manera, donde <index> = 0y <index> = 1.

Vitalik Buterin escribió un excelente artículo para Bitcoin Magazine en 2013 sobre este problema. Si revela una clave pública principal ampliada (que incluye el código de cadena) y cualquier clave privada secundaria (no protegida), se puede calcular la clave privada principal. Esto se debe a que los datos necesarios para derivar una clave privada secundaria de una clave privada principal están disponibles para el atacante (en el xpub principal). Entonces, el atacante puede simplemente restar ese valor de la clave privada secundaria para calcular la clave privada principal.

Como nota final, no olvides que si necesitas demostrar que controlas dos llaves, puedes firmar el mismo mensaje con cada llave :-)

Siempre puede usar una prueba genérica de conocimiento cero para esto (Bulletproofs, zk-SNARKs, ...). No será rápido, pero ciertamente es posible.
@PieterWuille gracias, actualizado