Kryptographie in Lyx
Dieser Guide erklärt alle kryptografischen Units der Lyx-Standardbibliothek, vergleicht ähnliche Optionen und gibt klare Empfehlungen, was wann verwendet werden sollte.
→ std.crypto (Unit-Referenz) · Welche Unit? · Standard Library
Alle Krypto-Units im Überblick
| Unit | Kategorie | Empfehlung |
|---|---|---|
| std.crypto.aes | Symmetrische Verschlüsselung | Standardwahl; NIST-zertifiziert |
| std.crypto.pqc.dadq | Sym. Auth. Cipher (experimentell) | Authentifizierung ohne separaten MAC; Quantum-aware |
| std.crypto.sha256 | Kryptografischer Hash | Standardwahl für neue Projekte |
| std.crypto.hmac | MAC / Integrität | AES-CBC absichern; API-Authentifizierung |
| std.crypto.ecc | Digitale Signatur | Einzige Signatur-Option in std.crypto |
| std.crypto.rand | CSPRNG | Für alle Schlüssel und IVs |
| std.crypto.sha1 | Legacy-Hash | Nur für vorgeschriebene Protokolle |
| std.crypto.md5 | Legacy-Hash | Nur für vorgeschriebene Protokolle |
Symmetrische Verschlüsselung: AES vs DADQ
Die beiden Optionen für symmetrische Verschlüsselung unterscheiden sich fundamental:
| Eigenschaft | AES-CBC (std.crypto.aes) | DADQ-SYM (std.crypto.pqc.dadq) |
|---|---|---|
| Standard | NIST FIPS 197, AES — weltweit anerkannt | Experimentell, kein NIST-Standard |
| Authentifizierung | Nein — nur Vertraulichkeit | Ja — integrierter Integrity-Check |
| Quantum-Sicherheit | AES-128: 64-Bit; AES-256: 128-Bit (Grover) | 128-Bit (Grover-Bound 2¹²⁸) |
| Ciphertext-Overhead | 0 (Blockgröße 16 Bytes, PKCS#7-Padding) | 64 Bytes (commit + hash_mr) |
| Key-Größe | AES-128: 16B; AES-256: 32B | master_seed: 32B; T_pub: 65536B |
| Performance | Schnell (Tabellen-basiert) | Langsamer (große Tabelle, DRBG-Expansion) |
| Compliance (DO-178C, FIPS) | Ja | Nein |
| Reines Lyx, keine ext. Deps | Ja | Ja |
Wann AES-CBC:
- Compliance-Anforderungen (FIPS, DO-178C, ISO 27001)
- Interoperabilität mit anderen Systemen (TLS, Dateiverschlüsselung)
- Performance kritisch
- Bekannte, auditierte Konstruktion bevorzugt
Wann DADQ-SYM / DADQ-FO:
- Authentifizierte Verschlüsselung ohne separaten MAC-Schritt gewünscht
- Kein externer Standard erforderlich
- Quantum-Aspekte relevant, aber ML-KEM nicht verfügbar/nötig
- Reine Lyx-Implementierung ohne Einschränkung durch Patente oder Lizenzfragen
Kombination: AES-CBC ist nicht authentifiziert — für Manipulationsschutz immer std.crypto.hmac (HMAC-SHA256) nachschalten:
// Encrypt-then-MAC (Standardmuster für AES-CBC)
AES256CBCEncrypt(key, iv, plain, plain_len, cipher);
HMAC_SHA256(mac_key, cipher, cipher_len, mac);
// Übertragen: iv || cipher || mac
DADQ übernimmt Verschlüsselung und MAC in einem Schritt.
Die drei DADQ-Modi
DADQ hat drei Nutzungsmodi mit unterschiedlichen Sicherheitsgarantien:
| Modus | Funktionen | Sicherheit | Wann |
|---|---|---|---|
| Basis | dadqEnc / dadqDec | IND-CPA | Wenn T_pub bereits vorhanden / weitergegeben |
| Sym | dadqSymEnc / dadqSymDec | IND-CPA | Rein symmetrisch — T_pub bleibt intern, nie öffentlich |
| FO | dadqFOEnc / dadqFODec | IND-CCA2 | Neue Anwendungen; stärkste Garantie |
Basis-Modus (dadqEnc): Verschlüsselt mit T_pub (65536-Byte-Tabelle als „öffentlicher„ Schlüssel). Geeignet wenn beide Parteien T_pub kennen. Randomisiert — unterschiedliche Ciphertexte für gleiche Klartexte.
Sym-Modus (dadqSymEnc): T_pub wird intern abgeleitet und nie weitergegeben — schützt dadurch gegen den strukturellen col_inv-Angriff auf T_pub. Empfohlen gegenüber Basis-Modus wenn keine Kompatibilität zu Basis-API nötig.
FO-Modus (dadqFOEnc): Fujisaki-Okamoto Transform — r_seed wird deterministisch aus dem Klartext via HMAC berechnet. Dadurch ist Wiederverschlüsselung möglich und CCA2-Sicherheit beweisbar. Der Dec-Check ist nicht-tautologisch (``HMAC(key_fo, m_dec) == r_seed``). Empfohlen für alle neuen Anwendungen.
// FO-Modus: einfachste sichere Variante
var sk_fo: int64 := alloc(DADQ_FO_SK_LEN);
dadqFOKeyGenRand(sk_fo); // interner CSPRNG-Seed, wird nach Ableitung gelöscht
dadqFOEnc(sk_fo, m, m_len, c);
var rc: int64 := dadqFODec(sk_fo, c, c_len, m_out); // -1 bei Manipulation
dadqZeroize(sk_fo, DADQ_FO_SK_LEN);
Hashfunktionen: SHA-256 vs SHA-1 vs MD5
| Eigenschaft | SHA-256 | SHA-1 | MD5 |
|---|---|---|---|
| Digest-Größe | 256 Bit (32 Bytes) | 160 Bit (20 Bytes) | 128 Bit (16 Bytes) |
| Kollisionen bekannt | Nein | Ja (SHAttered 2017) | Ja (seit 2004) |
| Präimage-Resistenz | Stark | Reduziert | Stark geschwächt |
| NIST-Status | Empfohlen (FIPS 180-4) | Deprecated | Nicht für Krypto |
| Quantum (Grover) | 128-Bit | 80-Bit | 64-Bit |
SHA-256 verwenden für: Datenintegrität, HMAC-Basis, digitale Signaturen, Schlüsselableitung, Passwort-Hashing (mit salt).
SHA-1 nur für: MySQL mysql_native_password-Authentifizierung (Protokoll erzwingt es), Git-Objektadressen (Legacy-Kompatibilität).
MD5 nur für: HTTP Digest Authentication (RFC 2617 schreibt MD5 vor), andere Protokolle die explizit MD5 verlangen.
Faustregel: Wenn das Protokoll keinen bestimmten Hash vorschreibt → immer SHA-256.
Integrität und Authentifizierung
Drei Wege für Integrität und Authentifizierung:
1. HMAC-SHA256 (std.crypto.hmac):
Für Nachrichten-Authentifizierung wenn Verschlüsselung separat erfolgt oder gar nicht benötigt wird.
HMAC_SHA256(key, msg, msg_len, mac_out); // mac_out = 32 Bytes
2. AES-CBC + HMAC (Encrypt-then-MAC):
Industriestandard-Muster. Beide Schlüssel sollten unabhängig voneinander sein.
3. DADQ-FO (integrierter Ansatz):
Ein einziger Schlüssel (sk_fo, 608 Bytes), ein Aufruf — Verschlüsselung und Authentifizierung kombiniert.
| Kriterium | HMAC allein | AES + HMAC | DADQ-FO |
|---|---|---|---|
| Nur Integrität (kein Ciphertext) | Ja | Nein | Nein |
| Vertraulichkeit + Integrität | Nein | Ja | Ja |
| NIST-Compliance | Ja | Ja | Nein |
| Quantum-Hardening | Nein | Teilweise (AES-256) | Ja (128-Bit) |
| API-Einfachheit | 1 Fn | 2 Fn + IV | 1 Fn |
Digitale Signaturen
Aktuell steht in std.crypto nur secp256k1 ECDSA (std.crypto.ecc) zur Verfügung.
import std.crypto.ecc;
ECCGenKey(pk, sk); // Schlüsselpaar erzeugen
ECDSASign(sk, hash, sig); // hash = SHA256 des Dokuments
ECDSAVerify(pk, hash, sig); // 1 = gültig, 0 = ungültig
Hinweise:
- Immer SHA-256 des Dokuments signieren, nie den Rohtext.
- secp256k1 ist die Bitcoin-Kurve — weitverbreitet, gut auditiert.
- Kein Ed25519 oder ECDSA-P256 in std.crypto (nur secp256k1).
- Post-Quantum-Signaturen: noch nicht in std.crypto verfügbar — für PQC-Signaturen → ML-DSA (FIPS 204, extern) oder Hybrid-Schema.
Sichere Zufallszahlen
Alle kryptografischen Schlüssel, IVs und Nonces müssen aus std.crypto.rand stammen:
import std.crypto.rand;
RandBytesExact(buf, n); // genau n Bytes, blockierend (getrandom(2))
RandBytes(buf, n); // bis zu n Bytes
var n: int64 := RandInt64(); // zufälliges int64
var u: int64 := RandU32(); // zufälliges uint32
Niemals std.math.random oder ähnliche nicht-kryptografische Zufallsgeneratoren für kryptografische Zwecke verwenden.
Entscheidungsguide
| Ich will … | Unit / Funktion |
|---|---|
| Daten verschlüsseln (Standard, NIST) | std.crypto.aes → AES256CBCEncrypt |
| Daten verschlüsseln + authentifizieren (NIST) | std.crypto.aes + std.crypto.hmac |
| Auth. Verschlüsselung (Lyx-nativ, Quantum) | std.crypto.pqc.dadq → dadqFOEnc |
| Hash für Integrität / Signaturen | std.crypto.sha256 → SHA256 |
| Nachricht authentifizieren (MAC) | std.crypto.hmac → HMAC_SHA256 |
| Digitale Signatur erzeugen | std.crypto.ecc → ECDSASign |
| Digitale Signatur prüfen | std.crypto.ecc → ECDSAVerify |
| Kryptografisch sicheren Schlüssel erzeugen | std.crypto.rand → RandBytesExact |
| Zufälligen AES-IV erzeugen | std.crypto.rand → RandBytesExact(iv, 16) |
| MySQL-Authentifizierung | std.crypto.sha1 → SHA1MySQLNativePassword |
| HTTP Digest Auth / alte Protokolle | std.crypto.md5 → MD5 |
| DADQ-Schlüssel sicher löschen | std.crypto.pqc.dadq → dadqZeroize |
| Schwachen DADQ-Seed erkennen | std.crypto.pqc.dadq → dadqValidateSeed |
Sicherheitsregeln auf einen Blick
- MD5 und SHA-1 nicht für neue kryptografische Zwecke — nur wenn das Protokoll es vorschreibt.
- AES-CBC ist nicht authentifiziert — immer HMAC nachschalten, oder DADQ-FO verwenden.
- IV muss einmalig und zufällig sein — niemals einen festen IV verwenden.
- ECDSA-Nonces darf man nicht selbst setzen —
std.crypto.eccgeneriert intern. - DADQ ist experimentell — nicht für FIPS/DO-178C/ISO-27001-zertifizierte Projekte.
- Schlüssel nach Verwendung löschen —
dadqZeroizeoder manuellepoke8-Schleife. - Alle kryptografischen Zufallswerte nur aus
std.crypto.rand.
Letzte Aktualisierung: 2026-06-08
