Codex32 : Un système de partage de clé secrète de Shamir
Blockstream Research

Codex32 : Un système de partage de clé secrète de Shamir

Andrew Poelstra

Depuis 2020, au sein de Blockstream Research, je jongle avec l'idée d'une cryptographie sans ordinateur. Cette idée n'est pas nouvelle : toute l'histoire de la cryptographie jusqu'au 20e siècle s'est déroulée ainsi. Mais la cryptographie moderne, avec ses nombres à cent chiffres et ses algorithmes complexes, a toujours fait appel aux ordinateurs. Et pour cause : les ordinateurs peuvent effectuer en un milliardième de seconde des opérations qui prendraient plusieurs minutes à un être humain.

Mais cet enjeu de temporalité n’est pas le plus gros problème d’un système de cryptage calculable à la main. L'être humain n'est pas seulement lent ; il ne peut garder à l'esprit qu'un nombre limité d'instructions précises à la fois, il n'a qu'une patience limitée pour lire ces instructions et il a du mal à effectuer des calculs fastidieux de manière soutenue. Les humains commettent également des erreurs fréquentes, même lorsqu'il s'agit de choses qu'ils ont déjà réussies à maintes reprises.

Il s'avère que, malgré la complexité de la gestion des données secrètes, nous pouvons tout de même effectuer de nombreuses opérations à la main à l'aide de feuilles de calcul et d'outils simples à imprimer et à découper.

Aujourd'hui, nous lançons Codex32 : Un système de partage de clé secrète de Shamir, un nouveau livret disponible sur la boutique Blockstream. Codex32 contient des feuilles de calcul détachables pour la vérification de la somme de contrôle et le partage de secrets, des outils de calcul en papier qui peuvent être découpés et assemblés, une feuille de calcul pour éliminer les biais des jets de dés, et de magnifiques illustrations de Micaela Paez et M. Lufti' As'ad.

Nous reviendrons sur ce que fait le codex, mais tout d'abord, posons la question qui vous taraude depuis la première phrase de cet article: Pourquoi ?

Le principe du codex32 est de générer, de vérifier et de diviser une seed maîtresse BIP 32, à partir de laquelle vous obtiendrez des adresses Bitcoin.

Pourquoi le calcul manuel ?

Les ordinateurs électroniques sont assez étonnants. Ils peuvent effectuer des calculs beaucoup plus rapidement que les humains, sans erreur, pendant des années sans se lasser ou se fatiguer. Mais une vitesse surhumaine signifie aussi que leurs actions ne peuvent pas vraiment être vérifiées par les humains.

Il ne s'agit pas d'une simple question de philosophie. Ce problème est la raison pour laquelle nous avons une industrie de la cybersécurité de plusieurs milliards de dollars et un mouvement de logiciels libres. C'est pourquoi les chercheurs en sécurité insistent pour que les machines à voter produisent des documents papier qui peuvent être comptés à la main. Les ordinateurs peuvent être infectés par des logiciels malveillants, ils peuvent laisser échapper des données secrètes par des canaux parallèles ou garder certains éléments qu’ils auraient dû effacer ou peuvent simplement être bogués. Ces problèmes sont déjà pratiquement insolubles lorsqu'il s'agit de logiciels, et ils s'appliquent également au matériel, dont la vérification nécessite des outils et une expertise encore plus complexes. Et comme l'explique en détail The Age of Surveillance Capitalism, même les ordinateurs qui "fonctionnent correctement" sont susceptibles d'aller à l'encontre des intérêts de leurs utilisateurs.

Chaque fois que vous remplacez du matériel ou que vous mettez à jour un logiciel, toutes ces préoccupations sont renouvelées (si vous ne mettez pas à jour votre logiciel, elles grandissent sans limite). Les mises à jour risquent également de provoquer des ruptures de compatibilité qui rendront vos données inaccessibles.

Dans notre vie quotidienne, nous acceptons généralement ces choses comme le coût de l'appartenance à une société numérique, mais lorsqu'il s'agit des données clés secrètes qui contrôlent un actif au porteur tel que le bitcoin, ce coût peut s'avérer trop élevé.

En calculant avec un stylo et du papier, nous pouvons être sûrs qu'aucune donnée secrète n'apparaît là où nous ne l'avons pas écrite. Nous pouvons créer nos propres données aléatoires de manière transparente. Nous pouvons prendre le temps qu'il faut pour effectuer ces diverses opérations, ce qui nous permet de déjouer les attaques temporelles. Nous pouvons être assurés que tant que nos instructions sont écrites quelque part, peut-être imprimées et stockées dans un coffre-fort, nos processus resteront compatibles. Ces assurances nous ancrent dans le réelle en nous procurant une tranquillité d'esprit que les ordinateurs électroniques ne pourront jamais avoir.

Brain wallet et portefeuilles en papier

