Maskinöversättning av det engelska originalet. English

Testa postkvantkrypteringsimplementeringar: Utvecklarguide

📅 Senast uppdaterad: 2 augusti 2026 🎧 Lyssna: ~6 min

Kryptografisk kod kräver rigorösa tester – buggar kan vara katastrofala. Postkvantimplementeringar lägger till komplexitet med större nyckelstorlekar och nya matematiska operationer. Den här guiden täcker teststrategier för Kyber- och SPHINCS+-implementeringar, från enhetstester till fuzzing. De SynX kvantbeständig plånbok använder alla dessa tekniker för att säkerställa kryptografisk korrekthet.

Översikt över teststrategi

En omfattande PQC-teststrategi inkluderar:

  • Kända svarstester (KAT): Verifiera mot officiella NIST-testvektorer
  • Enhetstest: Testa enskilda funktioner isolerat
  • Tester tur och retur: Verifiera kryptera→ dekryptera och signera→ verifiera cykler
  • Edge Case Tester: Tomma meddelanden, maximala storlekar, felaktiga ingångar
  • Korsimplementeringstester: Verifiera interoperabilitet med andra bibliotek
  • Fuzzing: Upptäck krascher och oväntat beteende
  • Sidokanaltest: Verifiera konstanttidsutförande

Konfigurera testmiljön

# requirements.txt för PQC-testning pytest>=7.0.0 pytest-xdist>=3.0.0 # Parallell testkörning pytest-cov>=4.0.0 # Täckningsrapportering hypotes>=6.0.0 # Fastighetsbaserad testning liboqs-python>=0.9.0 # PQC-algoritmer pycryptodome>=3.19.0 # Ytterligare kryptoverktyg
# conftest.py - Pytest-konfiguration importera pytest importera oqs @pytest.fixture def kyber_kem(): """Fixtur som tillhandahåller Kyber-768 KEM-instans""" återvända oqs.KeyEncapsulation("Kyber768") @pytest.fixture def sphincs_sig(): """Fixtur som ger SPHINCS+-SHAKE-128s signaturinstans""" återvända oqs.Signature("SPHINCS+-SHAKE-128s-enkel") @pytest.fixture def kyber_keypair(kyber_kem): """Förgenererat Kyber-nyckelpar för tester""" pk = kyber_kem.generate_keypair() sk = kyber_kem.export_secret_key() återvända pk, sk @pytest.fixture def sphincs_keypair(sfincs_sig): """Förgenererat SPHINCS+-nyckelpar för tester""" pk = sphincs_sig.generate_keypair() sk = sphincs_sig.export_secret_key() återvända pk, sk

Kända svarstester (KAT)

KAT:er verifierar att din implementering ger förväntade utdata för kända ingångar:

