portefeuilles bip32 hd


J'essaie d'implémenter la dérivation bip32 et j'ai pu dériver les clés enfants du nœud maître, mais pas les enfants de la clé enfant.

Le test suivant montre le résultat correct en octets pour dériver la deuxième clé non renforcée de la première clé renforcée (m/0'/1) du nœud maître

Sortie correcte  :

04 88 ad e4 02 5c 1b d6 48 00 00 00 01 2a 78 57 63 13 86 ba 23 da ca c3 41 80 dd 19 83 73 4e 44 4f

db f7 74 04 15 78 e9 b6 ad b3 7c 19 00 3c 6c b8 d0 f6 a2 64 c9 1e a8 b5 03 0f ad aa 8e 53 8b 02 0f

0a 38 74 21 a1 2d e9 31 9d c9 33 68 b3 4b c4 42

Sortie réelle  :

04 88 ad e4 02 5c 1b d6 48 00 00 00 01 2a 78 57 63 13 86 ba 23 da ca c3 41 80 dd 19 83 73 4e 44 4f

db f7 74 04 15 78 e9 b6 ad b3 7c 19 00 3c 6c b8 d0 f6 a2 64 c9 1e a8 b5 03 0f ad aa 8d 0e 39 de f5

b9 81 14 5d 61 00 47 bf 6d ff 78 7a 01 être 65 76

Comme vous pouvez le voir, presque tout est correct à l'exception des 20 derniers octets, qui font partie de la clé privée. Puisque je sais que ma dérivation fonctionne pour la première chaîne, je me demande si le processus nécessite l'ajout de quelque chose d'autre pour créer la clé privée des niveaux suivants ?

Voici ma fonction de dérivation

public HDPrivateKey childAt(uint index,

/*clés non durcies entre 0 ~ 2^31 - 1, durcies entre 2^31 ~ 2^32 - 1*/

/*Remarque  : Une clé renforcée à un index inférieur à 2^31 supposera automatiquement qu'elle commence à 2^31*/

throw new Exception("Index trop grand pour une clé non durcie");

index;

/*effectuer hmac*/

octet[] hmac;

octet[] childNumBytes = BitConverter.GetBytes(childNum);

Array.Reverse(childNumBytes);

octet[] pkBytes = Byte.toBytes(), 0x00);

octet[] data = Byte.join(pkBytes, childNumBytes);

hmac = Hash.HMACSHA512Encode(data,;

octet[] data = Byte.getCompressed(), childNumBytes);

hmac = Hash.HMACSHA512Encode(data,;

//HMAC est correct, produit un chaincode correct

/*Propriétés de l'enfant*/

octet[] pré = hmac[0.32];

octet[] code chaîne = hmac[32.64];

octet[] empreinte digitale = Hash.getCompressed())[0.4];

int profondeur = this.

/*Effectuer l'ajout du parent et de l'enfant dans le champ de N*/

FieldElement parent = new Sha256Field(new BigInteger(this.toBytes(), true, true));

FieldElement child = new Sha256Field(new BigInteger(pre, true, true));

FieldElement sum = parent + enfant ;

PrivateKey privateKey = new PrivateKey(sum.getNum());

Console. Byte.bytesToString(privateKey.toBytes()));

HDPrivateKey childKey = new HDPrivateKey(

privateKey, chaincode, profondeur, empreinte digitale, childNum, this.

return childKey;

L'aide est vraiment appréciée ! Merci d'avance