Ces processus peuvent rappeler aux lecteurs de vieilles idées qui circulent sur les forums de BitcoinTalk. Par exemple, un "portefeuille papier", dans lequel un utilisateur écrit une seed (ou une clé privée) sur un morceau de papier et la stocke hors ligne. Les dispositifs métalliques tels que les Cryptosteels ou les ColdTi sont des extensions naturelles de cette idée, qui ont beaucoup plus de chances de survivre à des catastrophes naturelles ou à un sous-sol inondé.

Le stockage hors ligne des données relatives aux seeds est une bonne idée pour accroître la sécurité de vos avoirs en bitcoins. Il est recommandé d'utiliser une sorte de support métallique, bien que du papier non acide puisse faire l'affaire dans un endroit sec et à l'abri du feu. Avec ce type de stockage, il faut choisir entre créer plus de copies (ce qui augmente le risque de vol) ou moins de copies (ce qui augmente le risque de perte). Le codex donne aux utilisateurs plus de liberté pour faire ce compromis, en leur permettant de diviser leurs données en plusieurs "parts", de sorte que les données originales ne peuvent être récupérées que lorsqu'un nombre suffisant d'entre elles sont réunies.

Une autre idée de la même époque est celle d'un brain wallet qu’on pourrait traduire par “portefeuille cérébral” dans lequel l'utilisateur mémorise simplement ses données secrètes au lieu de les noter physiquement. Nous décourageons fortement cette pratique. L'un des problèmes est qu'elle encourage les utilisateurs à choisir des seeds faibles qui sont trop courtes, trop structurées ou qui existent dans la littérature imprimée. Même si ces seeds sont modifiées de diverses manières, elles ne contiendront pas suffisamment d'informations pour résister à un attaquant disposant d'une grande puissance de calcul. L'une des premières escroqueries au bitcoin était un site web conçu pour "aider" les utilisateurs à produire de telles seeds faibles à utiliser avec des brain wallets.

En fin de compte, le problème est qu'il est difficile de mémoriser une seed avec un bon niveau de hasard. La structure qui rend les phrases courantes, les morceaux de poésie et les histoires courtes si mémorables est également ce qui permet aux attaquants de deviner plus facilement vos mots.

Le deuxième problème des portefeuilles cérébraux est que la mémoire humaine est faillible. Il est facile de se convaincre que nous sommes des personnes très intelligentes dont la mémoire ne flanche pas. Mais l'intelligence ne sera d'aucune utilité si vous vous cognez la tête, si vous avez de la fièvre, si vous subissez un traumatisme ou si vous perdez simplement la motivation d'accomplir votre rituel de rafraîchissement de la mémoire au bout de quelques années.

La bonne façon de générer des données de départ est de produire au moins 128 bits de données uniformément aléatoires, et la bonne façon de les stocker est en dehors d'un cerveau. Le codex fournit un moyen de produire de telles données en lançant des dés et en appliquant un extracteur de von Neumann pour éliminer les biais. Il existe d'autres moyens d'obtenir de bonnes seeds à partir de dés, souvent appelés "diceware".

Quelles actions pouvons-nous faire à la main ?

Dans ce contexte, discutons des différentes actions que les utilisateurs peuvent vouloir faire en lien avec leurs sauvegardes de seeds.

● Vérifier l'intégrité de la sauvegarde.

● Vérifier que les jetons contrôlés par la sauvegarde n'ont pas bougé.

● Diviser à nouveau la sauvegarde, s'il s'agit d'une sauvegarde secrète partagée.

● Récupérer ou initialiser un nouveau portefeuille à partir de la sauvegarde.

Certains utilisateurs voudront peut-être sauter l’étape de création d’un "nouveau portefeuille" et se contenter de tout faire sur papier. Malheureusement, il n'existe actuellement aucun moyen de dériver des adresses ou de signer des transactions sans utiliser un appareil électronique. Pour les tâches susmentionnées, cependant, nous pouvons le faire.

Vérifier l'intégrité de la sauvegarde. Les supports de stockage à long terme peuvent être corrompus ou usés au point de devenir illisibles. Il existe un mécanisme permettant de détecter et de corriger un petit nombre d'erreurs indépendantes, appelé code de correction d'erreur ou somme de contrôle. Le codex fournit des feuilles de calcul permettant aux utilisateurs de créer et de vérifier les sommes de contrôle de leurs données. Si la somme de contrôle est correcte, tout va bien. Dans le cas contraire, vous savez qu'il y a une erreur. La création d'une somme de contrôle prend de 30 à 60 minutes et doit être effectuée deux fois pour détecter les erreurs commises la première fois. La vérification d'une somme de contrôle prend le même temps et n’a qu’à être effectuée qu'une seule fois. 