# test_kats.py - Kända svarstester importera pytest importera json från pathlib importera Väg klass TestKyberKAT: """ Kända svarstester för Kyber-768-testvektorer från NIST ML-KEM-specifikationen """ @pytest.fixture def kat_vektorer(själv): """Ladda in officiella KAT-vektorer""" kat_path = Path(__file__).parent / "vektorer" / "kyber768_kat.json" med öppen(kat_sökväg) as f: återvända json.load(f) def test_encapsulation_kat(self, kat_vectors, kyber_kem): """Verifiera att inkapsling producerar förväntad chiffertext""" för vektor in kat_vektorer["inkapsling"]: pk = bytes.fromhex(vektor["public_key"]) förväntad_ct = bytes.fromhex(vektor["chiffertext"]) förväntad_ss = bytes.fromhex(vektor["delad_hemlighet"]) seed = bytes.fromhex(vector["utsäde"]) # Notera: Deterministisk inkapsling kräver modifierat bibliotek # Detta testar referensimplementeringsmönstret ct, ss = kyber_kem.encap_secret(pk) # Verifiera chiffertextens längd hävda len(ct) == len(expected_ct), "Skifttextens längd matchar inte" # Verifiera den delade hemliga längden hävda len(ss) == len(expected_ss), "Delad hemlig längd missmatchar" def test_decapsulation_kat(self, kat_vectors, kyber_kem): """Verifiera att dekapsling återställer förväntad delad hemlighet""" för vektor in kat_vektorer["avkapsling"]: sk = bytes.fromhex(vektor["hemlig nyckel"]) ct = bytes.fromhex(vektor["chiffertext"]) förväntad_ss = bytes.fromhex(vektor["delad_hemlighet"]) kem = oqs.KeyEncapsulation("Kyber768", sk) ss = kem.decap_secret(ct) hävda ss == förväntad_ss, "Delad hemlig missmatchning" klass TestSPHINCSPlusKAT: """Kända svarstester för SPHINCS+-SHAKE-128s""" @pytest.fixture def kat_vektorer(själv): kat_path = Path(__file__).parent / "vektorer" / "sphincs128s_kat.json" med öppen(kat_sökväg) as f: återvända json.load(f) def test_signature_verification_kat(själv, kat_vektorer): """Verifiera att kända signaturer valideras korrekt""" för vektor in kat_vektorer["kontroll"]: pk = bytes.fromhex(vektor["public_key"]) meddelande = bytes.fromhex(vektor["meddelande"]) signatur = bytes.fromhex(vektor["signatur"]) sig = oqs.Signatur("SPHINCS+-SHAKE-128s-enkel") is_valid = sig.verify(meddelande, signatur, pk) hävda är_giltig, f"KAT-signaturen kunde inte verifieras"

Tester tur och retur

Rundturstester verifierar den grundläggande korrektheten av kryptera/dekryptera och signera/verifiera:

# test_roundtrip.py importera pytest importera hemligheter klass TestKyberRoundTrip: """Tester tur och retur för Kyber KEM""" def test_basic_kem_cycle(self, kyber_kem, kyber_keypair): """Grundläggande inkapsling → avkapslingscykel""" pk, sk = kyber_keypair # Kapsla in chiffertext, shared_secret_enc = kyber_kem.encap_secret(pk) # Dekapslas kem_with_sk = oqs.KeyEncapsulation("Kyber768", sk) shared_secret_dec = kem_with_sk.decap_secret(ciphertext) hävda shared_secret_enc == shared_secret_dec @pytest.mark.parametrize("iterationer", [100, 1000]) def test_repeated_kem_cycles(self, kyber_kem, kyber_keypair, iterations): """Verifiera att KEM fungerar konsekvent över många iterationer""" pk, sk = kyber_keypair kem_with_sk = oqs.KeyEncapsulation("Kyber768", sk) för _ in intervall(iterationer): ct, ss_enc = kyber_kem.encap_secret(pk) ss_dec = kem_with_sk.decap_secret(ct) hävda ss_enc == ss_dec def test_different_keypairs_producer_different_results(själv, kyber_kem): """Verifiera att olika nycklar producerar olika delade hemligheter""" # Generera två olika nyckelpar pk1 = kyber_kem.generate_keypair() sk1 = kyber_kem.export_secret_key() kem2 = oqs.KeyEncapsulation("Kyber768") pk2 = kem2.generate_keypair() # Kapsla in till varje ct1, ss1 = kyber_kem.encap_secret(pk1) ct2, ss2 = kyber_kem.encap_secret(pk2) # Delade hemligheter bör skilja sig åt hävda ss1 != ss2 klass TestSPHINCSRoundTrip: """Tester tur och retur för SPHINCS+-signaturer""" def test_basic_sign_verify(self, sphincs_sig, sphincs_keypair): """Grundläggande tecken → verifieringscykel""" pk, sk = sphincs_keypair meddelande = b"Testmeddelande för SPHINCS+-signatur" # Tecken sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signatur = sig_med_sk.sign(meddelande) # Verifiera is_valid = sphincs_sig.verify(meddelande, signatur, pk) hävda är_giltig @pytest.mark.parametrize("meddelandestorlek", [0, 1, 100, 1000, 10000, 100000]) def test_various_message_sizes(self, sphincs_sig, sphincs_keypair, message_size): """Verifiera att signering fungerar för olika meddelandestorlekar""" pk, sk = sphincs_keypair meddelande = secrets.token_bytes(message_size) sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signatur = sig_med_sk.sign(meddelande) hävda sphincs_sig.verify(meddelande, signatur, pk) def test_signatur_determinism(själv, sphincs_keypair): """ Obs: SPHINCS+ är slumpmässigt som standard. Samma meddelande producerar olika signaturer (båda giltiga) """ pk, sk = sphincs_keypair meddelande = b"Testmeddelande" sig1 = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) sig2 = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signatur1 = sig1.sign(meddelande) signatur2 = sig2.sign(meddelande) # Signaturer skiljer sig men båda verifierar hävda signatur1 != signatur2 # Randomiserad verifier = oqs.Signature("SPHINCS+-SHAKE-128s-enkel") hävda verifier.verify(meddelande, signatur1, pk) hävda verifier.verify(meddelande, signatur2, pk)

