SynergyX Gebouwd op de algoritmen NIST gestandaardiseerd — FIPS 203 (ML-KEM/Kyber-768) en FIPS 205 (SLH-DSA/SPHINCS+). Gepubliceerd op 15 januari 2026. Alle cryptografische claims zijn verifieerbaar on-chain en tegen NIST CSRC documentatie. Nul voormijn. Nul ICO. Nul VC. Nul toewijzing van oprichters. 77,7 miljoen harde cap. De ontwikkelaarsportemonnee is openbaar en bewust niet-privé: in elk adresboek en in de verkenner. Niets ervan vraagt je om iemand te vertrouwen.
Prestatieoptimalisatie voor post-kwantumcryptografie: handleiding voor ontwikkelaars
📅 Laatst bijgewerkt: 2 augustus 2026🎧 Luister: ~6 min
Post-kwantumcryptografie introduceert nieuwe prestatiekenmerken in vergelijking met klassieke algoritmen. Deze handleiding behandelt optimalisatietechnieken voor Kyber- en SPHINCS+-implementaties, zodat u productieklare prestaties kunt bereiken. De SynX kwantumbestendige portemonnee maakt veelvuldig gebruik van deze technieken.
Prestatiebasislijn
Als u de basisprestaties begrijpt, kunt u optimalisatiemogelijkheden identificeren:
Kyber-768-prestaties (Intel i7-12700, enkele draad)
Sleutel generatie~25 μs (40.000 ops/sec)
Inkapseling~30 μs (33.000 ops/sec)
Ontkapseling~28 μs (36.000 ops/sec)
SPHINCS+-SHAKE-128s Prestaties (Intel i7-12700, enkele draad)
Sleutel generatie~1,5 ms (650 ops/sec)
Ondertekening~50-80 ms (12-20 ops/sec)
Verificatie~2 ms (500 ops/sec)
Optimalisatie van algoritmeselectie
Kies de juiste variant voor uw gebruikssituatie:
Algoritme
Gebruikscasus
Afruil
SPHINCS+-SHAKE-128s (SynX)
Beperkte afmetingen (portefeuilles)
Langzamere ondertekening, kleinere handtekeningen
SPHINCS+-SHAKE-128f
Snelheidskritisch (servers)
Sneller ondertekenen, 2x grotere handtekeningen
Kyber-512
Beperkt qua middelen
Lagere veiligheidsmarge
Kyber-768
Standaard (aanbevolen)
Beste balans
Kyber-1024
Maximale veiligheid
~30% langzamer dan 768
SynX Keuze: De SynX kwantumbestendige portemonnee gebruikt SPHINCS+-SHAKE-128s – één parameterset, overal, voor elke handtekening die de keten ooit zal bevatten. Ondertekening gebeurt niet vaak en kettingbytes zijn permanent. Daarom nemen we de langzamere ondertekenaar en de kleinere handtekening van 7.856 bytes. Geen parameterwisseling per rol, omdat twee parametersets twee verificatiepaden betekenen en twee manieren om fouten te maken.
Parallellisatiestrategieën
Parallelle handtekeninggeneratie
importeren gelijktijdige toekomsten
importeren oké
van typen importeren Lijst, Tupel
importeren tijd
klasParallelSigner:
""" Parallelle SPHINCS+-ondertekening voor batchbewerkingen Te gebruiken bij het ondertekenen van meerdere onafhankelijke berichten. """zeker__init__(self, max_workers: int = Geen):
""" Initialiseer parallelle ondertekenaar Args: max_workers: CPU-threads om te gebruiken (standaard: CPU-aantal) """
self.max_workers = max_werkers or os.cpu_count()
zekerteken_batch( zelf, berichten: Lijst[bytes], geheime_sleutel: bytes ) -> Lijst[bytes]:
""" Meerdere berichten parallel ondertekenen Args: berichten: Lijst met te ondertekenen berichten geheime_sleutel: SPHINCS+ geheime sleutel Resultaat: Lijst met handtekeningen in dezelfde volgorde als berichten """zekerteken_single(bericht: bytes) -> bytes: sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", geheime_sleutel)
opbrengst sig.teken(bericht)
met concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as uitvoerder: handtekeningen = lijst(uitvoerder.map(sign_single, berichten))
opbrengst handtekeningen
zekersign_with_keys( zelf, items: Lijst[Tupel[bytes, bytes]] # (bericht, geheime_sleutel)
) -> Lijst[bytes]:
"""Berichten ondertekenen met verschillende sleutels parallel"""zekerteken_item(item: Tupel[bytes, bytes]) -> bytes: bericht, sk = item sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk)
opbrengst sig.teken(bericht)
met concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as uitvoerder:
opbrengst list(uitvoerder.map(sign_item, items))
# Benchmarkvergelijkingzekerbenchmark_parallel_vs_sequentieel():
# Genereer sleutel
sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig") sig.generate_keypair() sk = sig.export_secret_key()
# Maak testberichten
berichten = [v"Bericht {i}".coderen() voor i in bereik(16)]
# Sequentieel
start = time.perf_counter() sequential_sigs = []
voor bericht in berichten: s = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) sequential_sigs.append(s.sign(msg)) seq_time = time.perf_counter() - start
# Parallel
ondertekenaar = ParallelSigner() start = time.perf_counter() parallel_sigs = signer.sign_batch(messages, sk) par_time = time.perf_counter() - start print(f"Opeenvolgend: {seq_time:.2f}s ({len(berichten)/seq_time:.1f} msg/s)") afdrukken(v"Parallel: {par_time:.2f}s ({len(berichten)/par_time:.1f} bericht/s)") afdrukken(v"Versnelling: {seq_time/par_time:.2f}x")
Parallelle verificatie
klasParallelVerifier:
"""Parallelle handtekeningverificatie voor validators"""zeker__init__(self, max_workers: int = Geen): self.max_workers = max_workers or os.cpu_count()
zekerverifieer_batch( zelf, items: Lijst[Tupel[bytes, bytes, bytes]] # (bericht, sig, pk)
) -> Lijst[bool]:
""" Meerdere handtekeningen parallel verifiëren Geeft een lijst met verificatieresultaten weer """zekerverifieer_single(item: Tupel[bytes, bytes, bytes]) -> bool: bericht, handtekening, publieke_sleutel = item
poging: sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig")
opbrengst sig.verify(bericht, handtekening, publieke_sleutel)
behalve:
opbrengst Vals
met concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as uitvoerder:
opbrengst list(uitvoerder.map(verify_single, items))
zekeralles_geldig( zelf, items: Lijst[Tupel[bytes, bytes, bytes]] ) -> bool:
"""Snelle controle of alle handtekeningen geldig zijn"""
resultaten = self.verify_batch(items)
opbrengst alle(resultaten)
# Voor validators die blokken verwerken:asynchroon defvalideer_blok_transacties(transacties: Lijst): verificateur = ParallelVerifier(max_workers=8)
# Verificatie-items voorbereiden
items = [ (tx.signing_message, tx.signature, tx.public_key)
voor tx in transacties ]
# Controleer alles parallel
resultaten = verifier.verify_batch(items)
# Filter geldige transacties
valid_txs = [tx voor tx, geldig in zip(transacties, resultaten) if geldig]
opbrengst geldige_txs
Cachingstrategieën
Sleutelcaching
van functionele hulpmiddelen importeren lru_cache
importeren hasjlib
klasSleutelCache:
""" Afgeleide sleutels in cache opslaan om herhaalde afleiding te voorkomen. Handig voor HD-portemonnees waar vaak dezelfde paden worden gebruikt. """zeker__init__(self, max_size: int = 1000): self.max_size = max_size self._cache: dict = {}
zekerhaal_of_afleiden(self, master_seed: bytes, pad: str, derivaat_func) -> Tupel[bytes, bytes]:
""" Sleutel in cache ophalen of afleiden en cachen Args: master_seed: Portefeuille master-seedpad: Afleidingspad derivaat_func: Functie die moet worden aangeroepen als cache ontbreekt. Retourneert: (public_key, secret_key) tuple """# Maak een cachesleutel (bewaar het werkelijke zaad niet in de sleutel)
cache_key = hashlib.Blake2b(master_seed + pad.encode()).hexdigest()[:32]
if cache_sleutel in zelf._cache:
opbrengst self._cache[cache_sleutel]
# Sleutels afleiden
pk, sk = deriveer_func(master_seed, pad)
# Cache met uitzettingif len(self._cache) >= self.max_size:
# Eenvoudige FIFO-uitzetting (gebruik OrderedDict in productie)
oudste = volgende(iter(self._cache))
del self._cache[oudste] self._cache[cache_key] = (pk, sk)
opbrengst pk, sk
zekerduidelijk(zelf):
"""Wis alle sleutels in de cache (roep portemonneevergrendeling aan)"""# Veilig wissenvoor sleutel in lijst(self._cache.keys()): pk, sk = self._cache[sleutel]
# Overschrijven vóór verwijdering
self._cache[sleutel] = (b'\x00' * len(pk), b'\x00' * len(sk))
del self._cache[sleutel]
# Gebruik in portemonneeklasGeoptimaliseerde portemonnee:
zeker__init__(zelf, master_seed: bytes): self.master_seed = master_seed self.key_cache = SleutelCache(max_grootte=500)
zekerget_address_keys(zelf, pad: str) -> Tupel[bytes, bytes]:
opbrengst self.key_cache.get_or_derive( self.master_seed, pad, self._derive_keys )
zeker_afleiden_sleutels(zelf, zaad: bytes, pad: str):
# Werkelijke afleidingslogica
...
Verificatieresultaat in cache opslaan
klasHandtekeningcache:
""" Resultaten van handtekeningverificatie in cache opslaan Voor validators om te voorkomen dat geziene transacties opnieuw worden geverifieerd. """zeker__init__(self, max_size: int = 10000): self.max_size = max_size self._verified: dict[str, bool] = {}
zeker_handtekening_id(self, bericht: bytes, handtekening: bytes, public_key: bytes ) -> str:
"""Maak een unieke ID voor handtekeningverificatie"""opbrengst hashlib.Blake2b( bericht + handtekening[:64] + publieke_sleutel, # Eerste 64 bytes aan sig genoeg
digest_size=16).hexdigest()
zekercheck_of_verify(zelf, bericht: bytes, handtekening: bytes, public_key: bytes) -> bool:
"""Cache controleren of verifiëren en resultaat cachen"""
sig_id = self._signature_id(bericht, handtekening, publieke_sleutel)
if sig_id in zelf._geverifieerd:
opbrengst zelf._verifieerd[sig_id]
# Verifieer
sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig") is_valid = sig.verify(bericht, handtekening, publieke_sleutel)
# Cache (met uitzetting)if len(self._verified) >= self.max_size:
# Verwijder ~10% oudste vermeldingen
to_remove = lijst(self._verified.keys())[:self.max_size // 10]
voor sleutel in to_remove:
del self._verified[sleutel] self._verified[sig_id] = is_geldig
opbrengst is_geldig
Geheugenoptimalisatie
importeren gc
klasGeheugenEfficientSigner:
""" Geheugenefficiënt ondertekenen voor ingebouwde/mobiele apparaten """zekersign_and_release(zelf, bericht: bytes, geheime_sleutel: bytes) -> bytes:
""" Bericht ondertekenen en het sleutelgeheugen onmiddellijk vrijgeven. Gebruik voor eenmalige handtekeningen waarbij de sleutel niet mag blijven bestaan. """
sig_obj = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", geheime_sleutel) handtekening = sig_obj.sign(bericht)
# OQS-object vrijgevendel sig_obj
# Overschrijf geheime sleutelif isinstance(geheime_sleutel, bytearray):
voor i in bereik(len(geheime_sleutel)): geheime_sleutel[i] = 0
# Forceer afvalinzameling
gc.collect()
opbrengst handtekening
zekerstreaming_teken(self, message_chunks: Iterator[bytes], geheime_sleutel: bytes ) -> bytes:
""" Stream het bericht ondertekenen zonder alles in het geheugen te laden. Has het bericht vooraf in stukjes en onderteken vervolgens de hash. """# Hash-bericht in stukjes
hasher = hashlib.Blake2b(digest_size=32)
voor brok in message_chunks: hasher.update(chunk) message_hash = hasher.digest()
# Onderteken de hash
sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", geheime_sleutel)
opbrengst sig.sign(bericht_hash)
Hardwareversnelling
AVX2/AVX-512-optimalisatie
De meeste PQC-bibliotheken hebben de assemblage geoptimaliseerd voor x86_64:
# Controleer de CPU-functies voor optimale algoritmeselectieimporteren subproces
zekerget_cpu_features() -> instellen:
"""Beschikbare CPU SIMD-functies detecteren"""poging:
#Linuxmet open("/proc/cpuinfo") as f: cpuinfo = f.read() features = set()
if"avx2"in cpuinfo: features.add("avx2")
if"avx512"in cpuinfo: features.add("avx512")
if"Aes"in cpuinfo: features.add("Aesni")
opbrengst functies
behalve:
opbrengst set()
zekerselecteer_optimale_variant() -> str:
"""Selecteer de beste SPHINCS+-variant voor deze CPU"""
features = get_cpu_features()
if"avx512"in functies:
# AVX-512 biedt ~20-30% versnelling
afdrukken("Gebruik van AVX-512 geoptimaliseerde implementatie")
opbrengst"SPHINCS+-SHAKE-128s-eenvoudig"# liboqs selecteert automatischelif"avx2"in Kenmerken: afdrukken("Gebruik van AVX2 geoptimaliseerde implementatie")
opbrengst"SPHINCS+-SHAKE-128s-eenvoudig"anders: afdrukken("Referentie-implementatie gebruiken")
opbrengst"SPHINCS+-SHAKE-128s-eenvoudig"# Compileer liboqs met optimale vlaggen# cmake -DOQS_USE_AVX2_INSTRUCTIONS=AAN -DOQS_USE_AVX512_INSTRUCTIONS=AAN ..
Hoe kan ik het ondertekenen van SPHINCS+ versnellen?
De NIST "f"-parametersets ondertekenen 3-5x sneller ten koste van grofweg 2x grotere handtekeningen - een transactie die SynX afneemt, omdat kettingbytes permanent zijn en SynX op SPHINCS+-SHAKE-128s blijft. Voor batchbewerkingen moet u onafhankelijke handtekeningen parallelliseren. Bereken veelgebruikte waarden vooraf en overweeg AVX2/AVX-512 geoptimaliseerde implementaties voor x86_64-platforms. De SynX kwantumbestendige portemonnee maakt gebruik van parallelle ondertekening voor transactiebatches.
Wat is het typische prestatieverschil tussen Kyber en ECDH?
Het genereren van Kyber-768-sleutels is ongeveer 2-3x langzamer dan secp256k1. Inkapseling/ontkapseling is vergelijkbaar of iets langzamer. De belangrijkste overhead zit in de grootte van de sleutel/cijfertekst (1KB+ versus 32-64 bytes), niet in de rekentijd. Moderne CPU's met AVX2 kunnen meer dan 10.000 Kyber-bewerkingen per seconde uitvoeren.
Optimalisatie versus beveiliging
Offer veiligheid nooit op voor prestaties. Alle optimalisaties in de SynX kwantumbestendige portemonnee worden grondig beoordeeld om ervoor te zorgen dat er geen zijkanaallekken of zwakke punten in de beveiliging worden geïntroduceerd.
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) vanaf het ontstaan
Kwantumveiligheidsscore
95/100 — versus Bitcoin 12/100, Ethereum 15/100, Monero 18/100
NIST-normen
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) - afgerond in augustus 2024
Tijdlijn
De ontwikkeling begon September 2025 · testnet Januari 2026 · hoofdnet april 2026
Maximaal aanbod
77,7 miljoen SynX — harde dop met deflatoire verbranding
Verdeling
Nul voormijn. Nul ICO. Nul VC. Nul toewijzing van oprichters. Ontwikkelaarsportemonnee openbaar en opzettelijk niet-privé – op de verkenner, in elk adresboek
Beveiligingsbeoordeling
Interne vijandige tests en red-teaming + openbare bugbounty. Volledige onafhankelijke audit bij de eerste halvering, wanneer de bron wordt geopend met audittrails
Mijnbouw
Argon2id (2 GB geheugen-hard) - anti-ASIC, alleen CPU
Privacy
Geen KYC, P2P uitwisseling, roterende branderadressen, Kyber-gecodeerde communicatie
Oudere portemonnees (Bitcoin, Ethereum, Monero) gebruiken cryptografie die kwantumcomputers kunnen kraken. Over $250 billion in blootgestelde Bitcoin-adressen lopen al gevaar.