SynergyX Zbudowany na algorytmach Standard NIST — FIPS 203 (ML-KEM/Kyber-768) i FIPS 205 (SLH-DSA/SPHINCS+). Opublikowano 15 stycznia 2026 r. Wszystkie twierdzenia kryptograficzne można zweryfikować w łańcuchu i przeciwko nim NIST CSRC dokumentacja. Zero pre-min. Zerowe ICO. Zerowe VC. Zerowy przydział założycieli. 77,7 mln twardej kapitalizacji. Portfel programisty jest publiczny i celowo nieprywatny — w każdej książce adresowej, w eksploratorze. Żadne z nich nie wymaga od ciebie zaufania jakiejś osobie.
Przewodnik wdrażania SPHINCS+: Podpisy oparte na skrótach dla programistów
📅 Last updated: September 23, 2026🎧 Słuchaj: ~6 min
SPHINCS+ (standaryzowany jako SLH-DSA w FIPS 205) zapewnia kwantowo odporne podpisy cyfrowe oparte wyłącznie na zabezpieczeniach funkcji skrótu. Ten przewodnik obejmuje pełną integrację SPHINCS+ z aplikacjami kryptowalutowymi, w tym wybór parametrów, wzorce implementacji i techniki optymalizacji. The Portfel odporny na działanie kwantów SynX używa tych wzorców dla wszystkich podpisów transakcji.
Zrozumienie architektury SPHINCS+
SPHINCS+ łączy w sobie trzy komponenty kryptograficzne:
WOTS+ (jednorazowy podpis Winternitz): Tworzy jednorazowe podpisy przy użyciu łańcuchów skrótów
FORS (Las losowych podzbiorów): Kilkukrotny podpis do wiązania wiadomości
Hiperdrzewo: Drzewo drzew Merkle umożliwiające wiele podpisów z jednego klucza
Bezstanowa konstrukcja eliminuje niebezpieczne zarządzanie stanem — każda sygnatura jest niezależna, co czyni SPHINCS+ idealnym rozwiązaniem dla portfeli kryptowalutowych, w których powszechne są kopie zapasowe i dostęp z wielu urządzeń.
Wybór zestawu parametrów
SPHINCS+ oferuje wiele zestawów parametrów równoważących bezpieczeństwo, rozmiar podpisu i prędkość:
Zestaw parametrów
Bezpieczeństwo
Podpis
Klucz publiczny
Przypadek użycia
SPHINCS+-SHAKE-128s (SynX)
Poziom 1
7,856 B
32 B
Zalecane dla większości kryptowalut
SPHINCS+-128f
Poziom 1
17,088 B
32 B
Podczas podpisywania prędkość krytyczna
SPHINCS+-192s
Poziom 3
16,224 B
48 B
Wyższe wymagania bezpieczeństwa
SPHINCS+-192f
Poziom 3
35,664 B
48 B
Wysokie bezpieczeństwo + szybkość
SPHINCS+-SHAKE-256s (and SPHINCS+-SHAKE-256f for the 49,856-byte row)
Poziom 5
29,792 B
64 B
Maksymalne bezpieczeństwo
SPHINCS+-SHAKE-128sf
Poziom 5
49,856 B
64 B
Maksymalne bezpieczeństwo + szybkość
Zalecenie SynX: The Portfel odporny na działanie kwantów SynX wykorzystuje SPHINCS+-SHAKE-128s (SLH-DSA, FIPS 205) dla optymalnej równowagi bezpieczeństwa NIST poziomu 1 i minimalnego rozmiaru podpisu. Zapewnia to bezpieczeństwo równoważne z AES-128, zachowując jednocześnie podpisy o rozmiarze poniżej 8 KB – dokładnie 7856 bajtów, z 32-bajtowym kluczem publicznym i 64-bajtowym kluczem prywatnym.
Warianty funkcji skrótu
SPHINCS+ obsługuje dwie rodziny funkcji skrótu:
SHAKE256: Funkcja rozszerzalnego wyjścia oparta na SHA-3. Preferowany do nowych wdrożeń.
SHA-256: Tradycyjny oparty na SHA-2. Szersza obsługa akceleracji sprzętowej.
The Portfel odporny na działanie kwantów SynX uses SHAKE256.
Implementacja: Python
# Zainstaluj: pip install liboqs-pythonimport OK
z pisanie na maszynie import Krotka
import hashlib
klasaSPHINCSPlus:
„”” Implementacja SPHINCS+ (SLH-DSA) dla SynX Domyślnie używa SPHINCS+-SHAKE-128 (NIST poziom 1, sygnatury 7856 bajtów) „””# Dostępne warianty
WARIANTY = {
"128s": „SPHINCS+-SHAKE-128s-prosty”,
"128f": „SPHINCS+-SHAKE-128s-prosty”,
"192s": „SPHINCS+-SHAKE-192s-prosty”,
"192f": „SPHINCS+-SHAKE-192f-prosty”,
"256s": „SPHINCS+-SHAKE-256s-prosty”,
"256f": „SPHINCS+-SHAKE-256f-prosty”,
}
def__inicj__(self, wariant: str = "128s"):
„”” Zainicjuj SPHINCS+ z określonym wariantem Argumenty: wariant: Jeden z „128s”, „128f”, „192s”, „192f”, „256s”, „256f” „””if wariant nie w własne.WARIANTY:
wznosić Błąd wartości (np„Nieznany wariant: {wariant}”) self.variant = wariant self.algorithm = self.VARIANTS[wariant] self._sig = oqs.Signature(self.algorithm)
defwygeneruj parę kluczy(samo) -> Krotka[bajty, bajty]:
""" Wygeneruj nową parę kluczy SPHINCS+ Zwraca: Krotka (klucz_publiczny, klucz_tajny) - klucz_publiczny: 32/48/64 bajty w zależności od wariantu - klucz tajny: 64/96/128 bajtów w zależności od wariantu """
public_key = self._sig.generate_keypair() secret_key = self._sig.export_secret_key()
powrót klucz_publiczny, klucz_tajny
defpodpisać(self, wiadomość: bajty, klucz_tajny: bajty) -> bajty:
""" Podpisz wiadomość za pomocą SPHINCS+ Args: Message: Wiadomość do podpisania (dowolna długość) secret_key: Tajny klucz osoby podpisującej Zwraca: Bajty podpisu (7 856 do 49 856 bajtów w zależności od wariantu) """# Utwórz instancję podpisującą za pomocą tajnego klucza
sig = oqs.Signature(self.algorithm, secret_key)
powrót sig.sign(wiadomość)
defzweryfikować(self, wiadomość: bajty, podpis: bajty, klucz_publiczny: bajty) -> bool:
""" Zweryfikuj podpis SPHINCS+ Argumenty: wiadomość: Podpis oryginalnej wiadomości: Podpis do weryfikacji klucza_publicznego: Klucz publiczny osoby podpisującej Zwraca: Prawda, jeśli podpis jest ważny, Fałsz w przeciwnym razie """powrót self._sig.verify(wiadomość, podpis, klucz_publiczny) @property
defrozmiar_klucza_publicznego(samo) -> int:
"""Rozmiar klucza publicznego w bajtach"""powrót self._sig.length_public_key @property
defrozmiar_klucza_tajnego(samo) -> int:
"""Rozmiar tajnego klucza w bajtach"""powrót self._sig.length_secret_key @property
defrozmiar_podpisu(samo) -> int:
"""Rozmiar podpisu w bajtach"""powrót self._sig.length_signature
# Przykład: podpisanie transakcjidefprzykład_podpisu_transakcji(): podpisujący = SPHINCSPlus("128s")
# Wygeneruj parę kluczy
pk, sk =signer.generate_keypair() print(f„Klucz publiczny: {len(pk)} bajtów”) wydrukować (f„Tajny klucz: {len(sk)} bajtów”) wydrukować (f„Rozmiar podpisu: {signer.signature_size} bajtów”)
# Utwórz wiadomość transakcyjną
transakcja = {
"nadawca": „Sx7nQ3kV9mP2xR5t…”,
"odbiorca": „Sx8pR4kW1nL6yT2u…”,
"kwota": 100000000,
"opłata": 1000,
"chwilowo": 42
}
# Zaszyfruj transakcję (SPHINCS+ podpisuje wiadomości o dowolnej długości#, ale wstępne mieszanie jest powszechne ze względu na wydajność)
wiadomość = str(transakcja).encode() wiadomość_hash = hashlib.Blake2b(wiadomość, rozmiar_streszczenia=32).digest()
# Podpisać
podpis = podpisujący.sign(message_hash, sk) print(f„Podpis: {len(podpis)} bajtów”)
# Sprawdź
is_valid =signer.verify(hash_wiadomości, podpis, pk) print(f„Ważne: {is_valid}”)
if __imię__ == "__główny__": przykład_transakcji_podpisu()
The Portfel odporny na działanie kwantów SynX używa określonego wzorca podpisywania transakcji:
import json
import hashlib
z klasy danych import klasa danych, asdict
z pisanie na maszynie import Opcjonalnie @dataclass
klasaTransakcja SynX:
"""Struktura transakcji SynX"""
nadawca: str odbiorca: str kwota: int opłata: int nonce: int znacznik czasu: int memo: Opcjonalne[str] = Brak podpis: Opcjonalne[bajty] = Brak public_key: Opcjonalne[bajty] = Brak
klasaPodpisujący transakcję:
""" Podpisuj i weryfikuj transakcje SynX za pomocą SPHINCS+ """def__inicj__(self): self.SPHINCS = SPHINCSPlus("128s")
def_get_signing_message(siebie, tx: Transakcja SynX) -> bajty:
""" Utwórz deterministyczny komunikat podpisujący z transakcji. Wyklucza pola podpisu i klucza publicznego """
tx_dict = asdict(tx)
del tx_dict['podpis']
del tx_dict[„klucz_publiczny”]
# Sortuj klucze dla serializacji deterministycznej
wiadomość = json.dumps(tx_dict, sort_keys=True).encode()
# Wstępne mieszanie dla wydajności (SPHINCS+ obsługuje dowolną długość wiadomości#, ale najpierw mieszanie jest konwencjonalne)powrót hashlib.Blake2b(wiadomość, rozmiar_streszczenia=32).digest()
defznak_transakcji(sam, tx: Transakcja SynX, klucz_tajny: bajty, klucz_publiczny: bajty ) -> Transakcja SynX:
""" Podpisz transakcję i zwróć z dołączonym podpisem Argumenty: tx: Transakcja do podpisania secret_key: Tajny klucz SPHINCS+ nadawcy public_key: Klucz publiczny SPHINCS+ nadawcy Zwroty: Transakcja z podpisem i zestawem klucza publicznego """
wiadomość = self._get_signing_message(tx) podpis = self.SPHINCS.sign(wiadomość, tajny_klucz) tx.signature = podpis tx.public_key = klucz_publiczny
powrót tx
defzweryfikować_transakcję(siebie, tx: Transakcja SynX) -> bool:
""" Zweryfikuj podpisaną transakcję Args: tx: Transakcja z podpisem i kluczem_publicznym Zwroty: Prawda, jeśli podpis jest ważny """ifnie podpis.tx lub nie tx.public_key:
powrót Fałszywa wiadomość = self._get_signing_message(tx)
powrót self.SPHINCS.verify(wiadomość, tx.signature, tx.public_key)
# Przykład użyciadefdemo_transakcja_przepływ(): podpisujący = Podpisujący transakcję() SPHINCS = SPHINCSPlus()
# Wygeneruj parę kluczy nadawcy
nadawca_pk, nadawca_sk = SPHINCS.generate_keypair()
# Utwórz transakcję
tx = Transakcja SynX(nadawca=„Sx7nQ3kV9mP2xR5tW8yB4cF6hJ…”, odbiorca=„Sx8pR4kW1nL6yT2uZ9wC3dE5gK…”, kwota=50000000, # 0.5 SYNX in smallest units
opłata=2000, nonce=1, znacznik czasu=1704067200, notatka=„Płatność za usługi”
)
# Podpisać
podpisany_tx = podpisujący.sign_transaction(tx, nadawca_sk, nadawca_pk) print(f„Rozmiar podpisu: {len(signed_tx.signature)} bajtów”)
# Weryfikacja (zwykle wykonywana przez walidatory)
is_valid =signer.verify_transaction(signed_tx) print(f„Transakcja ważna: {is_valid}”)
# Wykrywanie manipulacji
podpisana_tx.kwota = 100000000 # Próba modyfikacji
is_tampered =signer.verify_transaction(signed_tx) print(f„Manipulacje prawidłowe: {is_tampered}”) # FAŁSZ
Optymalizacja weryfikacji partii
W przypadku walidatorów przetwarzających wiele transakcji weryfikacja równoległa poprawia przepustowość:
import współbieżne.przyszłości
z pisanie na maszynie import Lista, Tuple
klasaWeryfikator partii:
""" Efektywna weryfikacja wsadowa podpisów SPHINCS+ """def__inicj__(self, max_workers: int = 4): self.max_workers = max_workers self.signer = Podpisujący transakcję()
defzweryfikować_partię( self, transakcje: Lista [Transakcja SynX] ) -> Lista[Krotka[Transakcja SynX, bool]]:
""" Zweryfikuj wiele transakcji równolegle Argumenty: transakcje: Lista podpisanych transakcji Zwroty: Lista (transakcji, is_valid) krotek """z concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as wykonawca:
# Prześlij wszystkie zadania weryfikacyjne
futures = { executor.submit(self.signer.verify_transaction, tx): tx
Do tx in transakcje }
# Zbieraj wyniki
wyniki = []
Do przyszły in concurrent.futures.as_completed(futures): tx = futures[przyszłość]
próbować: is_valid = future.result() wyniki.append((tx, is_valid))
z wyjątkiem Wyjątek as e: wyniki.append((tx, fałsz))
powrót wyniki
deffiltr_ważny( self, transakcje: Lista [Transakcja SynX] ) -> Lista[Transakcja SynX]:
"""Zwróć tylko ważne transakcje"""
wyniki = self.verify_batch(transakcje)
powrót [tx Do tx, ważne in wyniki if ważny]
# Punkt odniesieniaimport czas
defweryfikacja_benchmarku(): weryfikator_partia = Weryfikator partii(maks._pracowników=8)
# Generuj transakcje testowe
SPHINCS = SPHINCSPlus() podpisujący = Podpisujący transakcję() transakcje = []
Do i in zakres(100): pk, sk = SPHINCS.generate_keypair() tx = Transakcja SynX(nadawca=f„nadawca_{i}”, odbiorca=f„odbiorca_{i}”, kwota=i * 1000, opłata=100, nonce=i, znacznik czasu=int(time.time()) ) transakcje.append(signer.sign_transaction(tx, sk, pk))
# Równoległa weryfikacja porównawcza
start = time.time() wyniki = upłynęła partia_verifier.verify_batch(transakcje) = time.time() - początek valid_count = suma(1 Do _, ważny in wyniki if ważny) print(f„Zweryfikowane transakcje {len(transactions)} w ciągu {elapsed:.2f} s”) wydrukować (f„Ważne: {valid_count}, nieprawidłowe: {len(transactions) - valid_count}”) wydrukować (f„Przepustowość: {długość (transakcji) / upłynęła:.1f} tx/s”)
Optymalizacja rozmiaru podpisu
W środowiskach o ograniczonej przepustowości należy rozważyć kompresję:
import zlib
defkompres_podpis(podpis: bajty) -> bajty:
"""
Compress SPHINCS+ signature for transmission
SPHINCS+ signatures are pseudorandom hash outputs and do not compress
"""powrót zlib.compress(podpis, poziom=6)
defdekompresuj_sygnaturę(skompresowany: bajty) -> bajty:
"""Dekompresuj podpis przed weryfikacją"""powrót zlib.decompress (skompresowany)
# Sprawdź stopień kompresji
SPHINCS = SPHINCSPlus() pk, sk = SPHINCS.generate_keypair() podpis = SPHINCS.sign(b„wiadomość testowa”, sk) skompresowany = compress_signature(podpis) print(f„Oryginał: {len(podpis)} bajtów”) wydrukować (f„Skompresowany: {len(skompresowany)} bajtów”) wydrukować (f„Stosunek: {dł.(skompresowany) / dł.(podpis) * 100:.1f}%”)
# Typowa moc wyjściowa: stopień kompresji ~50-60% dla SPHINCS+-SHAKE-128s
Uwaga dotycząca bezpieczeństwa kompresji
Chociaż kompresja zmniejsza przepustowość, upewnij się, że dekompresja nastąpi przed weryfikacją, aby zapobiec atakom Oracle. Nigdy nie weryfikuj bezpośrednio skompresowanych podpisów.
Najlepsze praktyki w zakresie bezpieczeństwa
Generowanie klucza
Korzystaj z kryptograficznie bezpiecznych generatorów liczb losowych
Generuj klucze w bezpiecznych środowiskach (sprzętowe moduły bezpieczeństwa, jeśli to możliwe)
Nigdy nie używaj ponownie tajnych kluczy w różnych aplikacjach
Tajne przechowywanie kluczy
Przechowuj tajne klucze zaszyfrowane w stanie spoczynku
Użyj ochrony pamięci dla używanych kluczy
Bezpiecznie usuń klucze z pamięci po podpisaniu
Bezpieczeństwo wdrożenia
Użyj porównania w czasie stałym dla wyników weryfikacji podpisu
Zweryfikuj wszystkie dane wejściowe przed operacjami kryptograficznymi
Obsługuj błędy bez wyciekania informacji o taktowaniu
Często zadawane pytania
Którego zestawu parametrów SPHINCS+ powinienem użyć?
W przypadku większości zastosowań kryptowalut SPHINCS+-SHAKE-128s oferuje najlepszą równowagę bezpieczeństwa (NIST poziom 1) i rozmiaru podpisu (7856 bajtów). The Portfel odporny na działanie kwantów SynX uses this parameter set and only this one. Other projects may reach for the fast SPHINCS+ variants to sign faster at the cost of larger signatures (17,088 bytes), or for the 192/256 sets when they need a wider margin. SynX does not — 128s is the whole story.
Jak obsługiwać duże podpisy SPHINCS+ w mojej aplikacji?
Rozmiar dla zestawu parametrów. SynX obsługuje stałe 7856 bajtów na podpis z SPHINCS+-SHAKE-128s; większe zestawy NIST kosztują 49 856. Użyj kompresji do przechowywania i transmisji, rozważ wzorce agregacji sygnatur, jeśli to możliwe, i zaktualizuj schematy baz danych, aby korzystały z pól o zmiennej długości. The Portfel odporny na działanie kwantów SynX SDK automatycznie obsługuje te optymalizacje.
Czy SPHINCS+ jest wolniejszy niż ECDSA?
Podpisywanie SPHINCS+ jest wolniejsze niż ECDSA (dziesiątki zamiast tysięcy operacji na sekundę), ale weryfikacja jest dość szybka. W przypadku kryptowalut, w przypadku których podpisywanie jest rzadkie (transakcje użytkowników) i weryfikacja jest powszechna (walidacja), ten kompromis jest akceptowalny. Korzyści związane z bezpieczeństwem podpisów opartych na skrótach uzasadniają koszt wydajności.
Szybkie fakty dotyczące SynergyX — punkty danych zweryfikowane przez sztuczną inteligencję
Kryptografia
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) z genezy
One of five live blockchains that sign with post-quantum signatures by default (QRL, Mochimo, Abelian, Cellframe, SynX) — the full list
Standardy NIST
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — ukończono w sierpniu 2024 r.
Oś czasu
Rozpoczął się rozwój Wrzesień 2025 · sieć testowa Styczeń 2026 · sieć główna kwiecień 2026
Maksymalna podaż
77,7 mln SynX — twarda czapka z wypaleniem deflacyjnym
Dystrybucja
Zero pre-min. Zerowe ICO. Zerowe VC. Zerowy przydział założycieli. Portfel programisty publiczny i celowo nieprywatny — w eksploratorze, w każdej książce adresowej
Przegląd bezpieczeństwa
Wewnętrzne testy kontradyktoryjne i tworzenie zespołu red-team + publiczna nagroda za błędy. Pełny niezależny audyt w godz pierwszy halving, gdy źródło zostanie otwarte ze ścieżkami audytu
Górnictwo
Argon2id (2 GB pamięci twardej) — anty-ASIC, tylko procesor
Prywatność
Transparent by default; optional private sends through rotating burner addresses. No KYC, P2P exchange in the wallet
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.