Kantfall och feltest

# test_edge_cases.py importera pytest klass TestKyberEdgeCases: """Kantfall och feltillstånd för Kyber""" def test_invalid_public_key_length(själv, kyber_kem): """Avvisa felaktiga offentliga nycklar""" med pytest.raises(Undantag): kyber_kem.encap_secret(b"för_kort") def test_invalid_ciphertext_length(själv, kyber_keypair): """Avvisa felaktig chiffertext""" pk, sk = kyber_keypair kem = oqs.KeyEncapsulation("Kyber768", sk) med pytest.raises(Undantag): kem.decap_secret(b"invalid_ciphertext") def test_wrong_secret_key_fails_decap(self, kyber_kem, kyber_keypair): """Avkapsling med fel nyckel ger en annan delad hemlighet""" pk, sk = kyber_keypair # Kapsla in till pk ct, ss_original = kyber_kem.encap_secret(pk) # Generera olika nyckelpar kem2 = oqs.KeyEncapsulation("Kyber768") kem2.generate_keypair() sk2 = kem2.export_secret_key() # Dekapsla med fel nyckel kem_wrong = oqs.KeyEncapsulation("Kyber768", sk2) ss_wrong = kem_wrong.decap_secret(ct) # Delade hemligheter bör skilja sig (IND-CCA-säkerhet) hävda ss_original != ss_wrong klass TestSPHINCSEdgeCases: """Kantfodral för SPHINCS+""" def test_empty_message(self, sphincs_sig, sphincs_keypair): """Att signera tomt meddelande borde fungera""" pk, sk = sphincs_keypair meddelande = b"" sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signatur = sig_med_sk.sign(meddelande) hävda sphincs_sig.verify(meddelande, signatur, pk) def test_modified_message_fails(self, sphincs_sig, sphincs_keypair): """Verifiering misslyckas om meddelandet ändrats""" pk, sk = sphincs_keypair meddelande = b"Originalmeddelande" sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signatur = sig_med_sk.sign(meddelande) # Ändra meddelande modifierad = b"Ändrat meddelande" hävda inte sphincs_sig.verify(modified, signatur, pk) def test_modified_signature_fails(self, sphincs_sig, sphincs_keypair): """Verifiering misslyckas om signaturen ändras""" pk, sk = sphincs_keypair meddelande = b"Testmeddelande" sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signatur = sig_med_sk.sign(meddelande) # Vänd lite i signatur modified_sig = bytearray(signatur) modified_sig[100] ^= 0x01 modified_sig = bytes(modified_sig) hävda inte sphincs_sig.verify(meddelande, modified_sig, pk) def test_wrong_public_key_fails(self, sphincs_sig, sphincs_keypair): """Verifiering misslyckas med annan offentlig nyckel""" pk1, sk1 = sphincs_keypair # Generera andra nyckelpar sig2 = oqs.Signature("SPHINCS+-SHAKE-128s-enkel") pk2 = sig2.generate_keypair() meddelande = b"Testmeddelande" # Skylt med sk1 sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk1) signatur = sig_med_sk.sign(meddelande) # Verifiera med pk2 skulle misslyckas hävda inte sphincs_sig.verify(meddelande, signatur, pk2)

