====== std.crypto.pqc.hybrid ====== Hybrid-KEM kombiniert **X25519** (klassisch) und **ML-KEM-768** (post-quantum) zu einem einzigen KEM. Beide Shared Secrets werden via SHAKE-256 zu einem gemeinsamen 32-Byte-Schlüssel kombiniert. **Prinzip:** Schützt auch dann, wenn ein der beiden Verfahren kompromittiert wird — der Angreifer muss sowohl X25519 als auch ML-KEM brechen. Dieses Schema wird von Signal, Google (Chrome) und Apple (iMessage PQ3) eingesetzt. import std.crypto.pqc.hybrid; → [[lyx_-_programmiersprache:units:crypto:pqc|std.crypto.pqc]] · [[lyx_-_programmiersprache:units:crypto:pqc:mlkem|std.crypto.pqc.mlkem]] · [[lyx_-_programmiersprache:units:crypto:pqc:pqc|std.crypto.pqc.pqc (High-Level API)]] ---- ===== Schlüsselgrößen ===== ^ Größe ^ Wert ^ Zusammensetzung ^ | Public Key | 1216 B | X25519-PK (32) + ML-KEM-768-PK (1184) | | Secret Key | 2432 B | X25519-SK (32) + ML-KEM-768-SK (2400) | | Ciphertext | 1120 B | X25519-CT (32, ephemerer PK) + ML-KEM-768-CT (1088) | | Shared Secret | 32 B | SHAKE-256(ss_x25519 || ss_mlkem || ct_x25519 || ct_mlkem) | ---- ===== Konstanten ===== ^ Konstante ^ Wert ^ Bedeutung ^ | ''HYBRID_PK'' | 1216 | Public-Key-Größe in Bytes | | ''HYBRID_SK'' | 2432 | Secret-Key-Größe in Bytes | | ''HYBRID_CT'' | 1120 | Ciphertext-Größe in Bytes | | ''HYBRID_SS'' | 32 | Shared-Secret-Länge in Bytes | ---- ===== Funktionen ===== ^ Funktion ^ Beschreibung ^ | ''HybridKEMKeyGen(seed, pk, sk)'' | Erzeugt Schlüsselpaar. seed: 64 Bytes = seed_x25519[0..31] + seed_mlkem[32..95]. pk: HYBRID_PK Bytes; sk: HYBRID_SK Bytes. | | ''HybridKEMEncapsulate(pk, rand, ct, ss)'' | Erzeugt Ciphertext und 32-Byte Shared Secret. rand: 64 Bytes = rand_x25519[0..31] + rand_mlkem[32..63]. | | ''HybridKEMDecapsulate(sk, ct, ss)'' | Rekonstruiert Shared Secret aus SK und CT. | ---- ===== Verwendungsbeispiel ===== import std.crypto.pqc.hybrid; import std.crypto.rand; import std.alloc; fn main(): int64 { // Schlüsselpaar erzeugen var seed: int64 := alloc(64); RandBytesExact(seed, 64); var pk: int64 := alloc(HYBRID_PK); var sk: int64 := alloc(HYBRID_SK); HybridKEMKeyGen(seed, pk, sk); // Sender: kapselt Shared Secret ein var rand: int64 := alloc(64); RandBytesExact(rand, 64); var ct: int64 := alloc(HYBRID_CT); var ss_enc: int64 := alloc(HYBRID_SS); HybridKEMEncapsulate(pk, rand, ct, ss_enc); // Empfänger: rekonstruiert Shared Secret var ss_dec: int64 := alloc(HYBRID_SS); HybridKEMDecapsulate(sk, ct, ss_dec); // ss_enc == ss_dec free(seed, 64); free(rand, 64); free(pk, HYBRID_PK); free(sk, HYBRID_SK); free(ct, HYBRID_CT); free(ss_enc, HYBRID_SS); free(ss_dec, HYBRID_SS); return 0; } ---- ===== Sicherheitseigenschaften ===== ^ Eigenschaft ^ Ergebnis ^ | Klassische Sicherheit | X25519 (Curve25519, ~128-Bit) | | Quantensicherheit | ML-KEM-768 (FIPS 203, ~120-Bit Quantum) | | Kombinations-Sicherheit | Angreifer muss beide Verfahren brechen | | KDF | SHAKE-256(ss_x || ss_k || ct_x || ct_k) — bindet CT in den Key ein (Forward Secrecy) | | Verbreitung | Signal Protocol PQXDHv2, Google Chrome CECPQ2, Apple PQ3 (analoges Schema) | Letzte Aktualisierung: 2026-06-08