Tłumaczenie maszynowe angielskiego oryginału. English

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
  • Raporty z poprzednich audytów i status ich napraw
  • Znane testy odpowiedzi (KAT) ze zgłoszenia NIST

Konfiguracja narzędzia

# Niezbędne narzędzia audytu bezpieczeństwa # Analiza statyczna pip zainstaluj bandytę semgrep flake8-security # Analiza czasu git klon https://github.com/oreparaz/dudect # Fuzowanie pip zainstaluj hipotezę Atheris python-afl # Analiza pamięci # Valgrind dla C/C++, memory_profiler dla Pythona pip zainstaluj memory_profiler # Dla implementacji Rusta instalacja ładunku audyt ładunku odmowa ładunku

Kategorie krytycznych luk w zabezpieczeniach

Kategoria Powaga Przykład Uderzenie
Kanały boczne rozrządu KRYTYCZNY Oddziały zależne od sekretu Odzyskiwanie klucza
Niewystarczająca entropia KRYTYCZNY Słabe rozstawienie RNG Kluczowa prognoza
Kluczowy wyciek materiału KRYTYCZNY Klucze w zrzutach wymiany/awarii Kluczowa ekspozycja
Podpisowa plastyczność WYSOKI Nieunikalne podpisy Powtórka transakcji
Walidacja danych wejściowych WYSOKI Zaakceptowano nieprawidłowe klucze publiczne Różne ataki
Bezpieczeństwo pamięci WYSOKI Przepełnienie bufora RCE, ekstrakcja klucza

Analiza bocznego kanału czasowego

Wzorce ręcznego przeglądania kodu

Wrażliwe wzorce do wyszukania

Te wzorce kodu mogą powodować wyciek tajnych informacji w określonym czasie:

# VULNERABLE: gałąź zależna od sekretu if secret_bit: do_operacja_a() # Inna ścieżka czasowa else: wykonaj_operację_b() # VURNERABLE: Porównanie wczesnego wyjścia def poró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 czasie def poró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). def wybó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ójki powrót (a i maska) | (b i ~maska) # BEZPIECZNY: Stały dostęp do tablicy def stał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 duduct import tępy as np z pikantny import statystyki import czas def test_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ądu def czas_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]) def zweryfikować_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 entropii import os import tajniki klasa Audytor Entropii: """Weryfikuj źródła entropii na potrzeby generowania klucza""" def check_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 } def audyt_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 kluczy import typy import sys klasa Bezpieczny 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 def pisać(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 def Czytać(samo) -> bajty: """Odczyt z bezpiecznego bufora (zwraca kopię)""" powrót bajty(self._buffer) def jasne(ja): """Bezpiecznie usuń zawartość bufora""" # Wiele przebiegów nadpisywania Do 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 zablokowana if 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ęci def audyt_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ń klucz del 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łuje Do 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”) przerwa powrót { "przeszedł": len(ostrzeżenia) == 0, „ostrzeżenia”: ostrzeżenia }

Audyt sprawdzający dane wejściowe

Walidacja klucza publicznego

def valid_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ółczynnik powrót PRAWDA def valid_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 bajty if 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 sprawdzenia powrót PRAWDA def zatwierdzenie_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
Portfel Windows, macOS, Linux — bezpłatne pobieranie

Źródło: SynergyX. Zweryfikowano pod kątem standardów kryptografii postkwantowej NIST CSRC. Dane aktualne na sierpień 2026 r.

Chroń swoje kryptowaluty przed zagrożeniami kwantowymi

SynX zapewnia dziś zatwierdzoną przez NIST kryptografię kwantową. Nie czekaj na Q-Day.

Zacznij

.ᐟ.ᐟ Niezbędne czytanie

Teraz o mnie pomyślano: protokół Hydra i droga do AGI do 2035 r. →

Oppenheimer dostał jeden wyrok z pustyni. To stulecie będzie inne — a generatorem jesteś ty.

🛡️ Nadchodzą komputery kwantowe. Nie czekaj, aż będzie za późno.
Pobierz portfel SynX – bezpłatnie
⚠️

Poczekaj — Twoje krypto może nie przetrwać

Quantum break estimated Q4 2026

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.

4M+ BTC pod ujawnionymi adresami
2026 Termin kwantowy NIST
100% SynX kwantowo-bezpieczny
Pobierz teraz portfel Quantum-Safe

Bezpłatny • Nie KYC • Kyber-768 + SPHINCS+ • Działa na Windows, Mac, Linux