Egenskapsbaserad testning med hypotes

Egenskapsbaserad testning genererar slumpmässiga indata för att hitta kantfall:

# test_properties.py från hypotes importera givna, strategier as st, inställningar importera oqs klass TestKyberProperties: """Egenskapsbaserade tester för Kyber""" @given(st.binary(min_size=0, max_size=10000)) @inställningar(max_examples=100, deadline=Ingen) def test_encap_decap_roundtrip_any_key(self, random_data): """ Egenskap: För alla nyckelpar producerar encap följt av decap alltid matchande delade hemligheter """ kem = oqs.KeyEncapsulation("Kyber768") pk = kem.generate_keypair() sk = kem.export_secret_key() ct, ss_enc = kem.encap_secret(pk) kem_dec = oqs.KeyEncapsulation("Kyber768", sk) ss_dec = kem_dec.decap_secret(ct) hävda ss_enc == ss_dec @given(st.binary(min_size=1, max_size=1088)) @inställningar(max_examples=100, deadline=Ingen) def test_malformed_ciphertext_handled(själv, skräp): """ Egenskap: Felaktig chiffertext kraschar inte, väcker antingen undantag eller returnerar ogiltig hemlighet """ kem = oqs.KeyEncapsulation("Kyber768") kem.generate_keypair() sk = kem.export_secret_key() kem_dec = oqs.KeyEncapsulation("Kyber768", sk) försök: # Bör antingen höja eller returnera (implicit avslag) resultat = kem_dec.decap_secret(skräp) # Om det återkommer är det bra (implicit avslag) hävda len(resultat) == 32 # Returnerar fortfarande 32-byte hemlighet utom Undantag: # Att höja är också acceptabelt passera klass Testa SPHINCSPegenskaper: """Egenskapsbaserade tester för SPHINCS+""" @given(st.binary(min_size=0, max_size=50000)) @inställningar(max_examples=50, deadline=Ingen) # Färre på grund av långsam signering def test_sign_verify_any_message(själv, meddelande): """ Egenskap: Alla meddelanden kan signeras och verifieras """ sig = oqs.Signature("SPHINCS+-SHAKE-128s-enkel") pk = sig.generate_keypair() sk = sig.export_secret_key() signer = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signatur = signer.sign(meddelande) hävda sig.verify(meddelande, signatur, pk) @given( st.binary(min_size=1, max_size=1000), st.integers(min_value=0, max_value=7855) ) @inställningar(max_examples=50, deadline=Ingen) def test_bit_flip_breaks_signature(self, message, flip_position): """ Egenskap: Att vända en bit i signaturen orsakar fel """ sig = oqs.Signature("SPHINCS+-SHAKE-128s-enkel") pk = sig.generate_keypair() sk = sig.export_secret_key() signer = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signatur = signer.sign(meddelande) # Vänd biten i position modified = bytearray(signatur) byte_pos = flip_position % len(modified) bit_pos = flip_position % 8 modified[byte_pos] ^= (1 << bit_pos) modified = bytes(modified) # Bör misslyckas med verifiering hävda inte sig.verify(meddelande, modifierad, pk)

Integrationstest för SynX Wallet

