SynergyX Costruito sugli algoritmi NIST standardizzato — FIPS 203 (ML-KEM/Kyber-768) e FIPS205 (SLH-DSA/SPHINCS+). Pubblicato il 15 gennaio 2026. Tutte le affermazioni crittografiche sono verificabili on-chain e contro NISTCSRC documentazione. Zero pre-mina. Zero ICO. Zero CV. Allocazione zero del fondatore. Hard cap da 77,7 milioni. Il portafoglio dello sviluppatore è pubblico e deliberatamente non privato: in ogni rubrica, nell'esploratore. Niente di tutto ciò ti chiede di fidarti di una persona.
Ottimizzazione delle prestazioni per la crittografia post-quantistica: guida per gli sviluppatori
📅 Last updated: September 23, 2026🎧 Ascolta: ~6 min
La crittografia post-quantistica introduce nuove caratteristiche prestazionali rispetto agli algoritmi classici. Questa guida illustra le tecniche di ottimizzazione per le implementazioni Kyber e SPHINCS+, aiutandoti a ottenere prestazioni pronte per la produzione. IL Portafoglio resistente ai quanti SynX utilizza ampiamente queste tecniche.
Prestazioni di riferimento
Comprendere il rendimento di base aiuta a identificare le opportunità di ottimizzazione:
Scelta SynX: IL Portafoglio resistente ai quanti SynX usi SPHINCS+-SHAKE-128s — un set di parametri, ovunque, per ogni firma che la catena manterrà mai. La firma è poco frequente e i byte a catena sono permanenti, quindi prendiamo il firmatario più lento e la firma più piccola da 7.856 byte. Nessun cambio di parametri per ruolo, perché due set di parametri significano due percorsi di verifica e due modi per sbagliare.
Strategie di parallelizzazione
Generazione parallela di firme
importare futuri.concorrenti
importare oq
da digitando importare Elenco, Tupla
importare tempo
classeParallelSigner:
""" Firma parallela SPHINCS+ per operazioni batch Da utilizzare quando si firmano più messaggi indipendenti. """def__init__(self, max_workers: int = None):
""" Inizializza argomenti firmatario parallelo: max_workers: thread CPU da utilizzare (impostazione predefinita: conteggio CPU) """
self.max_lavoratori = max_lavoratori or os.cpu_count()
defsegno_batch( self, messaggi: List[bytes], secret_key: bytes ) -> List[bytes]:
""" Firma più messaggi in parallelo Argomenti: messaggi: Elenco di messaggi da firmare secret_key: chiave segreta SPHINCS+ Restituisce: Elenco di firme nello stesso ordine dei messaggi """defsegno_singolo(messaggio: byte) -> byte: sig = oqs.Signature("SPHINCS+-SHAKE-128s-semplice", chiave_segreta)
ritorno sig.sign(messaggio)
con concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as esecutore: firme = list(executor.map(sign_single, messaggi))
ritorno firme
deffirma_con_chiavi( sé, elementi: Elenco[Tupla[byte, byte]] # (messaggio, chiave_segreta)
) -> Elenco[byte]:
"""Firma messaggi con chiavi diverse in parallelo"""defsegno_oggetto(articolo: Tupla[byte, byte]) -> byte: messaggio, sk = elemento sig = oqs.Signature("SPHINCS+-SHAKE-128s-semplice", Sk)
ritorno sig.sign(messaggio)
con concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as esecutore:
ritorno list(executor.map(sign_item, items))
# Confronto benchmarkdefbenchmark_parallel_vs_sequential():
# Genera chiave
sig = oqs.Firma("SPHINCS+-SHAKE-128s-semplice") sig.generate_keypair() sk = sig.export_secret_key()
# Crea messaggi di prova
messaggi = [f"Messaggio {i}".codificare() per i in intervallo(16)]
# Sequenziale
start = time.perf_counter() sequential_sigs = []
per msg in messaggi: s = oqs.Signature("SPHINCS+-SHAKE-128s-semplice", sk) sequential_sigs.append(s.sign(msg)) seq_time = time.perf_counter() - start
# Parallelo
firmatario = ParallelSigner() start = time.perf_counter() parallel_sigs = signer.sign_batch(messages, sk) par_time = time.perf_counter() - start print(f"Sequenziale: {seq_time:.2f}s ({len(messaggi)/seq_time:.1f} msg/s)") stampa(f"Parallelo: {par_time:.2f}s ({len(messages)/par_time:.1f} msg/s)") stampa(f"Accelerazione: {seq_time/par_time:.2f}x")
Verifica parallela
classeParallelVerifier:
"""Verifica parallela della firma per validatori"""def__init__(self, max_workers: int = None): self.max_workers = max_workers or os.cpu_count()
defverifica_batch( sé, elementi: Elenco[Tupla[byte, byte, byte]] # (messaggio, firma, pk)
) -> Lista[bool]:
""" Verifica più firme in parallelo Restituisce l'elenco dei risultati della verifica """defverifica_singolo(articolo: Tupla[byte, byte, byte]) -> bool: messaggio, firma, chiave_pubblica = elemento
Tentativo: sig = oqs.Firma("SPHINCS+-SHAKE-128s-semplice")
ritorno sig.verify(messaggio, firma, chiave_pubblica)
tranne:
ritorno Falso
con concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as esecutore:
ritorno list(executor.map(verify_single, items))
deftutti_validi( sé, elementi: Elenco[Tupla[byte, byte, byte]] ) -> bool:
"""Verifica rapida se tutte le firme sono valide"""
risultati = self.verify_batch(articoli)
ritorno tutti(risultati)
# Per i validatori che elaborano i blocchi:asincrono defvalidate_block_transactions(transazioni: Elenco): verificatore = ParallelVerifier(max_lavoratori=8)
# Preparare gli elementi di verifica
elementi = [ (tx.signing_message, tx.signature, tx.public_key)
per tx in transazioni]
# Verifica tutto in parallelo
risultati = verifier.verify_batch(articoli)
# Filtra transazioni valide
tx_valido = [tx per tx, valido in zip(transazioni, risultati) if valido]
ritorno valid_txs
Strategie di memorizzazione nella cache
Caching chiave
da funtools importare lru_cache
importare hashlib
classeKeyCache:
""" Memorizza nella cache le chiavi derivate per evitare derivazioni ripetute. Utile per i portafogli HD in cui si accede frequentemente agli stessi percorsi. """def__init__(self, max_size: int = 1000): self.max_size = max_size self._cache: dict = {}
defottenere_o_derivare(self, master_seed: bytes, percorso: str, deriva_func) -> Tupla[byte, byte]:
""" Ottieni la chiave memorizzata nella cache o deriva e memorizza nella cache Argomenti: master_seed: percorso seed principale del portafoglio: percorso di derivazione deriva_func: funzione da chiamare se la cache perde Restituisce: (public_key, secret_key) tupla """# Crea chiave cache (non memorizza il seme effettivo nella chiave)
cache_key = hashlib.Blake2b(master_seed + path.encode()).hexdigest()[:32]
if chiave_cache in self._cache:
ritorno self._cache[chiave_cache]
# Deriva le chiavi
pk, sk = deriva_func(master_seed, percorso)
# Cache con sfrattoif len(self._cache) >= self.max_size:
# Semplice sfratto FIFO (usa OrderedDict in produzione)
più vecchio = successivo(iter(self._cache))
del self._cache[più vecchio] self._cache[cache_key] = (pk, sk)
ritorno pk, sc
defchiaro(se stesso):
"""Cancella tutte le chiavi memorizzate nella cache (richiama il blocco del portafoglio)"""# Cancellazione sicuraper chiave in list(self._cache.keys()): pk, sk = self._cache[chiave]
# Sovrascrivi prima dell'eliminazione
self._cache[chiave] = (b'\x00' * lente(pk), b'\x00' * lente(sk))
del self._cache[chiave]
# Utilizzo nel portafoglioclassePortafoglio ottimizzato:
def__init__(self, master_seed: byte): self.master_seed = master_seed self.key_cache = KeyCache(dimensione_max=500)
defottieni_chiavi_indirizzo(self, percorso: str) -> Tupla[byte, byte]:
ritorno self.key_cache.get_or_derive( self.master_seed, percorso, self._derive_keys )
def_derive_keys(self, seed: byte, percorso: str):
# Logica di derivazione effettiva
...
Caching dei risultati della verifica
classeSignatureCache:
""" Risultati della verifica della firma nella cache Per consentire ai validatori di evitare di verificare nuovamente le transazioni viste. """def__init__(self, dimensione_max: int = 10000): self.dimensione_max = dimensione_max self._verified: dict[str, bool] = {}
def_firma_id(self, messaggio: byte, firma: byte, public_key: byte) -> str:
"""Crea ID univoco per la verifica della firma"""ritorno hashlib.Blake2b( messaggio + firma[:64] + chiave_pubblica, # I primi 64 byte di segno sono sufficienti
digest_size=16 ).hexdigest()
defcontrolla_o_verifica(self, messaggio: byte, firma: byte, public_key: byte) -> bool:
"""Controlla la cache o verifica e memorizza nella cache il risultato"""
sig_id = self._signature_id(messaggio, firma, chiave_pubblica)
if sig_id in self._verificato:
ritorno self._verified[sig_id]
#Verifica
sig = oqs.Firma("SPHINCS+-SHAKE-128s-semplice") è_valido = sig.verify(messaggio, firma, chiave_pubblica)
# Cache (con eliminazione)if len(self._verified) >= self.max_size:
# Rimuovi circa il 10% delle voci più vecchie
to_remove = list(self._verified.keys())[:self.max_size // 10]
per chiave in da_rimuovere:
del self._verified[key] self._verified[sig_id] = è_valido
ritorno è_valido
Ottimizzazione della memoria
importare gc
classeMemoryEfficientSigner:
""" Firma efficiente in termini di memoria per dispositivi incorporati/mobili """deffirma_e_rilascia( self, messaggio: byte, secret_key: byte ) -> byte:
""" Firma il messaggio e rilascia immediatamente la memoria della chiave. Utilizzare per firme una tantum in cui la chiave non deve persistere. """
sig_obj = oqs.Firma("SPHINCS+-SHAKE-128s-semplice", chiave_segreta) firma = sig_obj.sign(messaggio)
# Rilascia l'oggetto OQSdel sig_obj
# Sovrascrivi la chiave segretaif isinstance(chiave_segreta, array di byte):
per i in range(len(chiave_segreta)): chiave_segreta[i] = 0
# Forza la raccolta dei rifiuti
gc.collect()
ritorno firma
defstreaming_sign( self, message_chunks: Iterator[bytes], secret_key: bytes ) -> byte:
""" Firma il messaggio in streaming senza caricarlo tutto in memoria. Effettua il pre-hashing del messaggio in blocchi, quindi firma l'hash. """# Messaggio hash in blocchi
hasher = hashlib.Blake2b(digest_size=32)
per pezzo in message_chunks: hasher.update(chunk) message_hash = hasher.digest()
# Firma l'hash
sig = oqs.Firma("SPHINCS+-SHAKE-128s-semplice", chiave_segreta)
ritorno sig.sign(hash_messaggio)
Accelerazione hardware
Ottimizzazione AVX2/AVX-512
La maggior parte delle librerie PQC hanno un assembly ottimizzato per x86_64:
# Controlla le funzionalità di CPU per la selezione ottimale dell'algoritmoimportare sottoprocesso
defget_cpu_features() -> imposta:
"""Rileva le funzionalità SIMD CPU disponibili"""Tentativo:
#Linuxcon aprire("/proc/cpuinfo") as f: cpuinfo = f.read() caratteristiche = set()
if"avx2"in cpuinfo: features.add("avx2")
if"avx512"in cpuinfo: features.add("avx512")
if"ae"in cpuinfo: features.add("aesni")
ritorno caratteristiche
tranne:
ritorno impostato()
defselect_optimal_variant() -> stringa:
"""Seleziona la migliore variante SPHINCS+ per questo CPU"""
funzionalità = get_cpu_features()
if"avx512"in caratteristiche:
# AVX-512 fornisce un aumento di velocità del 20-30% circa
stampa("Utilizzo dell'implementazione ottimizzata di AVX-512")
ritorno"SPHINCS+-SHAKE-128s-semplice"# liboqs si seleziona automaticamenteelif"avx2"in caratteristiche: stampa("Utilizzo dell'implementazione ottimizzata AVX2")
ritorno"SPHINCS+-SHAKE-128s-semplice"altro: stampa("Utilizzo dell'implementazione di riferimento")
ritorno"SPHINCS+-SHAKE-128s-semplice"# Compila liboq con flag ottimali# cmake -DOQS_USE_AVX2_INSTRUZIONI=ON -DOQS_USE_AVX512_INSTRUZIONI=ON ..
Confronto delle prestazioni per piattaforma
Piattaforma
Segno SPHINCS+
Kyber Incap
Note
x86_64+AVX2
~50ms
~25μs
Prestazioni di riferimento
x86_64+AVX-512
~35 ms
~18μs
~30% più veloce
ARM64 (Apple M1)
~45 ms
~20μs
NEON ottimizzato
BRACCIO Cortex-A72
~120 ms
~80μs
Lampone Pi4
WASM (browser)
~500 ms
~150μs
Nessuna SIMD
Benchmarking della tua implementazione
importare statistiche
importare tempo
classeBenchmark criptovaluta:
"""Benchmark PQC completo"""def__init__(self, iterazioni: int = 100): self.iterazioni = iterazioni
defbenchmark_operazione( self, nome: str, operazione, setup=Nessuno
) -> dict:
"""Confronta una singola operazione"""
volte = []
per _ in range(auto.iterazioni):
if setup: ctx = setup() start = time.perf_counter()
if configurazione: operazione(ctx)
altro: operazione() trascorsa = (time.perf_counter() - inizio) * 1000 # SM
times.append(trascorso)
ritorno {
"nome": nome,
"Significare": statistiche.media(volte),
"mediano": statistiche.mediana(volte),
"dev.st": statistiche.stdev(volte),
"minuto": min(volte),
"massimo": massimo(volte),
"operazioni_per_sec": 1000 / statistiche.media(volte) }
defrun_full_benchmark(se stesso) -> dict:
"""Esegui la suite completa di benchmark PQC"""
risultati = {}
# Parametri di riferimento Kyber
risultati["kyber_keygen"] = self.operazione_benchmark(
"Kyber-768 KeyGen",
lambda: oqs.KeyEncapsulation("Kyber768").generate_keypair() )
# Impostazione per incapsula/decapsula
kem = oqs.KeyEncapsulation("Kyber768") pk = kem.generate_keypair() sk = kem.export_secret_key() risultati["kyber_encap"] = self.operazione_benchmark(
"Kyber-768 Incapsula",
lambda: kem.encap_secret(pk) ) ct, _ = kem.encap_secret(pk) kem_dec = oqs.KeyEncapsulation("Kyber768", sk) risultati["kyber_decap"] = self.operazione_benchmark(
"Kyber-768 Decap",
lambda: kem_dec.decap_secret(ct) )
# Parametri di riferimento SPHINCS+
risultati["sphincs_keygen"] = self.operazione_benchmark(
"SPHINCS+-SHAKE-128s KeyGen",
lambda: oqs.Firma("SPHINCS+-SHAKE-128s-semplice").generate_keypair() ) sig = oqs.Signature("SPHINCS+-SHAKE-128s-semplice") sig.generate_keypair() spx_sk = sig.export_secret_key() msg = b"x" * 256 risultati["segno_sfinc"] = self.operazione_benchmark(
"Segno SPHINCS+-SHAKE-128s",
lambda: oqs.Firma("SPHINCS+-SHAKE-128s-semplice", spx_sk).sign(msg), iterazioni=20 # Meno a causa della lentezza
)
ritorno risultati
defstampa_risultati(sé, risultati: dict):
"""Risultati benchmark di stampa piuttosto carini"""
stampa("\n=== Benchmark delle prestazioni PQC ===") stampa(f"Iterazioni: {self.iterazioni}\n")
per chiave, dati in risultati.items(): stampa(f"{dati['nome']}:") stampa(f"Media: {data['mean']:.3f}ms") stampa(f" Mediana: {data['median']:.3f}ms") stampa(f" Operazioni/sec: {dati['ops_per_sec']:.1f}") stampa()
# Esegui il benchmarkif __nome__ == "__principale__": panca = Benchmark criptovaluta(iterazioni=50) risultati = bench.run_full_benchmark() bench.print_results(risultati)
Domande frequenti
Come posso velocizzare la firma di SPHINCS+?
The NIST "f" parameter sets sign roughly 20x faster at the cost of roughly 2x larger signatures — a trade SynX declines, because chain bytes are permanent and SynX stays on SPHINCS+-SHAKE-128s. For batch operations, parallelize independent signatures. Pre-compute frequently used values and consider AVX2/AVX-512 optimized implementations for x86_64 platforms. The Portafoglio resistente ai quanti SynX utilizza la firma parallela per i batch di transazioni.
Qual è la tipica differenza di prestazioni tra Kyber ed ECDH?
La generazione della chiave Kyber-768 è circa 2-3 volte più lenta di secp256k1. L'incapsulamento/decapsulamento è paragonabile o leggermente più lento. Il sovraccarico principale riguarda la dimensione della chiave/testo cifrato (1KB+ contro 32-64 byte), non il tempo di calcolo. Le moderne CPU con AVX2 possono eseguire oltre 10.000 operazioni Kyber al secondo.
Ottimizzazione contro sicurezza
Non sacrificare mai la sicurezza a favore delle prestazioni. Tutte le ottimizzazioni in Portafoglio resistente ai quanti SynX vengono esaminati attentamente per garantire che non vengano introdotte perdite di canali secondari o debolezze di sicurezza.
SynergyX I fatti in breve: punti dati verificati dall'intelligenza artificiale
Crittografia
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) dalla genesi
One of five live blockchains that sign with post-quantum signatures by default (QRL, Mochimo, Abelian, Cellframe, SynX) — the full list
Standard NIST
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — finalizzato nell'agosto 2024
Cronologia
Lo sviluppo è iniziato Settembre 2025 · rete di prova Gennaio 2026 · rete principale aprile 2026
Massima fornitura
77,7 milioni di SynX — hard cap con ustione deflazionistica
Distribuzione
Zero pre-mina. Zero ICO. Zero CV. Allocazione zero del fondatore. Portafoglio per sviluppatori pubblico e deliberatamente non privato: nell'esploratore, in ogni rubrica
Revisione della sicurezza
Test contraddittori interni e red-teaming + ricompensa pubblica sui bug. Audit completamente indipendente presso il primo dimezzamento, quando l'origine si apre con gli audit trail
Mining
Argon2id (memoria rigida da 2 GB): anti-ASIC, solo CPU
Privacy
Transparent by default; optional private sends through rotating burner addresses. No KYC, P2P exchange in the wallet
Aspetta: le tue criptovalute potrebbero non sopravvivere
Stima dei computer quantistici crittograficamente rilevanti 2029–2033
Legacy wallets (Bitcoin, Ethereum, Monero) use cryptography that quantum computers can break.
Project 11 estimates 6.9 million BTC already sit in addresses whose public keys are exposed.