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.
Beveiligingsaudit Post-Quantum Cryptografiecode: checklist voor ontwikkelaars
📅 Laatst bijgewerkt: 2 augustus 2026🎧 Luister: ~6 min
Post-kwantumcryptografie introduceert nieuwe kwetsbaarheidsklassen die onbekend zijn voor ontwikkelaars die alleen ervaring hebben met klassieke cryptografie. Deze handleiding biedt een uitgebreide checklist voor beveiligingsaudits voor Kyber- en SPHINCS+-implementaties. De SynX kwantumbestendige portemonnee gebruikt deze exacte procedures voor interne codebeoordeling.
Voorbereiding vóór de audit
Documentatie beoordeling
Verzamel essentiële documentatie voordat u de code onderzoekt:
Algoritmespecificatie (NIST FIPS 203/205 voor Kyber/SPHINCS+)
Implementatienotities waarin eventuele afwijkingen van de specificaties worden uitgelegd
Bedreigingsmodeldocument dat de mogelijkheden van tegenstanders definieert
Deze codepatronen kunnen door timing geheime informatie lekken:
# KWETSBAAR: Geheim-afhankelijke takif geheime_bit: do_operation_a() # Ander timingpadanders: do_operation_b()
# KWETSBAAR: Vergelijking van vroegtijdige uittredingzekervergelijk_geheimen(a: bytes, b: bytes) -> bool:
voor i in bereik(len(a)):
if a[i] != b[i]:
opbrengst Vals # Lekt positie van verschil!opbrengst WAAR
# KWETSBAAR: geheimafhankelijke array-toegang
resultaat = opzoektabel[geheime_index] # Cache-timingaanval# KWETSBAAR: Verdeling op basis van geheim
resultaat = waarde / geheime_deler # De timing varieert per deler
Veilige patronen
importeren hmac
# VEILIG: Vergelijking in constante tijdzekerconstante_tijd_vergelijken(a: bytes, b: bytes) -> bool:
"""Vergelijk twee bytestrings in constante tijd"""opbrengst hmac.compare_digest(a, b)
# SECURE: Voorwaardelijk verplaatsingspatroon (cmov).zekerconstante_tijd_select(voorwaarde: int, a: int, b: int) -> int:
""" Selecteer a als voorwaarde==1, anders b Geen vertakking op voorwaarde """# Masker maken: alle 1's als voorwaarde==1, alle 0's als voorwaarde==0
masker = -conditie # -1 = 0xFFFF... in twee-complementopbrengst (a & masker) | (b & ~masker)
# VEILIG: Constante toegang tot de arrayzekerconstante_tijd_lookup(tabel: Lijst[int], geheime_index: int) -> int:
"""Toegang tot tabelelement zonder cache-timinglek"""
resultaat = 0
voor i in bereik(len(tabel)):
# Vergelijk zonder vertakkingen
is_match = constante_tijd_vergelijk(i, geheime_index) resultaat = constante_tijd_select(is_match, tabel[i], resultaat)
opbrengst resultaat
Geautomatiseerde timinganalyse
# Statistische timingtest met behulp van dudect-methodologieimporteren numpig as np
van pittig importeren statistieken
importeren tijd
zekertiming_lek_test( bewerking, input_class_a, # Ingangsgenerator voor klasse A
invoer_klasse_b, # Ingangsgenerator voor klasse B
monsters: int = 10000 ) -> Tupel[bool, zweven]:
""" Test op timingverschillen tussen invoerklassen. Resultaat: (leak_detected, t_statistic) """
tijden_a = [] tijden_b = []
voor _ in bereik (monsters):
# Meet klasse A timing
inp = input_class_a() start = time.perf_counter_ns() operatie(inp) times_a.append(time.perf_counter_ns() - start)
# Meet klasse B-timing
inp = input_class_b() start = time.perf_counter_ns() operatie(inp) times_b.append(time.perf_counter_ns() - start)
# Welch's t-test voor timingverschil
t_stat, p_value = stats.ttest_ind( times_a, times_b, equal_var=False )
# |t| > 4,5 duidt op een timinglek (99,999% betrouwbaarheid)
lek_gedetecteerd = abs(t_stat) > 4.5
opbrengst lek_gedetecteerd, t_stat
# Voorbeeld: Test SPHINCS+-verificatie op timinglekzekertest_verificatie_timing(): sig = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig") pk = sig.generate_keypair() bericht = b"testbericht"
valid_sig = sig.sign(bericht) invalid_sig = bytes([x ^ 0xff voor x in geldige_sig])
zekerverifieer_op(handtekening): sig_check = oqs.Handtekening("SPHINCS+-SHAKE-128s-eenvoudig")
poging: sig_check.verify(bericht, handtekening, pk)
behalve:
doorgang
lek, t = timing_leak_test (verifieer_op,
lambda: geldige_sig,
lambda: ongeldige_sig, monsters=5000 )
if lek: print(v"⚠️ TIMINGLEK GEDETECTEERD (t={t:.2f})")
anders: afdrukken(v"✓ Geen timinglek (t={t:.2f})")
Entropie-audit voor sleutelgeneratie
# Entropiebronvalidatieimporteren os
importeren geheimen
klasEntropyAuditor:
"""Entropiebronnen valideren voor het genereren van sleutels"""zekercheck_entropie_bron(self, source_func) -> dictaat:
"""Test de kwaliteit van de entropiebron"""
monsters = [source_func(32) voor _ in bereik(1000)]
# Voeg alle monsters samen
alle_bytes = b"".join(voorbeelden)
# Bytefrequentieanalyse
frequentie = {}
voor byte in all_bytes: freq[byte] = freq.get(byte, 0) + 1
# Chikwadraattest voor uniformiteit
verwacht = len(all_bytes) / 256 chi_sq = som((f - verwacht) ** 2 / verwacht voor f in freq.waarden())
# Vrijheidsgraden = 255# Kritische waarde voor p=0,01 is ~310
uniform = chi_sq < 310
# Botsingstest
unieke_samples = len(set(samples)) no_collisions = unieke_samples == len(samples)
opbrengst {
"chi_vierkant": chi_sq,
"uniform": uniform,
"unieke_monsters": unieke_voorbeelden,
"totaal_monsters": len(voorbeelden),
"geen_botsingen": geen_botsingen,
"geslaagd": uniform En geen_botsingen }
zekeraudit_keygen(zelf, keygen_func, iteraties: int = 100):
"""Controleer sleutelgeneratie op entropieproblemen"""
sleutels = []
voor _ in bereik(iteraties): pk, sk = keygen_func() sleutels.append((pk, sk))
# Controleer op dubbele sleutels (catastrofaal!)
pk_set = set(pk voor pk, sk in sleutels)
if len(pk_set) != iteraties:
opbrengst {
"status": "KRITISCH",
"bericht": "Dubbele sleutels gegenereerd!"
}
# Controleer de entropie van de publieke sleutel
pk_bytes = b"".join(pk voor pk, sk in sleutels) entropie_per_bit = zelf._schatting_entropie(pk_bytes)
if entropie_per_bit < 0.99:
opbrengst {
"status": "WAARSCHUWING",
"bericht": f"Low key entropie: {entropie_per_bit:.4f} bits/bit"
}
opbrengst {"status": "DOORGANG", "entropie": entropie_per_bit}
zeker_schatting_entropie(zelf, data: bytes) -> float:
"""Schat de Shannon-entropie per bit"""importeren wiskundefreq = {}
voor byte in data: freq[byte] = freq.get(byte, 0) + 1 entropie = 0,0 totaal = len(data)
voor graaf in freq.values(): p = aantal / totale entropie -= p * math.log2(p)
# Normaliseren naar bits per bit (max = 8 voor byte, return per bit)opbrengst entropie / 8
Geheugenbeveiligingsaudit
Belangrijke checklist voor materiaalbehandeling
KRITIEK: Geheime sleutels worden na gebruik op nul gezet
KRITIEK: Het geheugen is vergrendeld (mlock) om swappen te voorkomen
HOOG: Sleutels worden opgeslagen in beveiligde geheugengebieden
HOOG: Kerndumps zijn uitgeschakeld of sluiten sleutelgeheugen uit
MEDIUM: Geen logboekregistratie of debug-uitvoer van sleutelmateriaal
# Veilige sleutelverwerkingspatronenimporteren ctypes
importeren sys
klasSecureKeyBuffer:
""" Beveiligde geheugenbuffer voor cryptografische sleutels Gebruikt door SynX kwantumbestendige portemonnee voor sleutelopslag. """zeker__init__(zelf, maat: int):
# Buffer toewijzen als bytearray (veranderlijk)
self._buffer = bytearray(grootte) self._size = grootte
# Probeer het geheugen te vergrendelen (Linux)if sys.platform == "linux":
poging: libc = ctypes.CDLL("libc.so.6")
# mlock om swappen te voorkomen
addr = ctypes.addressof((ctypes.c_char * size).from_buffer(self._buffer)) libc.mlock(adr, size) self._locked = True
behalve: self._locked = Onwaar
anders: self._locked = Onwaar
zekerschrijven(zelf, gegevens: bytes, offset: int = 0):
""Gegevens naar beveiligde buffer schrijven"""if offset + len(data) > self._size:
salarisverhogingWaardefout("Bufferoverloop") self._buffer[offset:offset + len(data)] = gegevens
zekerlezen(zelf) -> bytes:
"""Lezen uit beveiligde buffer (retourneert kopie)"""opbrengst bytes(self._buffer)
zekerduidelijk(zelf):
"""Bufferinhoud veilig wissen"""# Meerdere overschrijfpassenvoor patroon in [0x00, 0xFF, 0x00]:
voor i in bereik(self._size): self._buffer[i] = patroon
zeker__del__(zelf):
"""Zorg voor opruiming van de afvalinzameling"""
zelf.clear()
# Ontgrendel het geheugen indien vergrendeldif hasattr(zelf, '_vergrendeld') En zelf._vergrendeld:
poging: libc = ctypes.CDLL("libc.so.6") addr = ctypes.addressof( (ctypes.c_char * self._size).from_buffer(self._buffer) ) libc.munlock(adr, self._size)
behalve:
doorgang# Geheugenbeveiligingsauditzekeraudit_key_cleanup(keygen_func) -> dictaat:
"""Controleer of de sleutels correct zijn opgeschoond"""importeren gc
importeren sys
# Genereer sleutels
pk, sk = keygen_func() sk_bytes = bytes(sk) # Kopieer voor latere controle
sk_id = id(sk)
# Sleutel verwijderendel sk gc.collect()
# Zoekgeheugen voor sleutelpatroon (vereenvoudigd)# Gebruik bij echte audits geheugenforensische tools
waarschuwingen = []
# Controleer of er nog steeds naar het object wordt verwezenvoor obj in gc.get_objects():
if isinstance(obj, bytes) En len(obj) > 100:
if sk_bytes[:32] in obj: waarschuwingen.append("Sleutelmateriaal gevonden in het geheugen na verwijdering")
pauzeopbrengst {
"geslaagd": len(waarschuwingen) == 0,
"waarschuwingen": waarschuwingen }
Invoervalidatieaudit
Validatie van openbare sleutels
zekervalidate_kyber_public_key(public_key: bytes) -> bool:
""" Valideer het publieke sleutelformaat van Kyber-768 AUDIT CHECK: Zorg ervoor dat dit wordt aangeroepen vóór enige inkapseling """# Controleer lengte (openbare sleutel Kyber-768 = 1184 bytes)if len(openbare_sleutel) != 1184:
opbrengst Vals
# Sleutel is (ρ || t), waarbij ρ = 32 bytes, t = 1152 bytes# t bestaat uit k=3 polynomen van elk 384 bytes# Valideer dat polynoomcoëfficiënten binnen een geldig bereik liggen# (Dit is vereenvoudigd; echte validatie is complexer)
t_bytes = openbare_sleutel[32:]
# Elke coëfficiënt moet worden gedecodeerd naar een geldig bereik [0, q)# q = 3329 voor Kyber# Volledige validatie zou elke coëfficiënt decoderen en controlerenopbrengst WAAR
zekervalidate_sphincs_public_key(public_key: bytes) -> bool:
""" Valideer het publieke-sleutelformaat van SPHINCS+-SHAKE-128 AUDIT CHECK: Zorg ervoor dat dit wordt aangeroepen vóór enige verificatie """# SPHINCS+-SHAKE-128s publieke sleutel = 32 bytesif len(openbare_sleutel) != 32:
opbrengst Vals
# Publieke sleutel is (PK.seed || PK.root)# Beide zijn willekeurige waarden van 16 bytes, er is geen extra structuur om te validerenopbrengst WAAR
zekervalideer_handtekening(handtekening: bytes, algoritme: str) -> bool:
"""Handtekeningformaat valideren vóór verificatie"""
verwachte_groottes = {
"SPHINCS+-SHAKE-128s": 7856, # de set SynX wordt verzonden"SPHINCS+-SHAKE-128f": 17088,
"SPHINCS+-SHAKE-192s": 16224,
"SPHINCS+-SHAKE-256s": 29792,
}
if algoritme niet binnen verwachte_groottes:
salarisverhogingWaardefout(f"Onbekend algoritme: {algoritme}")
opbrengst len(handtekening) == verwachte_groottes[algoritme]
Volledige auditchecklist
De kwantumbestendige portemonnee SynX gebruikt deze exacte checklist voor alle codebeoordelingen:
1. Cryptografische operaties
Algoritme-implementaties komen overeen met de NIST-specificaties
Known Answer Tests (KAT) slagen voor alle bewerkingen
Grenzen voor afwijzingssteekproeven zijn correct (Kyber)
Het doorlopen van bomen is correct (SPHINCS+)
Instanties van hashfuncties zijn correct (SHAKE, SHA3)
2. Zijkanaalweerstand
Geen geheimafhankelijke takken
Geen geheimafhankelijke geheugentoegangspatronen
Constante tijdvergelijking voor alle geheimen
Geen timingvariatie bij foutafhandeling
Geautomatiseerde timinganalyses passeren
3. Willekeurige nummergeneratie
Maakt gebruik van cryptografisch beveiligde RNG (os.urandom, geheimen)
RNG is op de juiste manier gezaaid
Geen voorspelbare zaden (tijdstempels, PID's)
De entropiebron wordt gevalideerd bij het opstarten
4. Sleutelbeheer
Geheime sleutels worden na gebruik op nul gezet
Sleutelafleiding maakt gebruik van goedgekeurde KDF
Sleutels worden niet geregistreerd of afgedrukt
De sleutelserialisatie is correct
Het geheugen is vergrendeld waar dit wordt ondersteund
5. Invoervalidatie
Het openbare sleutelformaat is gevalideerd
Het handtekeningformaat is gevalideerd
De berichtlengte ligt binnen de perken
Cijfertekstformaat is gevalideerd (Kyber)
Veelgestelde vragen
Wat zijn de meest voorkomende kwetsbaarheden bij de PQC-implementatie?
Veel voorkomende kwetsbaarheden zijn onder meer: 1) Timing-zijkanalen bij polynomiale bewerkingen, 2) Onvoldoende entropie bij het genereren van sleutels, 3) Onjuiste verwijdering van geheime sleutels, 4) Bewerkbaarheid van handtekeningen, 5) Onjuiste afwijzingsbemonsteringsgrenzen, en 6) Niet-gevalideerde formaten voor openbare sleutels. De SynX kwantumbestendige portemonnee Het beveiligingsteam ontdekte ze alle zes in bibliotheken van derden tijdens audits.
Hoe detecteer ik timing-zijkanalen in PQC-code?
Gebruik tools voor constante-tijdanalyse, zoals dudect, ctgrind of timecop. Controleer handmatig alle voorwaardelijke vertakkingen die afhankelijk zijn van geheime waarden. Zorg ervoor dat vergelijkingsbewerkingen constante tijdroutines gebruiken. Test met statistische timingmetingen over verschillende ingangen.
Professionele auditaanbeveling
Voor productie-implementaties kunt u de interne beoordeling aanvullen met beveiligingsaudits van derden van bedrijven die gespecialiseerd zijn in cryptografische implementaties.
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 $250 billion in blootgestelde Bitcoin-adressen lopen al gevaar.