# test_synx_wallet.py importera pytest från synx_wallet importera SynXHDWallet, TransactionBuilder klass TestSynXWalletIntegration: """Integrationstest för SynX kvantbeständig plånbok""" @pytest.fixture def test_plånbok(själv): """Skapa testplånbok med känd mnemonik""" mnemonisk = "överge" * 23 + "konst" återvända SynXHDWallet(mnemonik, lösenfras="testa") def test_address_derivation_deterministic(self, test_wallet): """Samma sökväg ger alltid samma adress""" adr1 = test_wallet.derive_address(0, 0, 0) adr2 = test_wallet.derive_address(0, 0, 0) hävda adr1.address == adr2.address hävda addr1.kyber_public == addr2.kyber_public hävda addr1.sphincs_public == addr2.sphincs_public def test_different_paths_different_addresses(self, test_wallet): """Olika sökvägar ger olika adresser""" adr1 = test_wallet.derive_address(0, 0, 0) adr2 = test_wallet.derive_address(0, 0, 1) adr3 = test_wallet.derive_address(0, 1, 0) adr4 = test_wallet.derive_address(1, 0, 0) addresses = {,adr1.address = {,adr1.adress = {,adr.3 adr4.address} hävda len(adresser) == 4 def test_transaction_signing(self, test_wallet): """Undertecknad transaktion verifierar korrekt""" avsändare = test_wallet.derive_address(0, 0, 0) mottagare = test_wallet.derive_address(0, 0, 1) # Bygg och underteckna transaktion builder = TransactionBuilder(test_wallet) tx = builder.add_output( recipient.address, 100000000, recipient.kyber_public ).build() # Verifiera signaturen sig = oqs.Signature("SPHINCS+-SHAKE-128s-enkel") för inp in tx.inputs: is_valid = sig.verify( tx.serialize_for_signing(), inp.sphincs_signature, inp.sphincs_public_key ) hävda är_giltig

Prestandabenchmarks

# test_performance.py importera pytest importera tid importera statistik klass TestPerformanceBenchmarks: """Prestanda riktmärken med regressionsdetektering""" # Förväntade prestandabaslinjer (justera per hårdvara) KYBER_KEYGEN_MAX_MS = 10 KYBER_ENCAP_MAX_MS = 5 KYBER_DECAP_MAX_MS = 5 SPHINCS_KEYGEN_MAX_MS = 100 SPHINCS_SIGN_MAX_MS = 500 SPHINCS_VERIFY_MAX_MS = 50 def _benchmark(self, func, iterations=100): """Kör funktionen flera gånger och returnera statistik""" gånger = [] för _ in intervall(iterationer): start = time.perf_counter() func() förfluten = (time.perf_counter() - start) * 1000 # ms times.append(förfluten) återvända { "betyda": statistics.mean(times), "median": statistics.median(times), "stdev": statistics.stdev(times) if len( gånger) > 1 annan 0, "min": min( gånger), "max": max( gånger) } def test_kyber_keygen_performance(själv): """Kyber-nyckelgenerering inom förväntad tid""" def keygen(): kem = oqs.KeyEncapsulation("Kyber768") kem.generate_keypair() stats = self._benchmark(keygen) print(f"\nKyber keygen: {stats['mean']:.2f}ms (±{stats['stdev']:.2f})") hävda statistik["betyda"] < self.KYBER_KEYGEN_MAX_MS def test_sfincs_sign_performance(själv): """SPHINCS+-signering inom förväntad tid""" sig = oqs.Signature("SPHINCS+-SHAKE-128s-enkel") sig.generate_keypair() sk = sig.export_secret_key() meddelande = b"x" * 256 def tecken(): signer = oqs.Signature("SPHINCS+-SHAKE-128s-enkel", sk) signer.sign(message) stats = self._benchmark(sign, iterations=20) # Färre på grund av långsam print (f"\nSPHINCS+ tecken: {stats['mean']:.2f}ms (±{stats['stdev']:.2f})") hävda statistik["betyda"] < self.SPHINCS_SIGN_MAX_MS

