====== std.crypto.keccak ====== Keccak-f[1600]-Permutation (NIST FIPS 202), 24 Runden. Implementiert SHA-3/256, SHA-3/512, SHAKE-128 und SHAKE-256. Intern genutzt von ML-KEM, ML-DSA und SLH-DSA — direkt nutzbar wenn SHA-3 oder XOF-Output benötigt wird. import std.crypto.keccak; → [[lyx_-_programmiersprache:units:crypto|std.crypto]] · [[lyx_-_programmiersprache:units|Standard Library]] ---- ===== Konstanten ===== ^ Konstante ^ Wert ^ Bedeutung ^ | ''KECCAK_STATE_SIZE'' | 200 | Zustandsgröße in Bytes (1600 Bit = 25 × uint64) | **Interne Rates (nicht als Konstanten, aber relevant für Low-Level-API):** ^ Funktion ^ Rate ^ Kapazität ^ Output ^ | SHA3_256 | 136 Bytes | 512 Bit | 32 Bytes | | SHA3_512 | 72 Bytes | 1024 Bit | 64 Bytes | | SHAKE128 | 168 Bytes | 256 Bit | variabel | | SHAKE256 | 136 Bytes | 512 Bit | variabel | ---- ===== Funktionen ===== **High-Level (empfohlen):** ^ Funktion ^ Beschreibung ^ | ''SHA3_256(data, len, out)'' | SHA-3/256-Hash: 32 Bytes Output. FIPS 202, Pad 0x06 | | ''SHA3_512(data, len, out)'' | SHA-3/512-Hash: 64 Bytes Output. FIPS 202, Pad 0x06 | | ''SHAKE128(data, len, out, outLen)'' | SHAKE-128 XOF: beliebig viele Output-Bytes. Pad 0x1F | | ''SHAKE256(data, len, out, outLen)'' | SHAKE-256 XOF: beliebig viele Output-Bytes. Pad 0x1F | **Low-Level (für Streaming oder eigene Konstruktionen):** ^ Funktion ^ Beschreibung ^ | ''KeccakInit(state)'' | Setzt 200-Byte-State auf 0 | | ''KeccakAbsorb(state, data, len, rate, pad)'' | Absorb-Phase mit Multi-Rate-Padding | | ''KeccakSqueeze(state, out, outLen, rate)'' | Squeeze-Phase: extrahiert outLen Bytes | ---- ===== Verwendungsbeispiele ===== **SHA-3/256 (feste Ausgabelänge):** import std.crypto.keccak; import std.alloc; fn main(): int64 { var msg: pchar := "Hello, SHA-3!"c; var hash: int64 := alloc(32); SHA3_256(msg as int64, 13, hash); // hash[0..31] = SHA-3/256-Digest free(hash, 32); return 0; } **SHAKE-256 als XOF (beliebige Ausgabelänge, z. B. 64 Bytes):** import std.crypto.keccak; import std.alloc; fn main(): int64 { var seed: pchar := "my-seed-data"c; var out: int64 := alloc(64); SHAKE256(seed as int64, 12, out, 64); // out[0..63] = 64 Bytes SHAKE-256-Output free(out, 64); return 0; } **Low-Level Streaming (große Nachrichten, blockweise):** import std.crypto.keccak; import std.alloc; fn hashLarge(data: int64, len: int64, out: int64) { var state: int64 := alloc(KECCAK_STATE_SIZE); KeccakInit(state); KeccakAbsorb(state, data, len, 136, 0x06); // rate=136, pad=SHA-3 KeccakSqueeze(state, out, 32, 136); free(state, KECCAK_STATE_SIZE); } ---- ===== SHA-3 vs. SHA-256 Vergleich ===== ^ Eigenschaft ^ SHA-256 (SHA-2) ^ SHA-3/256 (Keccak) ^ | Standard | FIPS 180-4 | FIPS 202 | | Konstruktion | Merkle-Damgård | Sponge (Keccak) | | Output-Länge | 32 Bytes (fest) | 32 Bytes (fest) | | Strukturell unabhängig von SHA-2 | Nein | **Ja** | | XOF-Modus | Nein | **Ja** (SHAKE) | | Typischer Einsatz | TLS, Zertifikate | PQC, ZKP, SHAKE-basierte PRFs | → Für klassisches Hashing: [[lyx_-_programmiersprache:units:crypto:sha256|std.crypto.sha256]] (schneller auf x86_64 mit SHA-NI). Letzte Aktualisierung: 2026-06-08