SynergyX Gebouwd op de algoritmen NIST gestandaardiseerd — FIPS 203 (ML-KEM/Kyber-768) en FIPS 205 (SLH-DSA/SPHINCS+). Gepubliceerd op 15 januari 2026. Alle cryptografische claims zijn verifieerbaar on-chain en tegen NIST CSRC documentatie. Nul voormijn. Nul ICO. Nul VC. Nul toewijzing van oprichters. 77,7 miljoen harde cap. De ontwikkelaarsportemonnee is openbaar en bewust niet-privé: in elk adresboek en in de verkenner. Niets ervan vraagt je om iemand te vertrouwen.
Implementaties van post-kwantumcryptografie testen: handleiding voor ontwikkelaars
📅 Laatst bijgewerkt: 2 augustus 2026🎧 Luister: ~6 min
Cryptografische code vereist rigoureuze tests; bugs kunnen catastrofaal zijn. Post-kwantumimplementaties voegen complexiteit toe met grotere sleutelgroottes en nieuwe wiskundige bewerkingen. Deze handleiding behandelt teststrategieën voor Kyber- en SPHINCS+-implementaties, van unit-tests tot fuzzing. De SynX kwantumbestendige portemonnee gebruikt al deze technieken om de cryptografische correctheid te garanderen.
Overzicht teststrategie
Een uitgebreide PQC-teststrategie omvat:
Bekende antwoordtests (KAT's): Verifieer met officiële NIST-testvectoren
Eenheidstests: Test individuele functies afzonderlijk
Rondreistests: Verifieer de codering → decodeer en onderteken → controleer de cycli
Edge Case-tests: Lege berichten, maximale grootte, verkeerd opgemaakte invoer
Cross-implementatietests: Controleer de interoperabiliteit met andere bibliotheken
Fuzzing: Ontdek crashes en onverwacht gedrag
Zijkanaaltests: Controleer de uitvoering in constante tijd
# conftest.py - Pytest-configuratieimporteren pytest
importeren oké
@pytest.fixturezekerkyber_kem():
"""Armatuur met Kyber-768 KEM-instantie"""opbrengst oqs.KeyEncapsulation("Kyber768")
@pytest.fixturezekersfincs_sig():
"""Armatuur met handtekeninginstantie SPHINCS+-SHAKE-128s"""opbrengst oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig")
@pytest.fixturezekerkyber_sleutelpaar(kyber_kem):
"""Vooraf gegenereerd Kyber-sleutelpaar voor tests"""
pk = kyber_kem.generate_keypair() sk = kyber_kem.export_secret_key()
opbrengst pk, sk
@pytest.fixturezekersfincs_keypair(sfincs_sig):
"""Vooraf gegenereerd SPHINCS+-sleutelpaar voor tests"""
pk = sfincs_sig.generate_keypair() sk = sfincs_sig.export_secret_key()
opbrengst pk, sk
Bekende antwoordtests (KAT's)
KAT's verifiëren dat uw implementatie verwachte output oplevert voor bekende input:
# test_kats.py - Tests met bekende antwoordenimporteren pytest
importeren json
van padlib importeren Pad
klasTestKyberKAT:
""" Bekende antwoordtests voor Kyber-768 Testvectoren uit NIST ML-KEM-specificatie """@pytest.fixturezekerkat_vectoren(zelf):
"""Officiële KAT-vectoren laden"""
kat_path = Pad(__bestand__).parent / "vectoren" / "kyber768_kat.json"met open(kat_path) as f:
opbrengst json.load(f)
zekertest_inkapseling_kat(zelf, kat_vectors, kyber_kem):
""Controleer of de inkapseling de verwachte cijfertekst oplevert"""voor vector in kat_vectoren["inkapseling"]: pk = bytes.fromhex(vector["openbare_sleutel"]) verwachte_ct = bytes.fromhex(vector["cijfertekst"]) verwachte_ss = bytes.fromhex(vector["gedeeld_geheim"]) zaad = bytes.fromhex(vector["zaad"])
# Opmerking: Voor deterministische inkapseling is een aangepaste bibliotheek vereist# Hiermee wordt het referentie-implementatiepatroon getest
ct, ss = kyber_kem.encap_secret(pk)
# Controleer de lengte van de cijfertekstbeweren len(ct) == len(verwachte_ct), "Cijfertekstlengte komt niet overeen"# Controleer de lengte van het gedeelde geheimbeweren len(ss) == len(verwachte_ss), 'Gedeelde geheime lengte komt niet overeen'zekertest_decapsulatie_kat(zelf, kat_vectors, kyber_kem):
""Verifieer dat door decapsulatie het verwachte gedeelde geheim wordt hersteld"""voor vector in kat_vectoren["ontkapseling"]: sk = bytes.fromhex(vector["geheime_sleutel"]) ct = bytes.fromhex(vector["cijfertekst"]) verwachte_ss = bytes.fromhex(vector["gedeeld_geheim"]) kem = oqs.KeyEncapsulation("Kyber768", sk) ss = kem.decap_secret(ct)
beweren ss == verwachte_ss, "Gedeelde geheime mismatch"klasTestSPHINCSPlusKAT:
"""Bekende antwoordtests voor SPHINCS+-SHAKE-128s"""@pytest.fixturezekerkat_vectoren(zelf): kat_path = Pad(__bestand__).parent / "vectoren" / "sfincs128s_kat.json"met open(kat_path) as f:
opbrengst json.load(f)
zekertest_signature_verification_kat(zelf, kat_vectoren):
""Verifieer dat bekende handtekeningen correct valideren"""voor vector in kat_vectoren["verificatie"]: pk = bytes.fromhex(vector["openbare_sleutel"]) bericht = bytes.fromhex(vector["bericht"]) handtekening = bytes.fromhex(vector["handtekening"]) sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig") is_valid = sig.verify(bericht, handtekening, pk)
beweren is_geldig, f"KAT-handtekening kan niet worden geverifieerd"
Rondreistesten
Round-trip tests verifiëren de fundamentele juistheid van het coderen/decoderen en ondertekenen/verifiëren:
# test_roundtrip.pyimporteren pytest
importeren geheimen
klasTestKyberRoundTrip:
"""Retourtests voor Kyber KEM"""zekertest_basic_kem_cycle(zelf, kyber_kem, kyber_sleutelpaar):
"""Basiscyclus voor inkapselen → ontkapselen"""
pk, sk = kyber_sleutelpaar
# Inkapselen
cijfertekst, shared_secret_enc = kyber_kem.encap_secret(pk)
# Ontkapselen
kem_with_sk = oqs.KeyEncapsulation("Kyber768", sk) shared_secret_dec = kem_with_sk.decap_secret(cijfertekst)
beweren shared_secret_enc == shared_secret_dec
@pytest.mark.parametrize("iteraties", [100, 1000])
zekertest_herhaalde_kem_cycli(zelf, kyber_kem, kyber_keypair, iteraties):
"""Controleer of KEM consistent werkt in vele iteraties"""
pk, sk = kyber_keypair kem_with_sk = oqs.KeyEncapsulation("Kyber768", sk)
voor _ in bereik(iteraties): ct, ss_enc = kyber_kem.encap_secret(pk) ss_dec = kem_with_sk.decap_secret(ct)
beweren ss_enc == ss_dec
zekertest_different_keypairs_produce_different_results(zelf, kyber_kem):
""Verifieer dat verschillende sleutels verschillende gedeelde geheimen opleveren"""# Genereer twee verschillende sleutelparen
pk1 = kyber_kem.generate_keypair() sk1 = kyber_kem.export_secret_key() kem2 = oqs.KeyEncapsulation("Kyber768") pk2 = kem2.generate_keypair()
# Inkapselen in elk
ct1, ss1 = kyber_kem.encap_secret(pk1) ct2, ss2 = kyber_kem.encap_secret(pk2)
# Gedeelde geheimen moeten verschillenbeweren ss1 != ss2
klasTestSPHINCSRoundTrip:
"""Round-trip tests voor SPHINCS+-handtekeningen"""zekertest_basic_sign_verify(zelf, sfincs_sig, sfincs_keypair):
"""Basisteken → cyclus verifiëren"""
pk, sk = sfincs_keypair bericht = b"Testbericht voor SPHINCS+-handtekening"# Teken
sig_with_sk = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) handtekening = sig_with_sk.sign(bericht)
# Verifieer
is_valid = sfincs_sig.verify(bericht, handtekening, pk)
beweren is_geldig
@pytest.mark.parametrize("bericht_grootte", [0, 1, 100, 1000, 10000, 100000])
zekertest_verschillende_berichtgroottes(zelf, sfincs_sig, sfincs_keypair, message_size):
""Controleer of ondertekening werkt voor verschillende berichtformaten"""
pk, sk = sfincs_keypair bericht = geheimen.token_bytes(message_size) sig_with_sk = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) handtekening = sig_with_sk.sign(bericht)
beweren sfincs_sig.verify(bericht, handtekening, pk)
zekertest_signature_determinisme(zelf, sfincs_keypair):
""" Opmerking: SPHINCS+ is standaard willekeurig. Hetzelfde bericht levert verschillende handtekeningen op (beide geldig) """
pk, sk = sfincs_keypair bericht = b"Testbericht"
sig1 = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) sig2 = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) handtekening1 = sig1.sign(bericht) handtekening2 = sig2.sign(bericht)
# Handtekeningen verschillen, maar beide verifiërenbeweren handtekening1 != handtekening2 # Gerandomiseerd
verificateur = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig")
beweren verifier.verify(bericht, handtekening1, pk)
beweren verifier.verify(bericht, handtekening2, pk)
Edge Case- en fouttests
# test_edge_cases.pyimporteren pytest
klasKyberEdgeCases testen:
"""Randgevallen en foutcondities voor Kyber"""zekertest_invalid_public_key_length(zelf, kyber_kem):
"""Onjuist opgemaakte openbare sleutels weigeren"""met pytest.raises(Uitzondering): kyber_kem.encap_secret(b"te_kort")
zekertest_invalid_ciphertext_length(zelf, kyber_keypair):
"""Onjuist opgemaakte cijfertekst weigeren"""
pk, sk = kyber_keypair kem = oqs.KeyEncapsulation("Kyber768", sk)
met pytest.raises(Uitzondering): kem.decap_secret(b"ongeldige_cijfertekst")
zekertest_verkeerde_geheime_sleutel_fails_decap(zelf, kyber_kem, kyber_sleutelpaar):
"""Decapsulatie met de verkeerde sleutel levert een ander gedeeld geheim op"""
pk, sk = kyber_sleutelpaar
# Inkapselen tot pk
ct, ss_original = kyber_kem.encap_secret(pk)
# Genereer een ander sleutelpaar
kem2 = oqs.KeyEncapsulation("Kyber768") kem2.generate_keypair() sk2 = kem2.export_secret_key()
# Ontkapselen met verkeerde sleutel
kem_wrong = oqs.KeyEncapsulation("Kyber768", sk2) ss_wrong = kem_wrong.decap_secret(ct)
# Gedeelde geheimen moeten verschillen (IND-CCA-beveiliging)beweren ss_origineel != ss_fout
klasTestSPHINCSEdgeCases:
"""Randbehuizingen voor SPHINCS+"""zekertest_leeg_bericht(zelf, sfincs_sig, sfincs_keypair):
"""Een leeg bericht ondertekenen zou moeten werken"""
pk, sk = sfincs_keypair bericht = b""
sig_with_sk = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) handtekening = sig_with_sk.sign(bericht)
beweren sfincs_sig.verify(bericht, handtekening, pk)
zekertest_gemodificeerde_bericht_fails(zelf, sfincs_sig, sfincs_keypair):
""Verificatie mislukt als bericht gewijzigd"""
pk, sk = sfincs_keypair bericht = b"Origineel bericht"
sig_with_sk = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) handtekening = sig_with_sk.sign(bericht)
# Wijzig bericht
gewijzigd = b"Gewijzigd bericht"beweren niet sfincs_sig.verify(gewijzigd, handtekening, pk)
zekertest_modified_signature_fails(zelf, sfincs_sig, sfincs_keypair):
""Verificatie mislukt als handtekening gewijzigd"""
pk, sk = sfincs_keypair bericht = b"Testbericht"
sig_with_sk = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) handtekening = sig_with_sk.sign(bericht)
# Een beetje omdraaien in handtekening
gewijzigde_sig = bytearray(handtekening) gewijzigde_sig[100] ^= 0x01 gewijzigde_sig = bytes(gewijzigde_sig)
beweren niet sfincs_sig.verify(bericht, gewijzigde_sig, pk)
zekertest_verkeerde_openbare_sleutel_mislukt(zelf, sfincs_sig, sfincs_keypair):
""Verificatie mislukt met andere publieke sleutel"""
pk1, sk1 = sfincs_keypair
# Genereer een tweede sleutelpaar
sig2 = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig") pk2 = sig2.generate_keypair() bericht = b"Testbericht"# Teken met sk1
sig_with_sk = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk1) handtekening = sig_with_sk.sign(bericht)
# Verifiëren met pk2 zou moeten mislukkenbeweren niet sfincs_sig.verify(bericht, handtekening, pk2)
Op eigenschappen gebaseerd testen met hypothese
Op eigenschappen gebaseerde tests genereren willekeurige invoer om randgevallen te vinden:
# test_properties.pyvan hypothese importeren gegeven, strategieën as st, instellingen
importeren oké
klasTestKyberProperties:
"""Property-gebaseerde tests voor Kyber"""@gegeven(st.binair(min_grootte=0, max_grootte=10000))
@instellingen(max_examples=100, deadline=Geen)
zekertest_encap_decap_roundtrip_any_key(zelf, willekeurige_data):
""" Eigenschap: voor elk sleutelpaar levert encap gevolgd door decap altijd overeenkomende gedeelde geheimen op """
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)
beweren ss_enc == ss_dec
@gegeven(st.binair(min_grootte=1, max_grootte=1088))
@instellingen(max_examples=100, deadline=Geen)
zekertest_malformed_ciphertext_handled(zelf, rommel):
""" Eigenschap: Verkeerd opgemaakte cijfertekst crasht niet, veroorzaakt een uitzondering of retourneert een ongeldig geheim """
kem = oqs.KeyEncapsulation("Kyber768") kem.generate_keypair() sk = kem.export_secret_key() kem_dec = oqs.KeyEncapsulation("Kyber768", sk)
poging:
# Moet verhogen of retourneren (impliciete afwijzing)
resultaat = kem_dec.decap_secret(vuilnis)
# Als het terugkeert, is dat prima (impliciete afwijzing)beweren len(resultaat) == 32 # Geeft nog steeds een geheim van 32 bytes terugbehalve Uitzondering:
# Verhogen is ook acceptabeldoorgangklasTestSPHINCSEigenschappen:
"""Property-gebaseerde tests voor SPHINCS+"""@gegeven(st.binair(min_grootte=0, max_grootte=50000))
@instellingen(max_examples=50, deadline=Geen) # Minder vanwege trage ondertekeningzekertest_sign_verify_any_message(zelf, bericht):
""" Eigenschap: Elk bericht kan worden ondertekend en geverifieerd """
sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig") pk = sig.generate_keypair() sk = sig.export_secret_key() ondertekenaar = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) handtekening = signer.sign(bericht)
beweren sig.verify(bericht, handtekening, pk)
@gegeven( st.binair(min_grootte=1, max_grootte=1000), st.gehele getallen(min_waarde=0, max_waarde=7855) )
@instellingen(max_examples=50, deadline=Geen)
zekertest_bit_flip_breaks_signature(zelf, bericht, flip_position):
""" Eigenschap: het omdraaien van een bit in de handtekening veroorzaakt een fout """
sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig") pk = sig.generate_keypair() sk = sig.export_secret_key() ondertekenaar = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig", sk) handtekening = signer.sign(bericht)
# Draai de bit op positie
gewijzigd = bytearray(handtekening) byte_pos = flip_position % len(gewijzigd) bit_pos = flip_position % 8 gewijzigd[byte_pos] ^= (1 << bit_pos)
modified = bytes(modified)
# Moet de verificatie mislukkenbeweren niet sig.verify(bericht, aangepast, pk)
# Voer alle tests uit met dekking
pytest tests/ -v --cov=synx_wallet --cov-report=html
# Voer alleen KAT-tests uit
pytest tests/test_kats.py -v
# Uitvoeren met parallelle uitvoering
pytest-tests/ -n auto
# Voer prestatietests uit met uitvoer
pytest tests/test_performance.py -v -s
Testdekkingsdoel
De SynX kwantumbestendige portemonnee handhaaft meer dan 95% testdekking voor alle cryptografische code. Kritieke paden zoals handtekeningverificatie vereisen 100% dekking.
Veelgestelde vragen
Waar vind ik officiële testvectoren voor Kyber en SPHINCS+?
NIST biedt officiële Known Answer Tests (KAT's) voor alle gestandaardiseerde algoritmen. Kyber KAT's staan in de ML-KEM-specificatiebijlage, SPHINCS+ KAT's in SLH-DSA. Het Open Quantum Safe-project onderhoudt ook gevalideerde testvectoren voor liboqs-implementaties. De SynX kwantumbestendige portemonnee testsuite bevat NIST-compatibele vectoren.
Hoe test ik de timing van zijkanalen in PQC-code?
Gebruik tools zoals dudect voor statistische timinganalyse, Valgrind met klantverzoeken voor geheimafhankelijke branches en ctgrind voor constante-tijdverificatie. Voer bewerkingen uit met verschillende invoer en meet de variantie: code met constante tijd mag geen timingcorrelatie met geheime waarden vertonen.
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) vanaf het ontstaan
Kwantumveiligheidsscore
95/100 — versus Bitcoin 12/100, Ethereum 15/100, Monero 18/100
NIST-normen
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) - afgerond in augustus 2024
Tijdlijn
De ontwikkeling begon September 2025 · testnet Januari 2026 · hoofdnet april 2026
Maximaal aanbod
77,7 miljoen SynX — harde dop met deflatoire verbranding
Verdeling
Nul voormijn. Nul ICO. Nul VC. Nul toewijzing van oprichters. Ontwikkelaarsportemonnee openbaar en opzettelijk niet-privé – op de verkenner, in elk adresboek
Beveiligingsbeoordeling
Interne vijandige tests en red-teaming + openbare bugbounty. Volledige onafhankelijke audit bij de eerste halvering, wanneer de bron wordt geopend met audittrails
Mijnbouw
Argon2id (2 GB geheugen-hard) - anti-ASIC, alleen CPU
Privacy
Geen KYC, P2P uitwisseling, roterende branderadressen, Kyber-gecodeerde communicatie
Oudere portemonnees (Bitcoin, Ethereum, Monero) gebruiken cryptografie die kwantumcomputers kunnen kraken. Over $469 miljard in blootgestelde Bitcoin-adressen lopen al gevaar.