====== std.crypto.pqc.mlkem ======
ML-KEM (CRYSTALS-Kyber, **NIST FIPS 203**) ist ein Key Encapsulation Mechanism (KEM). Er ersetzt ECDH und RSA-OAEP. Die Sicherheit basiert auf dem Module Learning With Errors (MLWE)-Problem, das als quantensicher gilt.
**Klassifikation:** Asymmetrischer KEM — erzeugt einen gemeinsamen Schlüssel (Shared Secret), der dann als symmetrischer Schlüssel verwendet wird.
import std.crypto.pqc.mlkem;
→ [[lyx_-_programmiersprache:units:crypto:pqc|std.crypto.pqc]] · [[lyx_-_programmiersprache:units:crypto:pqc:pqc|std.crypto.pqc.pqc (High-Level API)]] · [[lyx_-_programmiersprache:units:crypto|std.crypto]]
----
===== Sicherheitsstufen =====
ML-KEM bietet drei Stufen, die über den Parameter ''k'' gesteuert werden:
^ Stufe ^ k ^ Klassische Sicherheit ^ Quantensicherheit ^ Empfehlung ^
| ML-KEM-512 | 2 | AES-128-äquivalent | ~100-Bit | Eingeschränkte Ressourcen |
| ML-KEM-768 | 3 | AES-192-äquivalent | ~120-Bit | **Standardwahl** |
| ML-KEM-1024 | 4 | AES-256-äquivalent | ~160-Bit | Höchste Sicherheit |
**Empfehlung:** ML-KEM-768 (k=3) ist der NIST-Standard für die meisten Anwendungen (analog zu ECDH-P256 heute).
----
===== Konstanten =====
^ Konstante ^ Wert ^ Bedeutung ^
| ''MLKEM512_PK'' | 800 | Public-Key-Größe ML-KEM-512 in Bytes |
| ''MLKEM512_SK'' | 1632 | Secret-Key-Größe ML-KEM-512 in Bytes |
| ''MLKEM512_CT'' | 768 | Ciphertext-Größe ML-KEM-512 in Bytes |
| ''MLKEM768_PK'' | 1184 | Public-Key-Größe ML-KEM-768 in Bytes |
| ''MLKEM768_SK'' | 2400 | Secret-Key-Größe ML-KEM-768 in Bytes |
| ''MLKEM768_CT'' | 1088 | Ciphertext-Größe ML-KEM-768 in Bytes |
| ''MLKEM1024_PK'' | 1568 | Public-Key-Größe ML-KEM-1024 in Bytes |
| ''MLKEM1024_SK'' | 3168 | Secret-Key-Größe ML-KEM-1024 in Bytes |
| ''MLKEM1024_CT'' | 1568 | Ciphertext-Größe ML-KEM-1024 in Bytes |
SK-Layout: ''dk_pke (384·k)'' || ''ek (384·k+32)'' || ''H(ek) (32)'' || ''z (32)''
----
===== Funktionen =====
^ Funktion ^ Beschreibung ^
| ''MLKEMKeyGen(seed, k, pk, sk): int64'' | Erzeugt Schlüsselpaar aus 64-Byte-Seed. seed[0..31]=d, seed[32..63]=z. Gibt 0 zurück. |
| ''MLKEMEncapsulate(pk, k, randomness, ct, sharedKey): int64'' | Erzeugt ct und 32-Byte sharedKey aus Public Key und 32-Byte-Zufall. Gibt 0 zurück. |
| ''MLKEMDecapsulate(sk, k, ct, sharedKey): int64'' | Rekonstruiert sharedKey aus Secret Key und Ciphertext. Implizite Ablehnung: falscher CT → pseudozufälliger Key (kein Fehler-Code). Gibt 0 zurück. |
Alle Puffer sind caller-alloziert. Größen aus den Konstanten oben.
**Wichtig — Implizite Ablehnung:** ''MLKEMDecapsulate'' gibt bei manipuliertem Ciphertext einen deterministischen Pseudo-Key zurück (kein -1). Der Unterschied zu einem echten Key ist von außen nicht erkennbar (constant-time). Das ist beabsichtigt (FIPS 203 §6.4).
----
===== Verwendungsbeispiel =====
import std.crypto.pqc.mlkem;
import std.crypto.rand;
import std.alloc;
fn main(): int64 {
// Schlüsselpaar erzeugen (ML-KEM-768, k=3)
var seed: int64 := alloc(64);
RandBytesExact(seed, 64);
var pk: int64 := alloc(MLKEM768_PK);
var sk: int64 := alloc(MLKEM768_SK);
MLKEMKeyGen(seed, 3, pk, sk);
// Sender: kapselt Shared Secret ein
var rand: int64 := alloc(32);
RandBytesExact(rand, 32);
var ct: int64 := alloc(MLKEM768_CT);
var ss_enc: int64 := alloc(32);
MLKEMEncapsulate(pk, 3, rand, ct, ss_enc);
// Empfänger: rekonstruiert Shared Secret
var ss_dec: int64 := alloc(32);
MLKEMDecapsulate(sk, 3, ct, ss_dec);
// ss_enc == ss_dec (wenn ct unmanipuliert)
free(seed, 64); free(rand, 32);
free(pk, MLKEM768_PK); free(sk, MLKEM768_SK);
free(ct, MLKEM768_CT); free(ss_enc, 32); free(ss_dec, 32);
return 0;
}
**Hinweis:** Für den einfachsten Einstieg → [[lyx_-_programmiersprache:units:crypto:pqc:pqc|std.crypto.pqc.pqc]] verwenden (High-Level API, kein manuelles k/Seedhandling).
----
===== Sicherheitseigenschaften =====
^ Eigenschaft ^ Ergebnis ^
| NIST-Standard | FIPS 203 (2024) — offiziell standardisiert |
| Quantensicherheit | IND-CCA2 im QROM; Grover-Bound je nach Stufe |
| Klassische Sicherheit | MLWE-Härte (strukturell sicherer als RSA/ECDH gegen Quantenrechner) |
| Constant-Time | Implizite Ablehnung CT-sicher via CTMemEqual/CTSelect |
| Interoperabilität | FIPS 203 kompatibel (Wire-Format identisch mit liboqs, BoringSSL) |
Letzte Aktualisierung: 2026-06-08