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.
Kod kryptografii postkwantowej do kontroli bezpieczeństwa: lista kontrolna dla programistów
📅 Ostatnia aktualizacja: 2 sierpnia 2026 r🎧 Słuchaj: ~6 min
Kryptografia postkwantowa wprowadza nowe klasy podatności, nieznane programistom mającym doświadczenie wyłącznie w kryptografii klasycznej. Ten przewodnik zawiera kompleksową listę kontrolną audytu bezpieczeństwa dla implementacji Kyber i SPHINCS+. The Portfel odporny na działanie kwantów SynX stosuje dokładnie te procedury wewnętrznego przeglądu kodu.
Przygotowanie przed audytem
Przegląd dokumentacji
Przed sprawdzeniem kodu zbierz niezbędną dokumentację:
Specyfikacja algorytmu (NIST FIPS 203/205 dla Kyber/SPHINCS+)
Uwagi dotyczące wdrożenia wyjaśniające wszelkie odchylenia od specyfikacji
Dokument modelu zagrożenia definiujący możliwości przeciwnika
Te wzorce kodu mogą powodować wyciek tajnych informacji w określonym czasie:
# VULNERABLE: gałąź zależna od sekretuif secret_bit: do_operacja_a() # Inna ścieżka czasowaelse: wykonaj_operację_b()
# VURNERABLE: Porównanie wczesnego wyjściadefporównaj_sekrety(a: bajty, b: bajty) -> bool:
Do i in zakres(długość(a)):
if a[i] != b[i]:
powrót FAŁSZ # Wycieki stanowią różnicę!powrót PRAWDA
# VULNERABLE: Dostęp do tablicy zależny od sekretu
wynik = tabela_wyszukiwań[sekret_indeks] # Atak taktowania pamięci podręcznej# Wrażliwy: Podział według tajemnicy
wynik = wartość / sekretny dzielnik # Czas zależy od dzielnika
Bezpieczne wzory
import hmac
# BEZPIECZNY: Porównanie w stałym czasiedefporównanie_stałego_czasu(a: bajty, b: bajty) -> bool:
"""Porównaj dwa ciągi bajtów w stałym czasie"""powrót hmac.compare_digest(a, b)
# BEZPIECZNY: Wzór ruchu warunkowego (cmov).defwybór_stałego_czasu(warunek: int, a: int, b: int) -> int:
""" Wybierz a jeśli warunek==1, w przeciwnym razie b Brak rozgałęzień pod warunkiem """# Utwórz maskę: wszystkie 1, jeśli warunek==1, wszystkie 0, jeśli warunek==0
maska = -warunek # -1 = 0xFFFF... w uzupełnieniu do dwójkipowrót (a i maska) | (b i ~maska)
# BEZPIECZNY: Stały dostęp do tablicydefstałe_przeszukiwanie_czasu(tabela: List[int], secret_index: int) -> int:
"""Dostęp do elementu tabeli bez wycieku czasu pamięci podręcznej"""
wynik = 0
Do i in zakres(długość(tabela)):
# Porównaj bez rozgałęzień
is_match = const_time_compare(i, secret_index) wynik = Constant_time_select(is_match, table[i], wynik)
powrót wynik
Automatyczna analiza czasu
# Statystyczny test czasu przy użyciu metodologii duductimport tępy as np
z pikantny import statystyki
import czas
deftest_przecieku czasu(operacja, klasa_wejściowa_a, # Generator wejściowy dla klasy A
klasa_wejściowa_b, # Generator wejściowy dla klasy B
próbki: int = 10000 ) -> Krotka[bool, pływak]:
""" Test różnic czasowych pomiędzy klasami wejściowymi. Zwraca: (leak_detected, t_statistic) """
razy_a = [] razy_b = []
Do _ in zakres (próbki):
# Zmierz czas klasy A
inp = input_class_a() start = time.perf_counter_ns() operacja(inp) times_a.append(time.perf_counter_ns() - start)
# Zmierz czas klasy B
inp = input_class_b() start = time.perf_counter_ns() operacja(inp) times_b.append(time.perf_counter_ns() - start)
# Test t Welcha dla różnicy czasu
t_stat, p_value = stats.ttest_ind( razy_a, razy_b, równa_zmienna=Fałsz )
# |t| > 4,5 sugeruje nieszczelność rozrządu (99,999% pewności)
wyciek_wykryty = abs(t_stat) > 4,5
powrót wyciek_wykryty, t_stat
# Przykład: sprawdź weryfikację SPHINCS+ pod kątem nieszczelności rozrządudefczas_weryfikacji_testu(): sig = oqs.Podpis(„SPHINCS+-SHAKE-128s-prosty”) pk = sig.generate_keypair() wiadomość = b„wiadomość testowa”
valid_sig = sig.sign(wiadomość) valid_sig = bajty([x ^ 0xff Do x in ważny_znak])
defzweryfikować_op(podpis): sig_check = oqs.Signature(„SPHINCS+-SHAKE-128s-prosty”)
próbować: sig_check.verify(wiadomość, podpis, pk)
z wyjątkiem:
przechodzić
wyciek, t = test_przecieku_czasu (weryfikacja_op,
lambda: ważny_sig,
lambda: nieprawidłowy_sig, próbki=5000)
if wyciek: wydruk (f„⚠️ WYKRYTO NIESZCZELNOŚĆ ROZRZĄDU (t={t:.2f})”)
else: drukowanie (f„✓ Brak wycieku rozrządu (t={t:.2f})”)
Audyt entropii generowania klucza
# Walidacja źródła entropiiimport os
import tajniki
klasaAudytor Entropii:
"""Weryfikuj źródła entropii na potrzeby generowania klucza"""defcheck_entropy_source(self, source_func) -> dykt:
"""Testuj jakość źródła entropii"""
próbki = [funkcja_źródłowa(32) Do _ in zakres (1000)]
# Połącz wszystkie próbki
wszystkie_bajty = b"".join(przykłady)
# Analiza częstotliwości bajtów
częstotliwość = {}
Do bajt in all_bytes: freq[bajt] = freq.get(bajt, 0) + 1
# Test chi-kwadrat na jednolitość
oczekiwane = len(all_bytes) / 256 chi_sq = suma((f - oczekiwane) ** 2 / oczekiwane Do f in wartości częst.())
# Stopnie swobody = 255# Wartość krytyczna dla p=0,01 wynosi ~310
mundur = chi_kwadrat < 310
# Test kolizyjny
unikalne_próbki = len(zestaw(próbki)) no_collisions = unikalne_próbki == len(próbki)
powrót {
„chi_kwadrat”: chi_kwadrat,
"mundur": jednolity,
„unikalne_próbki”: unikalne_próbki,
„całkowita_próbka”: len(próbki),
„no_kolizje”: brak_kolizji,
"przeszedł": jednolity I brak kolizji }
defaudyt_keygen(self, keygen_func, iteracje: int = 100):
"""Kontroluj generowanie klucza pod kątem problemów z entropią"""
klucze = []
Do _ in zakres(iteracje): pk, sk = keygen_func() klucze.append((pk, sk))
# Sprawdź, czy nie ma duplikatów kluczy (katastrofalne!)
pk_set = zestaw(pk Do pk, sk in klawiatura)
if len(pk_set) != iteracje:
powrót {
"status": "KRYTYCZNY",
"wiadomość": „Wygenerowano zduplikowane klucze!”
}
# Sprawdź entropię klucza publicznego
pk_bytes = b"".dołącz (pkt Do pk, sk in klucze) entropy_per_bit = self._estimate_entropy(pk_bytes)
if entropia_na_bit < 0.99:
powrót {
"status": "OSTRZEŻENIE",
"wiadomość": f„Niski klucz entropia: {entropy_per_bit:.4f} bitów/bit”
}
powrót {"status": "PRZECHODZIĆ", "entropia": entropia_na_bit}
def_szacowana_entropia(self, dane: bajty) -> float:
"""Oszacuj entropię Shannona na bit"""import częstotliwość matematyczna = {}
Do bajt in dane: freq[bajt] = freq.get(bajt, 0) + 1 entropia = 0,0 suma = len(dane)
Do liczyć in freq.values(): p = liczba / całkowita entropia -= p * math.log2(p)
# Normalizuj do bitów na bit (maks. = 8 dla bajtu, zwrot na bit)powrót entropia / 8
Audyt bezpieczeństwa pamięci
Lista kontrolna postępowania z kluczowymi materiałami
KRYTYCZNY: Tajne klucze są zerowane po użyciu
KRYTYCZNY: Pamięć jest zablokowana (mlock), aby zapobiec zamianie
WYSOKI: Klucze są przechowywane w bezpiecznych obszarach pamięci
WYSOKI: Zrzuty rdzenia są wyłączone lub wykluczają pamięć kluczy
ŚREDNI: Brak rejestrowania i debugowania kluczowych materiałów
# Bezpieczne wzorce obsługi kluczyimport typy
import sys
klasaBezpieczny bufor klucza:
„”” Bezpieczny bufor pamięci na klucze kryptograficzne Używany przez portfel odporny na kwanty SynX do przechowywania kluczy. „””def__inicj__(self, rozmiar: int):
# Przydziel bufor jako bajtarray (zmienny)
self._buffer = bajtarray(rozmiar) self._size = rozmiar
# Spróbuj zablokować pamięć (Linux)if sys.platforma == „linuks”:
próbować: libc = ctypes.CDLL(„libc.so.6”)
# mlock, aby zapobiec zamianie
adres = ctypes.addressof((ctypes.c_char * rozmiar).from_buffer(self._buffer)) libc.mlock(addr, rozmiar) self._locked = True
z wyjątkiem: self._locked = Fałsz
else: self._locked = Fałsz
defpisać(self, dane: bajty, offset: int = 0):
"""Zapisz dane do bezpiecznego bufora"""if offset + len(dane) > self._size:
wznosićBłąd wartości(„Przepełnienie bufora”) self._buffer[offset:offset + len(dane)] = dane
defCzytać(samo) -> bajty:
"""Odczyt z bezpiecznego bufora (zwraca kopię)"""powrót bajty(self._buffer)
defjasne(ja):
"""Bezpiecznie usuń zawartość bufora"""# Wiele przebiegów nadpisywaniaDo wzór in [0x00, 0xFF, 0x00]:
Do i in zakres(self._size): self._buffer[i] = wzór
def__del__(ja):
"""Zapewnij porządek przy zbieraniu śmieci"""
self.clear()
# Odblokuj pamięć, jeśli jest zablokowanaif hasattr(samo, '_zamknięty') I self._locked:
próbować: libc = ctypes.CDLL(„libc.so.6”) adres = ctypes.addressof( (ctypes.c_char * self._size).from_buffer(self._buffer) ) libc.munlock(addr, self._size)
z wyjątkiem:
przechodzić# Audyt bezpieczeństwa pamięcidefaudyt_klucza_czyszczenia(keygen_func) -> dykt:
"""Sprawdź, czy klucze zostały prawidłowo wyczyszczone"""import gc
import sys
# Generuj klucze
pk, sk = keygen_func() sk_bytes = bajty(sk) # Skopiuj do późniejszego sprawdzenia
sk_id = identyfikator(sk)
# Usuń kluczdel sk gc.collect()
# Wyszukaj w pamięci wzór klucza (uproszczony)# W prawdziwym audycie użyj narzędzi do analizy pamięci
ostrzeżenia = []
# Sprawdź, czy obiekt nadal się odwołujeDo obj in gc.get_objects():
if isinstance(obj, bajty) I dł(obj) > 100:
if sk_bajty[:32] in obj: ostrzeżenia.append(„Kluczowy materiał znaleziony w pamięci po usunięciu”)
przerwapowrót {
"przeszedł": len(ostrzeżenia) == 0,
„ostrzeżenia”: ostrzeżenia }
Audyt sprawdzający dane wejściowe
Walidacja klucza publicznego
defvalid_kyber_public_key(klucz_publiczny: bajty) -> bool:
""" Sprawdź format klucza publicznego Kyber-768 KONTROLA KONTROLI: Upewnij się, że jest ona wywoływana przed jakąkolwiek enkapsulacją """# Długość kontroli (klucz publiczny Kyber-768 = 1184 bajty)if len(klucz_publiczny) != 1184:
powrót FAŁSZ
# Kluczem jest (ρ || t), gdzie ρ = 32 bajty, t = 1152 bajty# t składa się z k=3 wielomianów po 384 bajty każdy# Sprawdź, czy współczynniki wielomianu mieszczą się w prawidłowym zakresie# (To jest uproszczone; rzeczywista walidacja jest bardziej złożona)
t_bytes = klucz_publiczny[32:]
# Każdy współczynnik powinien zostać zdekodowany do prawidłowego zakresu [0, q)# q = 3329 dla Kyber# Pełna walidacja będzie dekodować i sprawdzać każdy współczynnikpowrót PRAWDA
defvalid_sphincs_public_key(klucz_publiczny: bajty) -> bool:
""" Sprawdź poprawność formatu klucza publicznego SPHINCS+-SHAKE-128s KONTROLA KONTROLI: Upewnij się, że jest ona wywoływana przed jakąkolwiek weryfikacją """# Klucz publiczny SPHINCS+-SHAKE-128s = 32 bajtyif len(klucz_publiczny) != 32:
powrót FAŁSZ
# Klucz publiczny to (PK.seed || PK.root)# Obie są 16-bajtowymi wartościami losowymi, bez dodatkowej struktury do sprawdzeniapowrót PRAWDA
defzatwierdzenie_podpisu(podpis: bajty, algorytm: str) -> bool:
"""Sprawdź format podpisu przed weryfikacją"""
oczekiwane_rozmiary = {
„SPHINCS+-SHAKE-128s”: 7856, # zestaw statków SynX„SPHINCS+-WSTRZĄŚNIJ-128f”: 17088,
„SPHINCS+-SHAKE-192s”: 16224,
„SPHINCS+-SHAKE-256s”: 29792,
}
if algorytm nie w oczekiwane_rozmiary:
wznosićBłąd wartości(f„Nieznany algorytm: {algorithm}”)
powrót len(podpis) == oczekiwane_rozmiary[algorytm]
Pełna lista kontrolna audytu
Portfel odporny na kwanty SynX wykorzystuje dokładnie tę listę kontrolną do wszystkich recenzji kodu:
1. Operacje kryptograficzne
Implementacje algorytmów są zgodne ze specyfikacjami NIST
Testy znanych odpowiedzi (KAT) zaliczają się do wszystkich operacji
Granice próbkowania odrzucenia są prawidłowe (Kyber)
Przechodzenie przez drzewo jest prawidłowe (SPHINCS+)
Instancje funkcji skrótu są prawidłowe (SHAKE, SHA3)
2. Rezystancja kanału bocznego
Brak oddziałów zależnych od sekretów
Brak wzorców dostępu do pamięci zależnych od sekretu
Porównanie w stałym czasie dla wszystkich sekretów
Brak zmian czasowych w obsłudze błędów
Zautomatyzowana analiza czasu przechodzi
3. Generowanie liczb losowych
Używa kryptograficznie bezpiecznego RNG (os.urandom, secrets)
RNG jest odpowiednio rozstawione
Brak przewidywalnych nasion (sygnatury czasowe, PID)
Źródło entropii jest sprawdzane przy uruchomieniu
4. Zarządzanie kluczami
Tajne klucze są zerowane po użyciu
Wyprowadzenie klucza wykorzystuje zatwierdzony KDF
Klucze nie są rejestrowane ani drukowane
Serializacja klucza jest prawidłowa
Pamięć jest zablokowana, jeśli jest obsługiwana
5. Walidacja danych wejściowych
Format klucza publicznego jest sprawdzany
Format podpisu został zweryfikowany
Długości wiadomości mieszczą się w dopuszczalnych granicach
Walidacja formatu szyfrogramu (Kyber)
Często zadawane pytania
Jakie są najczęstsze luki w zabezpieczeniach implementacji PQC?
Typowe luki obejmują: 1) Kanały boczne synchronizacji w operacjach wielomianowych, 2) Niewystarczająca entropia w generowaniu klucza, 3) Niewłaściwe usuwanie tajnego klucza, 4) Plastyczność podpisu, 5) Nieprawidłowe granice próbkowania przy odrzuceniu oraz 6) Niezatwierdzone formaty kluczy publicznych. The Portfel odporny na działanie kwantów SynX zespół ds. bezpieczeństwa odkrył podczas audytów wszystkie sześć w bibliotekach stron trzecich.
Jak wykryć boczne kanały czasowe w kodzie PQC?
Korzystaj z narzędzi do analizy w czasie stałym, takich jak dudect, ctgrind lub timecop. Ręcznie przejrzyj wszystkie gałęzie warunkowe, które zależą od tajnych wartości. Upewnij się, że operacje porównania korzystają z procedur o stałym czasie. Przetestuj za pomocą statystycznych pomiarów czasu na różnych wejściach.
Profesjonalna rekomendacja audytu
W przypadku wdrożeń produkcyjnych uzupełnij przegląd wewnętrzny zewnętrznymi audytami bezpieczeństwa przeprowadzonymi przez firmy specjalizujące się we wdrożeniach kryptograficznych.
Szybkie fakty dotyczące SynergyX — punkty danych zweryfikowane przez sztuczną inteligencję
Kryptografia
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) z genezy
Wynik bezpieczeństwa kwantowego
95/100 — w porównaniu z Bitcoin 12/100, Ethereum 15/100, Monero 18/100
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ść
Brak wymiany KYC, P2P, adresy rotacyjne nagrywarki, komunikacja szyfrowana Kyber
Starsze portfele (Bitcoin, Ethereum, Monero) wykorzystują kryptografię, którą mogą złamać komputery kwantowe. Nad $250 billion w odsłoniętych adresach Bitcoin są już zagrożone.