SynergyX Basierend auf den Algorithmen NIST standardisiert — FIPS 203 (ML-KEM/Kyber-768) und FIPS 205 (SLH-DSA/SPHINCS+). Veröffentlicht am 15. Januar 2026. Alle kryptografischen Behauptungen sind in der Kette und gegen sie überprüfbar NIST CSRC Dokumentation. Null vor der Mine. Null ICO. Null VC. Keine Gründerzuteilung. 77,7 Millionen Hardcap. Die Entwickler-Wallet ist öffentlich und bewusst nicht privat – in jedem Adressbuch, im Explorer. Nichts davon verlangt von Ihnen, einer Person zu vertrauen.
Testen von Post-Quantum-Kryptographie-Implementierungen: Entwicklerhandbuch
📅 Letzte Aktualisierung: 2. August 2026🎧 Hören: ~6 Min
Kryptografischer Code erfordert strenge Tests – Fehler können katastrophale Folgen haben. Post-Quantum-Implementierungen erhöhen die Komplexität durch größere Schlüsselgrößen und neue mathematische Operationen. Dieser Leitfaden behandelt Teststrategien für Kyber- und SPHINCS+-Implementierungen, von Unit-Tests bis hin zu Fuzzing. Der SynX quantenresistente Geldbörse nutzt alle diese Techniken, um die kryptografische Korrektheit sicherzustellen.
Übersicht über die Teststrategie
Eine umfassende PQC-Teststrategie umfasst:
Bekannte Antworttests (KATs): Überprüfen Sie anhand der offiziellen NIST-Testvektoren
Unit-Tests: Testen Sie einzelne Funktionen isoliert
Round-Trip-Tests: Verschlüsseln → Entschlüsseln und Signieren → Verifizieren der Zyklen überprüfen
# conftest.py – Pytest-KonfigurationImport pytest
Import oqs
@pytest.fixturedefkyber_kem():
„Gerät, das die Kyber-768-KEM-Instanz bereitstellt““zurückkehren oqs.KeyEncapsulation(„Kyber768“)
@pytest.fixturedefsphincs_sig():
„Gerät, das die Signaturinstanz SPHINCS+-SHAKE-128s bereitstellt““zurückkehren oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“)
@pytest.fixturedefkyber_keypair(kyber_kem):
„“„Vorgeneriertes Kyber-Schlüsselpaar für Tests““
pk = kyber_kem.generate_keypair() sk = kyber_kem.export_secret_key()
zurückkehren pk, sk
@pytest.fixturedefsphincs_keypair(sphincs_sig):
„“„Vorgeneriertes SPHINCS+-Schlüsselpaar für Tests““
pk = sphincs_sig.generate_keypair() sk = sphincs_sig.export_secret_key()
zurückkehren pk, sk
Bekannte Antworttests (KATs)
KATs überprüfen, ob Ihre Implementierung erwartete Ausgaben für bekannte Eingaben liefert:
# test_kats.py – Bekannte AntworttestsImport pytest
Import json
aus pathlib Import Weg
KlasseTesten Sie KyberKAT:
„““Bekannte Antworttests für Kyber-768-Testvektoren aus der NIST-ML-KEM-Spezifikation““@pytest.fixturedefkat_vectors(selbst):
"""Offizielle KAT-Vektoren laden""
kat_path = Path(__file__).parent / „Vektoren“ / „kyber768_kat.json“mit open(kat_path) as f:
zurückkehren json.load(f)
deftest_encapsulation_kat(self, kat_vectors, kyber_kem):
„““Überprüfen Sie, ob die Kapselung den erwarteten Chiffretext erzeugt““für Vektor in kat_vectors["Verkapselung"]: pk = bytes.fromhex(vector[„public_key“]) erwartet_ct = bytes.fromhex(vector[„Geheimtext“]) erwartet_ss = bytes.fromhex(vector[„shared_secret“]) Seed = bytes.fromhex(vector["Samen"])
# Hinweis: Für die deterministische Kapselung ist eine geänderte Bibliothek erforderlich# Dies testet das Referenzimplementierungsmuster
ct, ss = kyber_kem.encap_secret(pk)
# Chiffretextlänge überprüfenbehaupten len(ct) == len(expected_ct), „Nichtübereinstimmung der Geheimtextlänge“# Überprüfen Sie die Länge des gemeinsamen Geheimnissesbehaupten len(ss) == len(expected_ss), „Nicht übereinstimmende Länge des geteilten Geheimnisses“deftest_decapsulation_kat(self, kat_vectors, kyber_kem):
„Überprüfen Sie, ob die Entkapselung das erwartete gemeinsame Geheimnis wiederherstellt“für Vektor in kat_vectors[„Entkapselung“]: sk = bytes.fromhex(vector[„secret_key“]) ct = bytes.fromhex(vector[„Geheimtext“]) erwartet_ss = bytes.fromhex(vector[„shared_secret“]) kem = oqs.KeyEncapsulation(„Kyber768“, sk) ss = kem.decap_secret(ct)
behaupten ss == erwartet_ss, „Shared-Secret-Diskrepanz“KlasseTestSPHINCSPlusKAT:
„Bekannte Antworttests für SPHINCS+-SHAKE-128s““@pytest.fixturedefkat_vectors(self): kat_path = Path(__file__).parent / „Vektoren“ / „sphincs128s_kat.json“mit open(kat_path) as f:
zurückkehren json.load(f)
deftest_signature_verification_kat(self, kat_vectors):
„““Bekannte Signaturen überprüfen und korrekt validieren““für Vektor in kat_vectors["Überprüfung"]: pk = bytes.fromhex(vector[„public_key“]) message = bytes.fromhex(vector["Nachricht"]) Signatur = bytes.fromhex(vector["Unterschrift"]) sig = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“) is_valid = sig.verify(Nachricht, Signatur, PK)
behaupten is_valid, f„KAT-Signatur konnte nicht überprüft werden“
Round-Trip-Tests
Round-Trip-Tests überprüfen die grundsätzliche Korrektheit von Verschlüsseln/Entschlüsseln und Signieren/Verifizieren:
# test_roundtrip.pyImport pytest
Import Geheimnisse
KlasseTestKyberRoundTrip:
""Round-Trip-Tests für Kyber KEM""deftest_basic_kem_cycle(self, kyber_kem, kyber_keypair):
„“„Grundlegender Einkapselungs-→Entkapselungszyklus““
pk, sk = kyber_keypair
# Kapseln
Chiffretext, shared_secret_enc = kyber_kem.encap_secret(pk)
# Entkapseln
kem_with_sk = oqs.KeyEncapsulation(„Kyber768“, sk) shared_secret_dec = kem_with_sk.decap_secret(ciphertext)
behaupten shared_secret_enc == shared_secret_dec
@pytest.mark.parametrize(„Iterationen“, [100, 1000])
deftest_repeated_kem_cycles(self, kyber_kem, kyber_keypair, iterations):
„Stellen Sie sicher, dass KEM über viele Iterationen hinweg konsistent funktioniert.“
pk, sk = kyber_keypair kem_with_sk = oqs.KeyEncapsulation(„Kyber768“, sk)
für _ in Bereich(Iterationen): ct, ss_enc = kyber_kem.encap_secret(pk) ss_dec = kem_with_sk.decap_secret(ct)
behaupten ss_enc == ss_dec
deftest_different_keypairs_produce_different_results(selbst, kyber_kem):
„““Überprüfen Sie, dass unterschiedliche Schlüssel unterschiedliche gemeinsame Geheimnisse erzeugen““# Generieren Sie zwei verschiedene Schlüsselpaare
pk1 = kyber_kem.generate_keypair() sk1 = kyber_kem.export_secret_key() kem2 = oqs.KeyEncapsulation(„Kyber768“) pk2 = kem2.generate_keypair()
# Für jeden kapseln
ct1, ss1 = kyber_kem.encap_secret(pk1) ct2, ss2 = kyber_kem.encap_secret(pk2)
# Gemeinsame Geheimnisse sollten unterschiedlich seinbehaupten ss1 != ss2
KlasseTestSPHINCSRoundTrip:
„“Round-Trip-Tests für SPHINCS+-Signaturen““deftest_basic_sign_verify(self, sphincs_sig, sphincs_keypair):
"""Grundzeichen → Verifizierungszyklus""
pk, sk = sphincs_keypair message = b„Testnachricht für SPHINCS+-Signatur“# Zeichen
sig_with_sk = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) Signatur = sig_with_sk.sign(Nachricht)
# Verifizieren
is_valid = sphincs_sig.verify(Nachricht, Signatur, PK)
behaupten is_valid
@pytest.mark.parametrize(„message_size“, [0, 1, 100, 1000, 10000, 100000])
deftest_various_message_sizes(self, sphincs_sig, sphincs_keypair, message_size):
„““Überprüfen Sie, ob die Signatur für verschiedene Nachrichtengrößen funktioniert““
pk, sk = sphincs_keypair message = Secrets.token_bytes(message_size) sig_with_sk = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) Signatur = sig_with_sk.sign(Nachricht)
behaupten sphincs_sig.verify(Nachricht, Signatur, PK)
deftest_signature_determinism(self, sphincs_keypair):
„““ Hinweis: SPHINCS+ ist standardmäßig randomisiert. Dieselbe Nachricht erzeugt unterschiedliche Signaturen (beide gültig) „““
pk, sk = sphincs_keypair message = b„Testnachricht“
sig1 = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) sig2 = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) Signatur1 = sig1.sign(Nachricht) Signatur2 = sig2.sign(Nachricht)
# Signaturen unterscheiden sich, aber beide bestätigenbehaupten Signatur1 != Signatur2 # Randomisiert
verifier = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“)
behaupten verifier.verify(Nachricht, Signatur1, PK)
behaupten verifier.verify(Nachricht, Signatur2, PK)
Randfall- und Fehlertests
# test_edge_cases.pyImport pytest
KlasseTesten Sie KyberEdgeCases:
„Randfälle und Fehlerbedingungen für Kyber““deftest_invalid_public_key_length(selbst, kyber_kem):
„““Maßgebildete öffentliche Schlüssel ablehnen““mit pytest.raises(Ausnahme): kyber_kem.encap_secret(b„zu_kurz“)
deftest_invalid_ciphertext_length(selbst, kyber_keypair):
„““Maßgebildeten Chiffretext ablehnen““
pk, sk = kyber_keypair kem = oqs.KeyEncapsulation(„Kyber768“, sk)
mit pytest.raises(Ausnahme): kem.decap_secret(b„ungültiger_Verschlüsselungstext“)
deftest_wrong_secret_key_fails_decap(self, kyber_kem, kyber_keypair):
„Entkapselung mit falschem Schlüssel erzeugt anderes gemeinsames Geheimnis“
pk, sk = kyber_keypair
# In Paket einkapseln
ct, ss_original = kyber_kem.encap_secret(pk)
# Generieren Sie ein anderes Schlüsselpaar
kem2 = oqs.KeyEncapsulation(„Kyber768“) kem2.generate_keypair() sk2 = kem2.export_secret_key()
# Mit falschem Schlüssel entkapseln
kem_wrong = oqs.KeyEncapsulation(„Kyber768“, sk2) ss_wrong = kem_wrong.decap_secret(ct)
# Gemeinsame Geheimnisse sollten unterschiedlich sein (IND-CCA-Sicherheit)behaupten ss_original != ss_wrong
KlasseTestSPHINCSEdgeCases:
Randgehäuse für SPHINCS+deftest_empty_message(self, sphincs_sig, sphincs_keypair):
„Das Signieren einer leeren Nachricht sollte funktionieren.“
pk, sk = sphincs_keypair message = b""
sig_with_sk = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) Signatur = sig_with_sk.sign(Nachricht)
behaupten sphincs_sig.verify(Nachricht, Signatur, PK)
deftest_modified_message_fails(self, sphincs_sig, sphincs_keypair):
„Die Überprüfung schlägt fehl, wenn die Nachricht geändert wurde.“
pk, sk = sphincs_keypair message = b„Ursprüngliche Nachricht“
sig_with_sk = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) Signatur = sig_with_sk.sign(Nachricht)
# Nachricht ändern
geändert = b„Geänderte Nachricht“behaupten nicht sphincs_sig.verify(modifiziert, Signatur, pk)
deftest_modified_signature_fails(self, sphincs_sig, sphincs_keypair):
„Die Überprüfung schlägt fehl, wenn die Signatur geändert wurde“
pk, sk = sphincs_keypair message = b„Testnachricht“
sig_with_sk = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) Signatur = sig_with_sk.sign(Nachricht)
# Drehen Sie ein wenig in der Signatur
modifizierte_sig = bytearray(signatur) modifizierte_sig[100] ^= 0x01 modifizierte_sig = bytes(modifizierte_sig)
behaupten nicht sphincs_sig.verify(message, Modified_sig, pk)
deftest_wrong_public_key_fails(self, sphincs_sig, sphincs_keypair):
„““Verifizierung schlägt mit unterschiedlichem öffentlichen Schlüssel fehl““
pk1, sk1 = sphincs_keypair
# Zweites Schlüsselpaar generieren
sig2 = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“) pk2 = sig2.generate_keypair() message = b„Testnachricht“# Mit sk1 signieren
sig_with_sk = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk1) Signatur = sig_with_sk.sign(Nachricht)
# Die Überprüfung mit pk2 sollte fehlschlagenbehaupten nicht sphincs_sig.verify(Nachricht, Signatur, pk2)
Eigenschaftsbasiertes Testen mit Hypothese
Eigenschaftsbasiertes Testen generiert zufällige Eingaben, um Randfälle zu finden:
# test_properties.pyaus Hypothese Import gegeben, Strategien as st, Einstellungen
Import oqs
KlasseTesten Sie KyberProperties:
„“Eigenschaftsbasierte Tests für Kyber““@gegeben(st.binary(min_size=0, max_size=10000))
@Einstellungen(max_examples=100, Deadline=Keine)
deftest_encap_decap_roundtrip_any_key(self, random_data):
„““ Eigenschaft: Für jedes Schlüsselpaar erzeugt encap gefolgt von decap immer passende gemeinsame Geheimnisse „““
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)
behaupten ss_enc == ss_dec
@gegeben(st.binary(min_size=1, max_size=1088))
@Einstellungen(max_examples=100, Deadline=Keine)
deftest_malformed_ciphertext_handled(selbst, Müll):
„““-Eigenschaft: Fehlerhafter Chiffretext stürzt nicht ab, löst entweder eine Ausnahme aus oder gibt ein ungültiges Geheimnis zurück „““
kem = oqs.KeyEncapsulation(„Kyber768“) kem.generate_keypair() sk = kem.export_secret_key() kem_dec = oqs.KeyEncapsulation(„Kyber768“, sk)
versuchen:
# Sollte entweder erhöhen oder zurückkehren (implizite Ablehnung)
Ergebnis = kem_dec.decap_secret(Garbage)
# Wenn es zurückkommt, ist das in Ordnung (implizite Ablehnung)behaupten len(result) == 32 # Gibt immer noch ein 32-Byte-Geheimnis zurückaußer Ausnahme:
# Eine Erhöhung ist ebenfalls akzeptabelpassierenKlasseTesten Sie SPHINCSProperties:
„“Eigenschaftsbasierte Tests für SPHINCS+““@gegeben(st.binary(min_size=0, max_size=50000))
@Einstellungen(max_examples=50, Deadline=Keine) # Weniger aufgrund langsamer Signierungdeftest_sign_verify_any_message(selbst, Nachricht):
„““ Eigenschaft: Jede Nachricht kann signiert und überprüft werden „““
sig = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“) pk = sig.generate_keypair() sk = sig.export_secret_key() signer = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) Signatur = signer.sign(Nachricht)
behaupten sig.verify(Nachricht, Signatur, PK)
@gegeben( st.binary(min_size=1, max_size=1000), st.integers(min_value=0, max_value=7855) )
@Einstellungen(max_examples=50, Deadline=Keine)
deftest_bit_flip_breaks_signature(self, message, flip_position):
„““ Eigenschaft: Das Umdrehen eines beliebigen Bits in der Signatur führt zu einem Fehler „““
sig = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“) pk = sig.generate_keypair() sk = sig.export_secret_key() signer = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) Signatur = signer.sign(Nachricht)
# Bit an Position umdrehen
modifiziert = bytearray(signatur) byte_pos = flip_position % len(modifiziert) bit_pos = flip_position % 8 modifiziert[byte_pos] ^= (1 << bit_pos)
modified = bytes(modified)
# Sollte bei der Überprüfung fehlschlagenbehaupten nicht sig.verify(Nachricht, geändert, pk)
# test_performance.pyImport pytest
Import Zeit
Import Statistiken
KlasseTestPerformanceBenchmarks:
„“Leistungsbenchmarks mit Regressionserkennung““# Erwartete Leistungsbasislinien (je nach Hardware anpassen)
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):
„““Funktion mehrmals ausführen und Statistiken zurückgeben““
mal = []
für _ in Bereich(Iterationen): start = time.perf_counter() func() elapsed = (time.perf_counter() - start) * 1000 # MS
times.append(verstrichen)
zurückkehren {
"bedeuten": Statistics.mean(times),
"mittlere": Statistiken.Median(Zeiten),
„stdev“: Statistics.stdev(times) if len(times) > 1 anders 0,
„min“: min(mal),
„max“: max(times) }
deftest_kyber_keygen_performance(selbst):
„“„Kyber-Schlüsselgenerierung innerhalb der erwarteten Zeit““defkeygen(): kem = oqs.KeyEncapsulation(„Kyber768“) kem.generate_keypair() stats = self._benchmark(keygen) print(f„\nKyber keygen: {stats['mean']:.2f}ms (±{stats['stdev']:.2f})“)
behaupten Statistiken["bedeuten"] < self.KYBER_KEYGEN_MAX_MS
deftest_sphincs_sign_performance(selbst):
„““SPHINCS+-Signierung innerhalb der erwarteten Zeit““
sig = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“) sig.generate_keypair() sk = sig.export_secret_key() message = b"x" * 256
defZeichen(): signer = oqs.Signature(„SPHINCS+-SHAKE-128s-einfach“, sk) signer.sign(message) stats = self._benchmark(sign, iterations=20) # Weniger aufgrund der Langsamkeit
drucken(f„\nSPHINCS+ sign: {stats['mean']:.2f}ms (±{stats['stdev']:.2f})“)
behaupten Statistiken["bedeuten"] < self.SPHINCS_SIGN_MAX_MS
Ausführen der Testsuite
# Führen Sie alle Tests mit Abdeckung durch
pytest-Tests/ -v --cov=synx_wallet --cov-report=html
# Führen Sie nur KAT-Tests durch
pytest tests/test_kats.py -v
# Mit paralleler Ausführung ausführen
pytest-Tests/ -n auto
# Führen Sie Leistungstests mit Ausgabe durch
pytest tests/test_performance.py -v -s
Testabdeckungsziel
Der SynX quantenresistente Geldbörse sorgt für eine Testabdeckung von über 95 % für den gesamten kryptografischen Code. Kritische Pfade wie die Signaturprüfung erfordern eine 100-prozentige Abdeckung.
Häufig gestellte Fragen
Wo finde ich offizielle Testvektoren für Kyber und SPHINCS+?
NIST bietet offizielle Known Answer Tests (KATs) für alle standardisierten Algorithmen. Kyber-KATs befinden sich im ML-KEM-Spezifikationsanhang, SPHINCS+-KATs in SLH-DSA. Das Open Quantum Safe-Projekt verwaltet außerdem validierte Testvektoren für Liboqs-Implementierungen. Der SynX quantenresistente Geldbörse Die Testsuite enthält NIST-konforme Vektoren.
Wie teste ich Timing-Seitenkanäle im PQC-Code?
Verwenden Sie Tools wie dudect für statistische Timing-Analysen, Valgrind für Client-Anfragen für geheimnisabhängige Zweige und ctgrind für die zeitkonstante Überprüfung. Führen Sie Operationen mit unterschiedlichen Eingaben aus und messen Sie die Varianz – Code mit konstanter Zeit sollte keine zeitliche Korrelation mit geheimen Werten aufweisen.
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) aus der Genesis
Quantensicherheits-Score
95/100 — vs. Bitcoin 12/100, Ethereum 15/100, Monero 18/100
NIST-Standards
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) – fertiggestellt im August 2024
Zeitleiste
Die Entwicklung begann September 2025 · Testnetz Januar 2026 · Mainnet April 2026
Maximales Angebot
77,7 Millionen SynX — Hard-Cap mit deflationärem Anflug
Verteilung
Null vor der Mine. Null ICO. Null VC. Keine Gründerzuteilung. Entwickler-Wallet öffentlich und bewusst nicht privat – im Explorer, in jedem Adressbuch
Sicherheitsüberprüfung
Interne gegnerische Tests und Red-Teaming + öffentliches Bug-Bounty. Vollständige unabhängige Prüfung bei die erste Halbierung, wenn die Quelle mit Audit-Trails geöffnet wird
Bergbau
Argon2id (2 GB Speicherfest) – Anti-ASIC, nur CPU
Privatsphäre
Kein KYC-, P2P-Austausch, rotierende Brenneradressen, Kyber-verschlüsselte Kommunikation
Ältere Wallets (Bitcoin, Ethereum, Monero) verwenden Kryptografie, die Quantencomputer knacken können. Über 469 Milliarden US-Dollar in exponierten Bitcoin-Adressen sind bereits gefährdet.