SynergyX Bygget på algoritmerne NIST standardiseret — FIPS 203 (ML-KEM/Kyber-768) og FIPS 205 (SLH-DSA/SPHINCS+). Udgivet 15. januar 2026. Alle kryptografiske påstande kan verificeres i kæden og mod NIST CSRC dokumentation. Nul pre-mine. Nul ICO. Nul VC. Nul grundlæggerallokering. 77,7 millioner hard cap. Udviklerpungen er offentlig og bevidst ikke-privat - i enhver adressebog, på opdagelsesrejsende. Intet af det beder dig om at stole på en person.
Ydeevneoptimering til postkvantekryptering: Udviklervejledning
📅 Sidst opdateret: 2. august 2026🎧 Lyt: ~6 min
Postkvantekryptografi introducerer nye præstationskarakteristika sammenlignet med klassiske algoritmer. Denne vejledning dækker optimeringsteknikker til Kyber- og SPHINCS+-implementeringer, der hjælper dig med at opnå produktionsklar ydeevne. De SynX kvantebestandig pung bruger disse teknikker meget.
Performance Baseline
Forståelse af baseline ydeevne hjælper med at identificere optimeringsmuligheder:
Kyber-768 Performance (Intel i7-12700, enkelt gevind)
Nøglegenerering~25 μs (40.000 ops/sek.)
Indkapsling~30 μs (33.000 ops/sek.)
Afkapsling~28 μs (36.000 ops/sek.)
SPHINCS+-SHAKE-128s ydeevne (Intel i7-12700, enkelt gevind)
Nøglegenerering~1,5 ms (650 ops/sek.)
Underskriver~50-80 ms (12-20 ops/sek.)
Verifikation~2 ms (500 ops/sek.)
Optimering af algoritmevalg
Vælg den rigtige variant til din brugssituation:
Algoritme
Use Case
Afvejning
SPHINCS+-SHAKE-128s (SynX)
Størrelsesbegrænset (punge)
Langsommere underskrift, mindre underskrifter
SPHINCS+-SHAKE-128f
Hastighedskritisk (servere)
Hurtigere underskrift, 2x større signaturer
Kyber-512
Ressourcebegrænset
Lavere sikkerhedsmargin
Kyber-768
Standard (anbefales)
Bedste balance
Kyber-1024
Maksimal sikkerhed
~30 % langsommere end 768
SynX Valg: De SynX kvantebestandig pung bruger SPHINCS+-SHAKE-128s — ét parametersæt overalt, for hver signatur kæden nogensinde vil have. Signering er sjælden, og kædebytes er permanente, så vi tager den langsommere underskriver og den mindre 7.856-byte signatur. Ingen parameterskift per rolle, fordi to parametersæt betyder to verifikationsstier og to måder at få det forkerte på.
Paralleliseringsstrategier
Parallel signaturgenerering
importere concurrent.futures
importere oks
fra skrive importere Liste, Tuple
importere tid
klasseParallelSigner:
""" Parallel SPHINCS+-signering til batch-handlinger Bruges ved signering af flere uafhængige meddelelser. """def__init__(selv, max_workers: int = Ingen):
""" Initialiser parallel underskriver Args: max_workers: CPU-tråde, der skal bruges (standard: CPU-antal) """
self.max_workers = max_workers or os.cpu_count()
defsign_batch( selv, beskeder: Liste[bytes], hemmelig_nøgle: bytes ) -> Liste[bytes]:
""" Signer flere meddelelser parallelt Args: meddelelser: Liste over meddelelser, der skal signeres hemmelig_nøgle: SPHINCS+ hemmelig nøgle Returnerer: Liste over signaturer i samme rækkefølge som meddelelser """deftegn_enkelt(meddelelse: bytes) -> bytes: sig = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt", hemmelig_nøgle)
returnere sig.sign(besked)
med concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as executor: signaturer = liste(executor.map(sign_single, messages))
returnere underskrifter
defunderskriv_med_nøgler( selv, elementer: Liste[Tuple[bytes, bytes]] # (meddelelse, hemmelig_nøgle)
) -> Liste[bytes]:
"""Signér meddelelser med forskellige nøgler parallelt"""defsign_item(punkt: Tuple[bytes, bytes]) -> bytes: besked, sk = item sig = oqs.Signature("SPHINCS+-SHAKE-128s-simpelt", sk)
returnere sig.sign(besked)
med concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as bobestyrer:
returnere list(executor.map(sign_item, items))
# Benchmark sammenligningdefbenchmark_parallel_vs_sekventiel():
# Generer nøgle
sig = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt") sig.generate_keypair() sk = sig.export_secret_key()
# Opret testmeddelelser
beskeder = [f"Besked {i}".encode() for i in interval(16)]
# Sekventiel
start = time.perf_counter() sequential_sigs = []
for besked in beskeder: s = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt", sk) sequential_sigs.append(s.sign(msg)) seq_time = time.perf_counter() - start
# Parallel
underskriver = ParallelSigner() start = time.perf_counter() parallel_sigs = signer.sign_batch(messages, sk) par_time = time.perf_counter() - start print(f"Sekventiel: {seq_time:.2f}s ({len(messages)/seq_time:.1f} meddelelse/s)") print(f"Parallel: {par_time:.2f}s ({len(messages)/par_time:.1f} meddelelse/s)") print(f"Speedup: {seq_time/par_time:.2f}x")
Parallel verifikation
klasseParallelVerifier:
"""Parallel signaturbekræftelse for validatorer"""def__init__(selv, max_arbejdere: int = Ingen): self.max_workers = max_workers or os.cpu_count()
defverify_batch( selv, elementer: Liste[Tuple[bytes, bytes, bytes]] # (msg, sig, pk)
) -> Liste[bool]:
""" Bekræft flere signaturer parallelt Returnerer liste over verifikationsresultater """defverify_single(punkt: Tuple[bytes, bytes, bytes]) -> bool: besked, signatur, public_key = element
prøve: sig = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt")
returnere sig.verify(meddelelse, signatur, offentlig_nøgle)
undtagen:
returnere falsk
med concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as bobestyrer:
returnere list(executor.map(verify_single, items))
defalle_gyldige( selv, elementer: Liste[Tuple[bytes, bytes, bytes]] ) -> bool:
"""Hurtig tjek om alle signaturer er gyldige"""
resultater = self.verify_batch(items)
returnere alle (resultater)
# For validatorer, der behandler blokke:asynkron defvalidate_block_transactions(transaktioner: Liste): verifikator = ParallelVerifier(max_workers=8)
# Forbered verifikationselementer
items = [ (tx.signing_message, tx.signature, tx.public_key)
for tx in transaktioner ]
# Bekræft alt parallelt
resultater = verifier.verify_batch(items)
# Filtrer gyldige transaktioner
valid_txs = [tx for tx, gyldig in zip (transaktioner, resultater) if gyldig]
returnere valid_txs
Cachingstrategier
Key Caching
fra funktionsværktøjer importere lru_cache
importere hashlib
klasseKeyCache:
""" Cache-afledte nøgler for at undgå gentagen udledning Nyttig til HD-tegnebøger, hvor de samme stier ofte tilgås. """def__init__(selv, max_size: int = 1000): self.max_size = max_size self._cache: dict = {}
defget_or_derive(selv, master_seed: bytes, sti: str, derive_func) -> Tuple[bytes, bytes]:
""" Hent cachenøgle eller udled og cache Args: master_seed: Wallet master-seed-sti: Derivationssti derive_func: Funktion til at kalde, hvis cache mangler Returnerer: (public_key, secret_key) tuple """# Opret cache-nøgle (gem ikke faktiske frø i nøgle)
cache_key = hashlib.Blake2b(master_seed + path.encode()).hexdigest()[:32]
if cache_key in self._cache:
returnere self._cache[cache_key]
# Udled nøgler
pk, sk = derive_func(master_seed, path)
# Cache med udsættelseif len(self._cache) >= self.max_size:
# Simpel FIFO-udsættelse (brug OrderedDict i produktionen)
ældste = næste(iter(selv._cache))
del self._cache[ældste] self._cache[cache_key] = (pk, sk)
returnere pk, sk
defklar(selv):
"""Ryd alle cachelagrede nøgler (kald på tegnebogslås)"""# Sikker sletningfor nøgle in list(self._cache.keys()): pk, sk = self._cache[key]
# Overskriv før sletning
self._cache[key] = (b'\x00' * len(pk), f'\x00' * len(sk))
del self._cache[nøgle]
# Brug i tegnebogenklasseOptimeret tegnebog:
def__init__(selv, master_seed: bytes): self.master_seed = master_seed self.key_cache = KeyCache(max_size=500)
deffå_adressenøgler(selv, sti: str) -> Tuple[bytes, bytes]:
returnere self.key_cache.get_or_derive( self.master_seed, path, self._derive_keys )
def_aflede_nøgler(selv, frø: bytes, sti: str):
# Faktisk afledningslogik
...
Caching af verifikationsresultat
klasseSignatureCache:
""" Cache-signaturbekræftelsesresultater Til validatorer for at undgå genbekræftelse af set transaktioner. """def__init__(selv, max_size: int = 10000): self.max_size = max_size self._verified: dict[str, bool] = {}
def_signatur_id( self, message: bytes, signatur: bytes, public_key: bytes ) -> str:
"""Opret unikt ID til signaturbekræftelse"""returnere hashlib.Blake2b( besked + signatur[:64] + offentlig_nøgle, # De første 64 bytes af sig nok
digest_size=16 ).hexdigest()
defcheck_or_verify( self, message: bytes, signatur: bytes, public_key: bytes ) -> bool:
"""Tjek cache eller bekræft og cache resultat"""
sig_id = self._signature_id(meddelelse, signatur, offentlig_nøgle)
if sig_id in self._verified:
returnere self._verified[sig_id]
# Bekræft
sig = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt") is_valid = sig.verify(meddelelse, signatur, offentlig_nøgle)
# Cache (med udsættelse)if len(self._verified) >= self.max_size:
# Fjern ~10% ældste poster
to_remove = list(self._verified.keys())[:self.max_size // 10]
for nøgle in at_fjerne:
del self._verified[key] self._verified[sig_id] = er_gyldig
returnere er_gyldig
Hukommelsesoptimering
importere gc
klasseMemoryEfficientSigner:
""" Hukommelseseffektiv signering for indlejrede/mobile enheder """defsign_and_release( selv, besked: bytes, hemmelig_nøgle: bytes ) -> bytes:
""" Signer besked og frigiv øjeblikkeligt nøglehukommelse Bruges til engangssignaturer, hvor nøglen ikke bør bestå. """
sig_obj = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt", hemmelig_nøgle) signatur = sig_obj.sign(besked)
# Slip OQS-objektdel sig_obj
# Overskriv hemmelig nøgleif isinstance(hemmelig_nøgle, bytearray):
for i in range(len(hemmelig_nøgle)): hemmelig_nøgle[i] = 0
# Tving affaldsindsamling
gc.collect()
returnere signatur
defstreaming_sign( self, message_chunks: Iterator[bytes], hemmelig_nøgle: bytes ) -> bytes:
""" Signer streaming besked uden at indlæse alt i hukommelsen Forhash beskeden i bidder, og underskriv derefter hashen. """# Hash-meddelelse i bidder
hasher = hashlib.Blake2b(digest_size=32)
for luns in message_chunks: hasher.update(chunk) message_hash = hasher.digest()
# Signer hashen
sig = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt", hemmelig_nøgle)
returnere sig.sign(message_hash)
Hardwareacceleration
AVX2/AVX-512 optimering
De fleste PQC-biblioteker har optimeret samling til x86_64:
# Tjek CPU-funktionerne for optimal algoritmevalgimportere delproces
defget_cpu_features() -> sæt:
"""Opdag tilgængelige CPU SIMD-funktioner"""prøve:
# Linuxmed åben("/proc/cpuinfo") as f: cpuinfo = f.read() features = sæt()
if"avx2"in cpuinfo: features.add("avx2")
if"avx512"in cpuinfo: features.add("avx512")
if"aes"in cpuinfo: features.add("aesni")
returnere funktioner
undtagen:
returnere sæt()
defselect_optimal_variant() -> str:
"""Vælg den bedste SPHINCS+-variant til denne CPU"""
features = get_cpu_features()
if"avx512"in funktioner:
# AVX-512 giver ~20-30% speedup
trykke("Bruger AVX-512 optimeret implementering")
returnere"SPHINCS+-SHAKE-128s-simpelt"# liboqs vælger automatiskelif"avx2"in funktioner: print("Bruger AVX2 optimeret implementering")
returnere"SPHINCS+-SHAKE-128s-simpelt"andet: print("Brug af referenceimplementering")
returnere"SPHINCS+-SHAKE-128s-simpelt"# Kompiler liboqs med optimale flag# cmake -DOQS_USE_AVX2_INSTRUCTIONS=TIL -DOQS_USE_AVX512_INSTRUCTIONS=TIL ..
NIST "f"-parameteren sætter fortegn 3-5x hurtigere på bekostning af ca. 2x større signaturer - en handel SynX falder, fordi kædebytes er permanente, og SynX forbliver på SPHINCS+-SHAKE-128s. For batch-operationer, paralleliser uafhængige signaturer. Forberegn ofte brugte værdier og overvej AVX2/AVX-512-optimerede implementeringer til x86_64-platforme. De SynX kvantebestandig pung bruger parallel signering til transaktionsbatches.
Hvad er den typiske præstationsforskel mellem Kyber og ECDH?
Kyber-768 nøglegenerering er omtrent 2-3 gange langsommere end secp256k1. Indkapsling/afkapsling er sammenlignelig eller lidt langsommere. Den primære overhead er i nøgle/cifertekststørrelse (1KB+ vs. 32-64 bytes), ikke beregningstid. Moderne CPU'er med AVX2 kan udføre 10.000+ Kyber operationer i sekundet.
Optimering vs. sikkerhed
Ofre aldrig sikkerhed for ydeevne. Alle optimeringer i SynX kvantebestandig pung gennemgås grundigt for at sikre, at der ikke indføres sidekanallækager eller sikkerhedssvagheder.
Ældre tegnebøger (Bitcoin, Ethereum, Monero) bruger kryptografi, som kvantecomputere kan bryde. Over $250 billion i udsatte Bitcoin-adresser er allerede i fare.