Vérifier que les jetons sont toujours là. Une sauvegarde hors ligne ne peut pas faire grand-chose pour vérifier l'état de la blockchain. Au lieu de cela, utilisez un portefeuille en lecture seule pour surveiller la blockchain et détecter tout mouvement de vos jetons, sans jamais avoir besoin d'accéder aux données secrètes.

Diviser et re-diviser la sauvegarde. C'est la fonction la plus intéressante et la plus puissante du codex32. Le codex fournit les outils nécessaires pour créer un secret divisé en plusieurs "parts" de sorte que le secret puisse être récupéré par un certain nombre d'entre elles. Les valeurs seuils typiques sont 2 ou 3. Si un attaquant a moins de parts que cela, il n'apprend rien sur le secret.

Avec codex32, le processus est le suivant : un utilisateur génère un certain nombre de parts initiales aléatoires, puis, à l'aide de ces parts, en déduit d'autres selon ses besoins, jusqu'à 31 au total. Plus tard, s'il dispose d'un nombre suffisant de parts, il peut reconstituer le secret.

Le processus de dérivation garantit que si vos parts initiales ont des sommes de contrôle valides, les parts dérivées et le secret final le seront aussi automatiquement. Cela signifie que vous pouvez créer vos parts initiales, calculer leurs sommes de contrôle, dériver des parts supplémentaires et vérifier leurs sommes de contrôle - et si vous faites une erreur au cours de ce processus fastidieux, la feuille de calcul des sommes de contrôle la détectera.

Le calcul des parts prend environ 5 à 10 minutes par part d'entrée, et la vérification finale de la somme de contrôle prend 30 à 60 minutes.

Récupérer ou initialiser un nouveau portefeuille. Les portefeuilles peuvent prendre des parts codex32 pour s'initialiser. Le processus est sensiblement le même que les processus existants utilisant des mots de la seed.

Actuellement, il existe une demande d'extension ouverte à Bitcoin Core pour prendre en charge codex32, qui est inclus dans la version de Core utilisée par Bails. Plusieurs autres portefeuilles ont indiqué leur intention de prendre en charge le codex32, notamment Blockstream Green, Anchorwatch et Liana. La difficulté technique de cette prise en charge est comparable à celle de la prise en charge des adresses Segwit en 2016, sauf qu'elle est plus facile parce que codex32 réutilise en grande partie la même logique.

Quelle est la prochaine étape ?

La prochaine étape pour codex32 est d'améliorer le support des portefeuilles. Cela signifie améliorer et peaufiner la bibliothèque rust-codex32 et introduire le support dans le BDK.

Nous aimerions également mettre en œuvre une logique de correction d'erreur et l’ajouter au site web codex32 ainsi que des fonctionnalités plus interactives. La correction d'erreurs nécessite actuellement des ordinateurs. Mais, au moins pour les erreurs simples, nous prévoyons de mettre en œuvre une correction manuelle à l'aide de tables de calcul.

Le codex contient des instructions sur comment séparer les parts et vérifier la somme de contrôle des secrets, mais il ne fournit pas beaucoup d'indications sur ce qu'il faut faire ensuite : distribuer des parts à des personnes de confiance et établir un calendrier pour vérifier leur intégrité.

Nous aimerions recommander aux gens de vérifier leurs parts chaque année, mais le processus actuel est pénible à mettre en place : il faut relire les instructions, assembler de nouveaux outils de calcul papier, puis consacrer 30 à 60 minutes à la vérification. Et en cas d'échec, en l'absence de tables de correction des erreurs, il faut tout recommencer. Ce n'est donc pas une recommandation réaliste.

Nous avons toutefois une solution en tête : les quickchecks sont des vérifications partielles de la somme de contrôle qui détectent encore 99,9 % des erreurs et qui peuvent être contenues (instructions, tables de recherche, etc.) sur une seule feuille de papier. Il existe sept vérifications rapides qui, ensemble, équivalent à une vérification complète de la somme de contrôle. Les utilisateurs peuvent stocker de nombreuses copies du jeu complet avec leurs actions ; ensuite, chaque année, il leur suffit de prendre la page suivante, de suivre les instructions pour la remplir (ce qui prendra 10 à 15 minutes au lieu de 30 à 60) et de la détruire.

Pour l'instant, les quickchecks n'existent que sous forme mathématique. Nous devons maintenant créer des feuilles de calcul, ajuster les paramètres et donner des instructions.

Les plans ci-dessus nécessitent un peu d'huile de coude, mais nous avons quelques grandes idées pour la recherche future. À partir d'une seed donnée, est-il possible de calculer des hachages pour dériver d'autres seeds, comme le fait le BIP 32 ? Est-il possible d'effectuer une multiplication de la courbe elliptique, ce qui permettrait de dériver des adresses et de signer des transactions ? Est-il possible d’utiliser des protocoles de chiffrement ou de communication ? À l'heure où nous écrivons ces lignes, nous ne le savons pas encore.

If you have specific preferences, please, mark the topic(s) you would like to read: