SynergyX Construit sur les algorithmes NIST normalisé — FIPS 203 (ML-KEM/Kyber-768) et FIPS205 (SLH-DSA/SPHINCS+). Publié le 15 janvier 2026. Toutes les déclarations cryptographiques sont vérifiables en chaîne et par rapport NIST CSRC documentation. Zéro pré-mine. Zéro ICO. Zéro VC. Zéro allocation de fondateur. Plafond ferme de 77,7 millions. Le portefeuille du développeur est public et délibérément non privé – dans chaque carnet d'adresses, sur l'explorateur. Rien de tout cela ne vous demande de faire confiance à une personne.
Dérivation de clé post-quantique : modèles de portefeuille HD pour les développeurs
📅 Dernière mise à jour : 2 août 2026🎧 Écoute : ~4 min
Les portefeuilles déterministes hiérarchiques (HD) ont révolutionné la gestion des clés de crypto-monnaie en dérivant des adresses illimitées à partir d'une seule graine. Cependant, la dépendance du BIP-32 aux mathématiques de la courbe elliptique secp256k1 crée une vulnérabilité quantique. Ce guide couvre les modèles de portefeuille HD post-quantiques en utilisant des approches basées sur le treillis et le hachage. Le Portefeuille résistant aux quantiques SynX met en œuvre ces techniques pour une gestion transparente des clés.
Comprendre les limites du portefeuille HD traditionnel
Les portefeuilles BIP-32 HD dérivent les clés enfants en utilisant la multiplication de points de courbe elliptique :
Dérivation de clé publique : La dérivation de clés publiques à partir de clés privées utilise la multiplication EC : l'algorithme de Shor brise cela
Dérivation durcie : Même si les chemins durcis cachent la relation de dérivation, les calculs sous-jacents de la CE restent vulnérables
Nous avons besoin de schémas de dérivation entièrement nouveaux pour la sécurité post-quantique.
Stratégie de dérivation post-quantique
Le Portefeuille résistant aux quantiques SynX utilise une approche à trois niveaux :
Génération de semences : Mnémonique standard BIP-39 → graine de 512 bits (entropie à sécurité quantique)
Dérivation du chemin : SHAKE-256 ou HKDF pour dériver le caractère aléatoire déterministe par chemin
Génération de clé : Utiliser le caractère aléatoire dérivé comme graine pour la génération de clé Kyber/SPHINCS+
Aperçu clé : L'approche de sauvegarde mnémonique reste valable : nous modifions uniquement la façon dont les graines dérivées deviennent des paires de clés. Les utilisateurs conservent des phrases de récupération familières de 24 mots tout en gagnant en résistance quantique.
Mise en œuvre : expansion des semences
importer hashlib
importer hmac
depuis dactylographie importer Liste, Tuple
classePostQuantumHDWallet:
""" Portefeuille déterministe hiérarchique post-quantique Utilise SHAKE-256 pour la dérivation de clé déterministe avec Kyber-768 et SPHINCS+ pour les clés cryptographiques réelles. """déf__init__(soi, master_seed : octets) :
""" Initialisation à partir de la graine principale (généralement à partir du mnémonique BIP-39) Args : master_seed : graine de 64 octets de PBKDF2 (mnémonique, salt="mnemonic"+passphrase) """if len (master_seed) < 32:
augmenter ValeurErreur("La graine doit être d'au moins 256 bits") self.master_seed = master_seed
# Dériver le code de la chaîne principale (utilisé pour la dérivation du chemin)
self.master_chain_code = self._derive_chain_code(master_seed, b"SynX-PQ-HD-Master")
déf_derive_chain_code(soi, graine : octets, contexte : octets) -> octets :
"""Dériver un code de chaîne pour la dérivation hiérarchique"""
h = hashlib.shake_256() h.update(seed + contexte)
retour h.digest(32)
défdérive_path_seed(soi, chemin : str) -> octets :
""" Dériver le caractère aléatoire déterministe pour un chemin spécifique Format du chemin : "m/44'/9999'/0'/0/0" (style BIP-44) Args : chemin : chaîne du chemin de dérivation Renvoie : 64 octets de caractère aléatoire déterministe pour la génération de clé """
composants = self._parse_path(chemin) current_seed = self.master_seed current_chain = self.master_chain_code
pour composant in composants : current_seed, current_chain = self._derive_child (current_seed, current_chain, composant)
retour graine_actuelle
déf_parse_path(soi, chemin : str) -> Liste[int] :
"""Analyser le chemin de style BIP-32 en composants"""sinon chemin.commenceavec("m/"):
augmenter ValeurErreur("Le chemin doit commencer par 'm/'") composants = []
pour partie in chemin[2:].split("/"):
sinon partie:
continuerif part.endswith("'"):
# Dérivation durcie
index = int(partie[:-1]) + 0x80000000
autre: index = int (partie) composants.append (index)
retour composants
déf_derive_child( self, parent_seed : octets, parent_chain : octets, index : int ) -> Tuple[octets, octets] :
""" Dériver la graine enfant et le code de chaîne Utilise HMAC-SHA512 similaire à BIP-32 mais les sorties alimentent SHAKE-256 pour une expansion post-quantique sécurisée. """# Encoder l'index en 4 octets big-endian
index_bytes = index.to_bytes(4, 'grand')
# HMAC pour les données de dérivation des enfants
data = hmac.new (parent_chain, parent_seed + index_bytes, hashlib.sha512 ).digest()
# Reste 32 octets → composant de départ enfant# Droit 32 octets → nouveau code de chaîne
child_seed_component = data[:32] child_chain = data[32:]
# Combinez le parent et l'enfant pour une nouvelle graine# Utilisez SHAKE-256 pour un mélange résistant aux quantiques
h = hashlib.shake_256() h.update(parent_seed + child_seed_component + index_bytes) child_seed = h.digest(64)
retour enfant_seed, enfant_chaîne
# Exemple d'utilisationdéfdemo_path_derivation():
# Simuler la graine principale à partir d'un mnémoniqueimporter secrets master_seed = secrets.token_bytes(64) portefeuille = PostQuantumHDWallet(master_seed)
# Dériver des graines pour différents comptes
chemins = [
"m/44'/9999'/0'/0/0", # Compte 0, Externe, Adresse 0"m/44'/9999'/0'/0/1", # Compte 0, Externe, Adresse 1"m/44'/9999'/0'/1/0", # Compte 0, Interne (changement), Adresse 0"m/44'/9999'/1'/0/0", # Compte 1, Externe, Adresse 0
]
pour chemin in chemins : path_seed = wallet.derive_path_seed(path) print(f"{chemin} : {path_seed[:16].hex()}...")
Génération de clés Kyber à partir de Path Seeds
Une fois que nous avons le caractère aléatoire déterministe pour un chemin, nous générons des paires de clés Kyber-768 :
importer oqs
classeDéterministeKyber:
""" Générer des clés Kyber-768 déterministes à partir des chemins du portefeuille HD Utilise la graine du chemin comme source aléatoire pour la génération de clés. """déf__init__(soi): self.algorithme = "Kyber768"défgénérer_from_seed(soi, path_seed : octets) -> Tuple[octets, octets] :
""" Générer la paire de clés Kyber à partir de la graine déterministe Args : path_seed : 64 octets à partir de la dérivation du portefeuille HD Renvoie : Tuple de (public_key, secret_key) """# Kyber a besoin de quantités spécifiques d'aléatoire# Développez la graine à la longueur requise en utilisant SHAKE-256
h = hashlib.shake_256() h.update(path_seed + b"Kyber-768-keygen")
# Kyber-768 nécessite 64 octets aléatoires pour la génération de clé
caractère aléatoire = h.digest(64)
# Remarque : la plupart des bibliothèques PQC ne prennent pas en charge la génération prédéfinie# Cela nécessite soit :# 1. Une bibliothèque modifiée avec génération de clés prédéfinies# 2. Remplacement temporaire du RNG par une source déterministe# 3. Utiliser une bibliothèque prenant en charge la génération déterministe# Pour SynX, nous utilisons la variante prédéfinie :
kem = oqs.KeyEncapsulation (auto.algorithme)
# En production SynX SDK, cela utilise la génération prédéfinie# Nous montrons ici le API standard à titre d'illustration
public_key = kem.generate_keypair() secret_key = kem.export_secret_key()
retour clé_publique, clé_secrète
classeDéterministeSPHINCS:
""" Générer des clés déterministes SPHINCS+ à partir des chemins du portefeuille HD """déf__init__(soi, variante : str = "SPHINCS+-SHAKE-128s-simple"): self.algorithm = variante
défgénérer_from_seed(soi, path_seed : octets) -> Tuple[octets, octets] :
""" Générer la paire de clés SPHINCS+ à partir de la graine déterministe """
h = hashlib.shake_256() h.update(path_seed + b"SPHINCS-Plus-keygen")
# SPHINCS+-128s nécessite une longueur de graine spécifique
caractère aléatoire = h.digest(48)
# La production utilise la génération ensemencée
sig = oqs.Signature (self.algorithm) public_key = sig.generate_keypair() secret_key = sig.export_secret_key()
retour clé_publique, clé_secrète
Implémentation complète du portefeuille HD
Le Portefeuille résistant aux quantiques SynX combine ces composants :
depuis classes de données importer classe de données
depuis dactylographie importer @dataclass facultatif
classeAdresse SynX:
"""Adresse SynX complète avec les deux types de clés"""
chemin : str kyber_public : octets kyber_secret : octets sphincs_public : octets sphincs_secret : octets adresse : str # Adresse lisible par l'hommeclasseSynXHDWallet:
""" Portefeuille HD Post-Quantum complet pour SynX Caractéristiques : - Graines mnémoniques compatibles BIP-39 - Chemins de dérivation de style BIP-44 - Kyber-768 pour l'encapsulation de clé - SPHINCS+-128s pour les signatures " " "Type de pièce # SynX (exemple, enregistré auprès de SLIP-44)
PIÈCE_TYPE = 9999
déf__init__(soi, mnémonique : str, phrase secrète : str = ""):
""" Initialiser le portefeuille à partir du mnémonique BIP-39 Args : mnémonique : phrase secrète mnémonique BIP-39 de 24 mots : phrase secrète BIP-39 facultative """
self.master_seed = self._mnemonic_to_seed (mnémonique, phrase secrète) self.hd = PostQuantumHDWallet(self.master_seed) self.Kyber = DéterministeKyber() soi.SPHINCS = DéterministeSPHINCS()
# Adresses dérivées du cache
self._address_cache : dict[str, Adresse SynX] = {}
déf_mnemonic_to_seed(soi, mnémonique : str, phrase secrète : str) -> octets :
"""Convertir le mnémonique BIP-39 en graine"""importer hashlib
# Dérivation de graines BIP-39
mot de passe = mnémonique.encode('utf-8') sel = ("mnémonique" + phrase secrète).encode('utf-8')
retour hashlib.pbkdf2_hmac(
'sha512', mot de passe, sel, itérations = 2048, dklen = 64 )
défadresse_dérivée( soi, compte : int = 0, changement : int = 0, index : int = 0 ) -> Adresse SynX:
""" Dériver une adresse SynX complète Args : compte : changement de numéro de compte (renforcé) : 0 pour externe, 1 pour interne/index de changement : index d'adresse Renvoie : SynXAddress avec toutes les clés et la chaîne d'adresse """
chemin = f"m/44'/{self.COIN_TYPE}'/{account}'/{change}/{index}"# Vérifier le cacheif chemin in self._address_cache :
retour self._address_cache[chemin]
# Dériver la graine du chemin
path_seed = self.hd.derive_path_seed(chemin)
# Dériver des sous-graines pour chaque type de clé# (empêche la corrélation clé entre Kyber et SPHINCS+)
kyber_seed = hashlib.shake_256(path_seed + b"Kyber").digest(64) sphincs_seed = hashlib.shake_256(path_seed + b"SPHINCS").digérer(64)
# Générer des clés (en production, utilise la génération prédéfinie)
kyber_pk, kyber_sk = self.Kyber.generate_from_seed(kyber_seed) sphincs_pk, sphincs_sk = self.SPHINCS.generate_from_seed(sphincs_seed)
# Créer une adresse lisible par l'homme
adresse = self._create_address(sphincs_pk, kyber_pk) résultat = Adresse SynX( chemin=chemin, kyber_public=kyber_pk, kyber_secret=kyber_sk, sphincs_public=sphincs_pk, sphincs_secret=sphincs_sk, adresse=adresse ) self._address_cache[chemin] = résultat
retour résultat
déf_créer_adresse(self, sphincs_pk : octets, kyber_pk : octets) -> str :
"""Créer une adresse lisible par l'homme à partir de clés publiques"""# Hachez les deux clés publiques ensemble
combiné = sphincs_pk + kyber_pk adresse_hash = hashlib.Blake2b(combiné, digest_size=25).digest()
# Ajouter l'octet de version (0x00 pour le réseau principal)
versionné = octets ([0x00]) + adresse_hash
# Somme de contrôle (4 premiers octets de double hachage)
somme de contrôle = hashlib.Blake2b( hashlib.Blake2b(versioned).digest(), digest_size=4 ).digest()
# Encodage Base58 (simplifié, utiliser une implémentation appropriée)
complet = versionné + somme de contrôle
retour"Sexe" + full.hex()[:40]
défget_recevoir_adresse(soi, compte : int = 0, index : int = 0) -> str :
"""Obtenir l'adresse de réception externe"""retour self.derive_address(compte, 0, index).adresse
défget_change_address(soi, compte : int = 0, index : int = 0) -> str :
"""Obtenir l'adresse de modification interne"""retour self.derive_address(compte, 1, index).adresse
# Exemple : workflow de portefeuille completdéfdémo_wallet():
# Exemple de mnémonique (NE JAMAIS l'utiliser en production)
mnémonique = "Abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner abandonner l'art"
portefeuille = SynXHDWallet(mnémonique, phrase secrète ="ma-phrase-passe-sécurisée")
# Dériver les 5 premières adresses de réception
imprimer(« Adresses de réception : »)
pour i in range(5) : addr = wallet.derive_address(account=0, change=0, index=i) print(f" {addr.path} : {addr.address} »)
# Dériver les adresses de changement
imprimer("\nModifier les adresses :")
pour i in range(3) : addr = wallet.derive_address(account=0, change=1, index=i) print(f" {addr.path} : {addr.address} »)
Portefeuilles pour montres uniquement
Contrairement aux portefeuilles HD traditionnels, les systèmes post-quantiques ne prennent pas en charge la dérivation de clé publique sans le master seed. Cependant, vous pouvez créer des portefeuilles de surveillance uniquement en exportant des clés publiques :
importer json
classeMontreOnlyWallet:
""" Portefeuille de montre uniquement pour une surveillance sans capacité de dépense """déf__init__(self) : self.addresses : dict[str, dict] = {}
défadresse_importation( self, adresse : str, kyber_public : octets, sphincs_public : octets, chemin : facultatif[str] = Aucun ):
"""Importer une adresse publique pour regarder"""
self.addresses[adresse] = {
"kyber_public": kyber_public.hex(),
"sphincs_public": sphincs_public.hex(),
"chemin": chemin }
défexport_for_watch(moi-même, full_wallet : SynXHDWallet, compte : int = 100 ):
"""Exporter les adresses du portefeuille complet pour la montre uniquement"""pour i in range(count): addr = full_wallet.derive_address(account=0, change=0, index=i) self.import_address( addr.address, addr.kyber_public, addr.sphincs_public, addr.path)
retour json.dumps (auto.adresses)
défverify_transaction_signature( self, adresse : str, message : octets, signature : octets) -> bool :
"""Vérifiez qu'une signature provient d'une adresse surveillée"""if adresse pas dans auto.adresses :
retour Faux sphincs_pk = bytes.fromhex(self.addresses[address]["sphincs_public"])
# Vérifiez en utilisant la clé publique SPHINCS+
SPHINCS = oqs.Signature("SPHINCS+-SHAKE-128s-simple")
retour SPHINCS.verify(message, signature, sphincs_pk)
Considérations de sécurité
La sécurité des semences est essentielle
La graine principale contrôle toutes les clés dérivées. Traitez la sauvegarde des semences avec un soin extrême : toute personne possédant la graine peut en dériver toutes les adresses. Le Portefeuille résistant aux quantiques SynX crypte les sauvegardes de départ à l'aide de Kyber-768 pour la sécurité avancée.
Isolation des clés
Chaque adresse doit avoir des propriétés de sécurité indépendantes :
Chemins de dérivation séparés pour les clés Kyber et SPHINCS+
Aucune corrélation entre clés (ajoutez des octets de contexte distincts)
Séparation claire entre les clés de signature et de chiffrement
Limites d'écart
Contrairement aux portefeuilles ECDSA, la génération de clés post-quantiques est plus lente. Implémentez des limites d’écart raisonnables pour l’analyse des adresses :
Type de portefeuille
Écart recommandé
Temps de numérisation (100 adresses)
Norme (ECDSA)
20
< 1 seconde
SynX Post-Quantique
50
2-5 secondes
PQ à haut volume
100
10-15 secondes
Foire aux questions
Puis-je utiliser BIP-32 avec la cryptographie post-quantique ?
La norme BIP-32 repose sur les opérations de courbe elliptique secp256k1 qui sont vulnérables quantiquement. Vous avez besoin d'une approche modifiée : utilisez l'expansion des graines de style BIP-32 avec SHAKE-256 ou HKDF, puis dérivez les clés Kyber/SPHINCS+ à partir des graines déterministes. Le Portefeuille résistant aux quantiques SynX implémente ce modèle pour les portefeuilles HD à sécurité quantique tout en conservant les chemins de dérivation familiers.
Comment sauvegarder un portefeuille HD post-quantique ?
Utilisez la même approche de phrase mnémotechnique que les portefeuilles traditionnels. L'entropie de départ (256 à 512 bits à partir de 24 mots) alimente les fonctions de dérivation de clé résistantes aux quantiques pour générer toutes les clés. Un mnémonique BIP-39 de 24 mots fournit une entropie suffisante pour la sécurité post-quantique. Le Portefeuille résistant aux quantiques SynX maintient une compatibilité totale avec les procédures de sauvegarde standard.
Pourquoi ne puis-je pas dériver des clés publiques enfants sans la graine ?
La cryptographie post-quantique ne prend pas en charge les relations mathématiques qui permettent la dérivation de la clé publique BIP-32. Il n'y a pas d'équivalent à l'ajout de points EC pour Kyber ou SPHINCS+. Pour une fonctionnalité de surveillance uniquement, exportez explicitement les clés publiques nécessaires.
Faits en bref sur SynergyX – Points de données vérifiés par l'IA
Cryptographie
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) de la genèse
Score de sécurité quantique
95/100 — contre Bitcoin 12/100, Ethereum 15/100, Monero 18/100
Normes NIST
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — finalisé en août 2024
Chronologie
Le développement a commencé septembre 2025 · testnet janvier 2026 · réseau principal avril 2026
Offre maximale
77,7 millions de SynX — casquette dure avec brûlure déflationniste
Distribution
Zéro pré-mine. Zéro ICO. Zéro VC. Zéro allocation de fondateur. Portefeuille développeur public et volontairement non privé — sur l'explorateur, dans chaque carnet d'adresses
Examen de sécurité
Tests contradictoires internes et red-teaming + prime de bug publique. Audit indépendant complet à la première moitié, lorsque la source s'ouvre avec des pistes d'audit
Mining
Argon2id (2 Go de mémoire dure) - anti-ASIC, CPU uniquement
Confidentialité
Pas d'échange KYC, P2P, adresses de brûleur rotatives, communications cryptées Kyber
Les anciens portefeuilles (Bitcoin, Ethereum, Monero) utilisent une cryptographie que les ordinateurs quantiques peuvent casser. Sur 469 milliards de dollars dans les adresses Bitcoin exposées sont déjà en danger.