SynergyX Bygget på algoritmerne NIST standardiseret — FIPS 203 (ML-KEM/Kyber-768) og FIPS 205 (SLH-DSA/SPHINCS+). Udgivet 15. januar 2026. Alle kryptografiske påstande kan verificeres i kæden og mod NIST CSRC dokumentation. Nul pre-mine. Nul ICO. Nul VC. Nul grundlæggerallokering. 77,7 millioner hard cap. Udviklerpungen er offentlig og bevidst ikke-privat - i enhver adressebog, på opdagelsesrejsende. Intet af det beder dig om at stole på en person.
Post-kvantekryptografi introducerer nye sårbarhedsklasser, som ikke er kendte for udviklere, der kun har erfaring med klassisk kryptografi. Denne vejledning giver en omfattende sikkerhedsrevisionstjekliste for Kyber- og SPHINCS+-implementeringer. De SynX kvantebestandig pung bruger disse nøjagtige procedurer til intern kodegennemgang.
Forberedelse før revision
Gennemgang af dokumentation
Inden du undersøger koden, skal du indsamle vigtig dokumentation:
Algoritmespecifikation (NIST FIPS 203/205 for Kyber/SPHINCS+)
Implementeringsnoter, der forklarer eventuelle afvigelser fra spec
Trusselsmodeldokument, der definerer modstanderens evner
Tidligere revisionsrapporter og deres afhjælpningsstatus
Kendte svartests (KAT) fra NIST indsendelse
Værktøjsopsætning
# Væsentlige sikkerhedsrevisionsværktøjer# Statisk analyse
pip installer bandit semgrep flake8-security
# Tidsanalyse
git klon https://github.com/oreparaz/dudect
# Fuzzing
pip installer atheris python-afl hypotese
# Hukommelsesanalyse# Valgrind til C/C++, memory_profiler til Python
pip installer memory_profiler
# Til Rust-implementeringer
last installer last-audit last-benægt
Kritiske sårbarhedskategorier
Kategori
Sværhedsgrad
Eksempel
Indvirkning
Timing Side-kanaler
KRITISK
Hemmelighedsafhængige grene
Nøglegendannelse
Utilstrækkelig entropi
KRITISK
Svag RNG seeding
Nøgleforudsigelse
Nøglemateriale Lækage
KRITISK
Taster i swap/crash dumps
Nøgleeksponering
Signatur formbarhed
HØJ
Ikke-unikke signaturer
Genafspilning af transaktion
Validering af input
HØJ
Ugyldige offentlige nøgler accepteret
Forskellige angreb
Hukommelsessikkerhed
HØJ
Buffer løber over
RCE, nøgleudtræk
Timing Side-Channel Analyse
Manual Code Review Mønstre
Sårbare mønstre at søge efter
Disse kodemønstre kan lække hemmelige oplysninger gennem timing:
# SÅRBAR: Hemmelighedsafhængig grenif hemmelig_bit: do_operation_a() # Forskellig timing stiandet: do_operation_b()
# SÅRBAR: Sammenligning med tidlig exitdefsammenligne_hemmeligheder(a: bytes, b: bytes) -> bool:
for i in interval(len(a)):
if a[i] != b[i]:
returnere falsk # Lækager position af forskel!returnere ægte
# SÅRBAR: Hemmelighedsafhængig arrayadgang
resultat = opslagstabel[hemmeligt_indeks] # Cache timing angreb# SÅRBAR: Inddeling efter hemmelighed
resultat = værdi / hemmelig_divisor # Timing varierer efter divisor
Sikre mønstre
importere hmac
# SIKKER: Konstant-tids sammenligningdefkonstant_tid_sammenlign(a: bytes, b: bytes) -> bool:
"""Sammenlign to byte strenge i konstant tid"""returnere hmac.compare_digest(a, b)
# SIKKER: Betinget træk (cmov) mønsterdefkonstant_tid_vælg(betingelse: int, a: int, b: int) -> int:
""" Vælg a hvis betingelse==1, ellers b Ingen forgrening på betingelsen """# Opret maske: alle 1'ere hvis betingelse==1, alle 0'ere hvis betingelse==0
maske = -tilstand # -1 = 0xFFFF... i to's komplementreturnere (a & maske) | (b & ~maske)
# SIKKER: Konstant-tids array-adgangdefkonstant_tidsopslag(tabel: Liste[int], hemmeligt_indeks: int) -> int:
"""Adgang til tabelelement uden cache-timinglækage"""
resultat = 0
for i in range(len(tabel)):
# Sammenlign uden forgrening
is_match = konstant_tid_sammenlign(i, hemmeligt_indeks) resultat = konstant_tidspunkt_vælg(er_match, tabel[i], resultat)
returnere resultat
Automatiseret tidsanalyse
# Statistisk timingtest ved hjælp af dudect-metodologiimportere nusset as np
fra krydret importere statistik
importere tid
deftiming_leak_test(operation, input_class_a, # Inputgenerator til klasse A
input_class_b, # Inputgenerator til klasse B
prøver: int = 10000 ) -> Tuple[bool, flyd]:
""" Test for tidsforskelle mellem inputklasser Returnerer: (leak_detected, t_statistic) """
gange_a = [] gange_b = []
for _ in interval (prøver):
# Mål klasse A timing
inp = input_class_a() start = time.perf_counter_ns() operation(inp) times_a.append(time.perf_counter_ns() - start)
# Mål klasse B timing
inp = input_class_b() start = time.perf_counter_ns() operation(inp) times_b.append(time.perf_counter_ns() - start)
# Welchs t-test for tidsforskel
t_stat, p_value = stats.ttest_ind( times_a, times_b, equal_var=False )
# |t| > 4,5 tyder på timinglækage (99,999% konfidens)
leak_detected = abs(t_stat) > 4.5
returnere leak_detected, t_stat
# Eksempel: Test SPHINCS+-verifikation for timinglækagedeftest_verification_timing(): sig = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt") pk = sig.generate_keypair() besked = b"test besked"
valid_sig = sig.sign(message) invalid_sig = bytes([x ^ 0xff for x in valid_sig])
defverify_op(signatur): sig_check = oqs.Signatur("SPHINCS+-SHAKE-128s-simpelt")
prøve: sig_check.verify(besked, signatur, pk)
undtagen:
passere
læk, t = timing_leak_test( verify_op,
lambda: valid_sig,
lambda: invalid_sig, samples=5000 )
if lækage: print(f"⚠️ TIMING LÆKA DETECTED (t={t:.2f})")
andet: print(f"✓ Ingen timinglækage (t={t:.2f})")
Key Generation Entropy Audit
# Entropikildevalideringimportere os
importere hemmeligheder
klasseEntropyAuditor:
"""Valider entropikilder til nøglegenerering"""defcheck_entropy_source(selv, source_func) -> dikt:
"""Test entropikildekvalitet"""
samples = [source_func(32) for _ in range(1000)]
# Sammenkæd alle prøver
alle_bytes = b"".join(eksempler)
# Byte frekvens analyse
frekv = {}
for byte in alle_bytes: freq[byte] = freq.get(byte, 0) + 1
# Chi-square test for ensartethed
forventet = len(alle_bytes) / 256 chi_sq = sum((f - forventet) ** 2 / forventet for f in freq.values())
# Frihedsgrader = 255# Kritisk værdi for p=0,01 er ~310
uniform = chi_sq < 310
# Kollisionstest
unikke_samples = len(sæt(prøver)) ingen_kollisioner = unikke_prøver == len(prøver)
returnere {
"chi_square": chi_sq,
"uniform": uniform,
"unikke_eksempler": unikke_eksempler,
"sample_samples": len(prøver),
"ingen_kollisioner": ingen_kollisioner,
"bestået": uniform og ingen_kollisioner }
defaudit_keygen(selv, keygen_func, iterationer: int = 100):
"""Revisionsnøglegenerering for entropiproblemer"""
nøgler = []
for _ in område(iterationer): pk, sk = keygen_func() keys.append((pk, sk))
# Tjek for duplikerede nøgler (katastrofisk!)
pk_set = sæt(pk for pk, sk in nøgler)
if len(pk_set) != iterationer:
returnere {
"status": "KRITISK",
"besked": "Duplikatnøgler genereret!"
}
# Tjek offentlig nøgleentropi
pk_bytes = b"".tilslut(pk for pk, sk in nøgler) entropy_per_bit = self._estimate_entropy(pk_bytes)
if entropi_per_bit < 0.99:
returnere {
"status": "ADVARSEL",
"besked": f"Lav nøgle entropi: {entropy_per_bit:.4f} bit/bit"
}
returnere {"status": "PASSERE", "entropi": entropy_per_bit}
def_estimere_entropi(selv, data: bytes) -> float:
"""Estimer Shannon entropi pr. bit"""importere matematisk frekv = {}
for byte in data: freq[byte] = freq.get(byte, 0) + 1 entropi = 0,0 i alt = len(data)
for tælle in freq.values(): p = antal / total entropi -= p * math.log2(p)
# Normaliser til bit pr. bit (maks. = 8 for byte, retur pr. bit)returnere entropi / 8
Hukommelsessikkerhedsrevision
Tjekliste til nøglematerialehåndtering
KRITISK: Hemmelige nøgler nulstilles efter brug
KRITISK: Hukommelsen er låst (mlock) for at forhindre ombytning
HØJ: Nøgler gemmes i sikre hukommelsesområder
HØJ: Kernedumps er deaktiveret eller udelukker nøglehukommelse
MEDIUM: Ingen logning eller fejlretning af nøglemateriale
# Sikre nøglehåndteringsmønstreimportere ctyper
importere sys
klasseSecureKeyBuffer:
""" Sikker hukommelsesbuffer til kryptografiske nøgler Brugt af SynX kvantebestandig tegnebog til nøglelagring. """def__init__(selv, størrelse: int):
# Tildel buffer som bytearray (kan ændres)
self._buffer = bytearray(størrelse) self._size = størrelse
# Prøv at låse hukommelsen (Linux)if sys.platform == "linux":
prøve: libc = ctypes.CDLL("libc.so.6")
# mlock for at forhindre ombytning
addr = ctypes.addressof((ctypes.c_char * size).from_buffer(self._buffer)) libc.mlock(addr, size) self._locked = Sand
undtagen: self._locked = Falsk
andet: self._locked = Falsk
defskrive(selv, data: bytes, offset: int = 0):
"""Skriv data til sikker buffer"""if offset + len(data) > self._size:
hæveValueError("Bufferoverløb") self._buffer[offset:offset + len(data)] = data
deflæse(selv) -> bytes:
"""Læs fra sikker buffer (returnerer kopi)"""returnere bytes(selv._buffer)
defklar(selv):
"""Slet bufferindhold sikkert"""# Flere overskrivningerfor mønster in [0x00, 0xFF, 0x00]:
for i in range(self._size): self._buffer[i] = mønster
def__del__(selv):
"""Sørg for oprydning ved affaldsindsamling"""
self.clear()
# Lås hukommelse op, hvis den er låstif hasattr(selv, '_låst') og self._locked:
prøve: libc = ctypes.CDLL("libc.so.6") addr = ctypes.addressof( (ctypes.c_char * self._size).from_buffer(self._buffer) ) libc.munlock(addr, self._size)
undtagen:
passere# Hukommelsessikkerhedsrevisiondefaudit_key_cleanup(keygen_func) -> dikt:
"""Bekræft, at nøglerne er ryddet ordentligt op"""importere gc
importere sys
# Generer nøgler
pk, sk = keygen_func() sk_bytes = bytes(sk) # Kopiér til senere kontrol
sk_id = id(sk)
# Slet nøgledel sk gc.collect()
# Søg hukommelse efter nøglemønster (forenklet)# I ægte revision, brug hukommelsestekniske værktøjer
advarsler = []
# Tjek, om objektet stadig refereres tilfor obj in gc.get_objects():
if isinstance(obj, bytes) og len(obj) > 100:
if sk_bytes[:32] in obj: advarsler.append("Nøglemateriale fundet i hukommelsen efter sletning")
pausereturnere {
"bestået": len(advarsler) == 0,
"advarsler": advarsler }
Input Validering Audit
Offentlig nøglevalidering
defvalider_kyber_offentlig_nøgle(public_key: bytes) -> bool:
""" Valider Kyber-768 offentlig nøgleformat AUDIT CHECK: Sørg for, at dette kaldes før enhver indkapsling """# Tjek længde (Kyber-768 offentlig nøgle = 1184 bytes)if len(offentlig_nøgle) != 1184:
returnere falsk
# Nøglen er (ρ || t), hvor ρ = 32 bytes, t = 1152 bytes# t består af k=3 polynomier på hver 384 bytes# Validering af polynomielle koefficienter er inden for et gyldigt område# (Dette er forenklet; reel validering er mere kompleks)
t_bytes = offentlig_nøgle[32:]
# Hver koefficient skal afkode til gyldigt område [0, q)# q = 3329 for Kyber# Fuld validering ville afkode og kontrollere hver koefficientreturnere ægte
defvalidate_sphincs_public_key(public_key: bytes) -> bool:
""" Valider SPHINCS+-SHAKE-128s offentlige nøgleformat AUDIT CHECK: Sørg for, at dette kaldes før enhver bekræftelse """# SPHINCS+-SHAKE-128s offentlige nøgle = 32 bytesif len(offentlig_nøgle) != 32:
returnere falsk
# Offentlig nøgle er (PK.seed || PK.root)# Begge er 16-byte tilfældige værdier, ingen yderligere struktur at validerereturnere ægte
defvalider_signatur(signatur: bytes, algoritme: str) -> bool:
"""Valider signaturformat før bekræftelse"""
forventede_størrelser = {
"SPHINCS+-SHAKE-128s": 7856, # sættet SynX afsendes"SPHINCS+-SHAKE-128f": 17088,
"SPHINCS+-SHAKE-192s": 16224,
"SPHINCS+-SHAKE-256s": 29792,
}
if algoritme ikke i forventede_størrelser:
hæveValueError(f"Ukendt algoritme: {algoritme}")
returnere len(signatur) == forventede_størrelser[algoritme]
Udfyld revisionstjeklisten
Den kvanteresistente SynX pung bruger denne nøjagtige tjekliste til alle kodeanmeldelser:
Kendte svar-tests (KAT) består for alle operationer
Grænser for afvisningsprøvetagning er korrekte (Kyber)
Trægennemgang er korrekt (SPHINCS+)
Hash-funktionsinstanser er korrekte (SHAKE, SHA3)
2. Sidekanalmodstand
Ingen hemmelighedsafhængige grene
Ingen hemmelighedsafhængige hukommelsesadgangsmønstre
Konstant-tids sammenligning for alle hemmeligheder
Ingen tidsvariation i fejlhåndtering
Automatiseret timinganalyse passerer
3. Generering af tilfældige tal
Bruger kryptografisk sikker RNG (os.urandom, hemmeligheder)
RNG er korrekt seedet
Ingen forudsigelige frø (tidsstempler, PID'er)
Entropikilden valideres ved opstart
4. Nøglestyring
Hemmelige nøgler nulstilles efter brug
Nøgleafledning bruger godkendt KDF
Nøgler logges eller udskrives ikke
Nøgleserialisering er korrekt
Hukommelsen er låst, hvor det understøttes
5. Inputvalidering
Offentlig nøgleformat er valideret
Signaturformat er valideret
Meddelelseslængder er inden for grænserne
Ciphertext format er valideret (Kyber)
Ofte stillede spørgsmål
Hvad er de mest almindelige PQC-implementeringssårbarheder?
Almindelige sårbarheder omfatter: 1) Timing af sidekanaler i polynomielle operationer, 2) Utilstrækkelig entropi i nøglegenerering, 3) Ukorrekt sletning af hemmelige nøgler, 4) Signaturformbarhed, 5) Ukorrekte afvisningsprøvegrænser og 6) Uvaliderede offentlige nøgleformater. De SynX kvantebestandig pung sikkerhedsteam opdagede alle seks i tredjepartsbiblioteker under revisioner.
Hvordan registrerer jeg timing side-kanaler i PQC kode?
Brug konstanttidsanalyseværktøjer som dudect, ctgrind eller timecop. Gennemgå manuelt alle betingede grene, der afhænger af hemmelige værdier. Sørg for, at sammenligningsoperationer bruger konstanttidsrutiner. Test med statistiske tidsmålinger på tværs af forskellige input.
Professionel revisionsanbefaling
For produktionsimplementeringer skal du supplere intern gennemgang med tredjeparts sikkerhedsrevisioner fra firmaer, der er specialiseret i kryptografiske implementeringer.
Ældre tegnebøger (Bitcoin, Ethereum, Monero) bruger kryptografi, som kvantecomputere kan bryde. Over $250 billion i udsatte Bitcoin-adresser er allerede i fare.