Aller au contenu principal
Cryptographie

Code de chaîne (chain code)

Le code de chaîne est une donnée auxiliaire de 32 octets utilisée dans la dérivation HD (BIP-32). Combiné à une clé, il permet de générer les clés filles. Sans lui, impossible de dériver la chaîne suivante. C'est un secret aussi sensible que la clé elle-même.

Rôle dans BIP-32

Le code de chaîne (chain code) est une variable cryptographique de 32 octets qui sert de « sel » dans la fonction de dérivation HD spécifiée par le BIP-32. Sans lui, la dérivation d'une clé enfant serait soit triviale (publique liée à la parente d'une manière exploitable), soit impossible. Il transforme la dérivation en HMAC-SHA512 dont le résultat est imprévisible sauf à connaître à la fois la clé parente et le code de chaîne.

Mécanisme de dérivation

| Mode | Entrée HMAC | Caractéristique | |------|-------------|------------------| | Non hardened (normal) | (chain_code, pubkey ∥ i) | Permet la dérivation à partir de la xpub seule | | Hardened (i ≥ 2³¹) | (chain_code, 0x00 ∥ privkey ∥ i) | Nécessite la privkey, plus sûr |

L'output HMAC-SHA512 de 64 octets est scindé : les 32 premiers octets servent à dériver la clé enfant, les 32 derniers deviennent le chain code de l'enfant. C'est ainsi que la chaîne se propage à travers tout l'arbre.

Sensibilité comparable à la clé

Une erreur fréquente : croire que le code de chaîne est moins sensible que la clé. C'est inexact. Un attaquant qui possède :

  • La pubkey enfant + le chain code enfant + une clé enfant fuitée
  • Peut remonter à la clé privée parente (attaque connue sur dérivation non-hardened)

C'est pourquoi les dérivations sensibles utilisent toujours des indices hardened, qui cassent ce lien.

Sérialisation dans la xpub/xprv

Une clé étendue (xprv/xpub) embarque toujours le chain code (32 octets) à côté de la clé (33 octets) :

version (4) ∥ depth (1) ∥ parent_fingerprint (4) ∥ index (4) ∥ chain_code (32) ∥ key (33)

Total : 78 octets, encodés en Base58Check pour produire la chaîne xprv... ou xpub.... Le chain code est donc toujours transporté avec la clé : on ne peut pas avoir une xpub sans son chain code.

Confusion possible avec d'autres concepts

| Terme | Signification | |-------|---------------| | Chain code (BIP-32) | Donnée 32 octets pour dériver | | Chaintip | Dernier bloc d'une blockchain | | Blockchain | Chaîne de blocs | | Side chain | Blockchain auxiliaire |

Ne pas confondre : le « chain » dans « chain code » fait référence à la chaîne de dérivation, pas à la blockchain.

Importance pratique

Pour un wallet HD, le chain code est l'élément qui permet :

  • De restaurer un wallet depuis une seed (dérivation déterministe)
  • De partager la xpub avec un watch-only sans donner la privkey
  • De faire du multisig en partageant uniquement les xpubs des cosignataires
  • De séparer ses comptes (chain code différent par account hardened)

À retenir

Le chain code est un secret aussi précieux que la clé elle-même. Il est embarqué dans toute clé étendue et conditionne la sécurité de la dérivation HD. Le perdre ou le fuiter sans précaution peut donner à un attaquant des informations exploitables, surtout en dérivation non-hardened.

Termes lies

← Retour au glossaire complet

Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.