Comment les clés publiques étendues peuvent-elles générer des clés publiques enfants sans générer la clé privée enfant dans les portefeuilles HD  ?


Il existe deux façons de passer du parent à l’enfant, non renforcée et renforcée, la première permettant à la fois (1) une clé privée parent -> fonction de clé privée enfant et (2) une clé publique parent -> fonction de clé publique enfant. (La relation parent -> enfant renforcée ne fournit que la fonction (1)).

Si vous regardez :-

///bitcoin/bips/blob/master/bip-0032.

la fonction (1) est définie comme suit :-

ki = IL + kpar (mod n) (A)

n étant l’ordre du groupe de courbes elliptiques E pour l’ECDSA de Bitcoin (qui a des paramètres secp256k1) – E étant généré par le point générateur (ou ‘base’) G dans E.

Comment les clés publiques étendues peuvent-elles générer des clés publiques enfants sans générer la clé privée enfant dans les portefeuilles HD  ?

E est le groupe de courbes elliptiques sur le corps fini Fp (p premier = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F), et se compose de n éléments (n premier = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141) (notez que n est proportionnellement légèrement que p).

Les éléments de E sont des éléments de Fp x Fp, et sont des points sur la courbe elliptique discrète sur Fp. E est un groupe abélien « additif », et on peut définir la multiplication scalaire des éléments de E par des entiers. G dans E étant un générateur signifie que E est égal à l’ensemble de tous les multiples scalaires de G,:, noté.

Par définition, une clé privée k est un entier de 256 bits dans la plage. Et la clé publique associée est K donnée par

K = kG (B)

Dans le document BIP32 ci-dessus, la notation point(p) est utilisée pour signifier pG :-

point(p) = pG (C)

Ainsi notamment :-

point(k) = K

Il est simple que l’opération de multiplication scalaire ci-dessus dans E satisfasse la loi distributive :-

(a + b)P = aP + bP (D)

où a, b sont des nombres entiers et P est n’importe quel point de E.

kiG = ILG + kparG

Mais puisque G est d’ordre n, de sorte que nG = 0.

Mais cette équation se lit alors simplement  : –

Ki = ILG + Kpar (E)

en raison de la relation générale ci-dessus K = kG entre la clé privée et la clé publique, et parce que ki est maintenant une clé privée valide dans la plage.

(Remarquez si la procédure ci-dessus produit un ki inapproprié, tel que zéro, alors elle est répétée avec la valeur suivante de l’indice i).

Si vous examinez maintenant le document BIP32 ci-dessus pour « Public parent key -> public child key », il dit  : –

« La clé enfant retournée Ki est indiquer(parse256(IL)) + Kpar »

qui, par la définition de ‘point’ dans (C) ci-dessus, signifie une clé publique enfant de  : –

Ki = ILG + Kpar (F)

c’est-à-dire identique à la clé publique Ki de la clé privée enfant, telle que dérivée ci-dessus en (E), au choix.

En bref, l’équation (A) indique simplement d’ajouter IL à la clé privée parent pour obtenir la clé privée enfant. C’est juste l’addition de deux entiers (mod n).

Et l’équation (F) dit simplement ajouter ILG à la clé publique parent pour obtenir la clé publique enfant. Il s’agit d’une opération d’addition entièrement différente, à savoir « l’addition de points » sur le groupe de courbes elliptiques E.

La clé de ce fonctionnement est que le hachage 512 bits « I » ne dépend pas de la clé privée parent. Avec l’enfant renforcé, la définition de ‘I’ est modifiée de sorte qu’elle dépend de la clé privée parent, et donc une fonction clé publique parent -> clé publique enfant ne peut pas être définie dans ce cas.