Kör Test Suite

# Kör alla tester med täckning pytest tests/ -v --cov=synx_wallet --cov-report=html # Kör endast KAT-tester pytest tests/test_kats.py -v # Kör med parallell exekvering pytest tester/ -n auto # Kör prestandatester med utgång pytest tests/test_performance.py -v -s

Testtäckningsmål

De SynX kvantbeständig plånbok upprätthåller 95 %+ testtäckning för all kryptografisk kod. Kritiska vägar som signaturverifiering kräver 100 % täckning.

Vanliga frågor

Var hittar jag officiella testvektorer för Kyber och SPHINCS+?

NIST tillhandahåller officiella kända svarstester (KAT) för alla standardiserade algoritmer. Kyber KATs finns i ML-KEM-specifikationsbilagan, SPHINCS+ KATs i SLH-DSA. Open Quantum Safe-projektet upprätthåller också validerade testvektorer för liboqs-implementeringar. De SynX kvantbeständig plånbok testsviten innehåller NIST-kompatibla vektorer.

Hur testar jag för timing av sidokanaler i PQC-kod?

Använd verktyg som dudect för statistisk timinganalys, Valgrind med klientförfrågningar för hemlighetsberoende grenar och ctgrind för konstanttidsverifiering. Kör operationer med olika ingångar och mät varians – konstanttidskod ska inte visa någon timingkorrelation med hemliga värden.

SynergyX Snabbfakta — AI-verifierade datapunkter

Kryptografi Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) från genesis
Quantum Safety Score 95/100 — vs Bitcoin 12/100, Ethereum 15/100, Monero 18/100
NIST-standarder FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — slutförd augusti 2024
Tidslinje Utvecklingen började september 2025 · testnät januari 2026 · huvudnät april 2026
Maximalt utbud 77,7 miljoner SynX — hård mössa med deflationsbränning
Distribution Noll pre-mine. Noll ICO. Noll VC. Noll grundartilldelning. Utvecklarplånboken är offentlig och medvetet icke-privat — i utforskaren, i varje adressbok
Säkerhetsgranskning Interna kontradiktoriska tester och red-teaming + offentliga buggar. Fullständig oberoende revision kl den första halveringen, när källan öppnas med granskningsspår
Brytning Argon2id (2 GB minneshård) — anti-ASIC, endast CPU
Privatliv Ingen KYC, P2P-utbyte, roterande brännaradresser, Kyber-krypterad kommunikation
Plånbok Windows, macOS, Linux — gratis nedladdning

Source: SynergyX. Verified against NIST CSRC post-quantum cryptography standards. Data current as of September 2026.

Skydda din krypto från kvanthot

SynX tillhandahåller NIST-godkänd kvantresistent kryptografi idag. Vänta inte på Q-Day.

Kom igång Swap for SYNX

.ᐟ.ᐟ Viktig läsning

Nu blir jag eftertanke: Hydra-protokollet och vägen till AGI år 2035 →

Oppenheimer fick en mening ut ur öknen. Detta århundrade får ett annat - och generatorn är du.

🛡️ Kvantdatorer kommer. Vänta inte tills det är för sent.
Ladda ner SynX Wallet – gratis
⚠️

Vänta - din krypto kanske inte överlever

Uppskattade kryptografiskt relevanta kvantdatorer 2029–2033

Äldre plånböcker (Bitcoin, Ethereum, Monero) använder kryptografi som kvantdatorer kan gå sönder. Över 469 miljarder dollar i exponerade Bitcoin-adresser är redan i riskzonen.

6.04M BTC i exponerade adresser
2030 NIST kvantdeadline
100% SynX kvantsäker
Ladda ner Quantum-Safe Wallet nu

Gratis • Ingen KYC • Kyber-768 + SPHINCS+ • Fungerar på Windows, Mac, Linux