2.6 KiB
KONTEXT Vanilla-ECMAScript-Projekt. Mein aktuelles Protokoll committet Geheimnisse per H(secret) und teilt einen Schlüssel n-of-n auf. Ich ersetze das durch ein 2-von-3 Threshold-Schema: Pedersen-DKG + Threshold-ElGamal mit verifizierbarer verteilter Entschlüsselung (Chaum-Pedersen-Beweise statt blankem Hash). Die fertige npm-Library threshold-elgamal scheidet aus: sie funktioniert zuverlässig nur mit threshold == Teilnehmerzahl, nicht mit 2-von-3.
AUFGABE
-
Inspiziere zuerst das Repo: finde den bestehenden Commit-/Keypart-Code, bestimme die öffentliche Schnittstelle (welche Funktionen rufen Aufrufer auf), und liste sie mir auf, BEVOR du etwas änderst.
-
Füge @noble/curves als Fundament hinzu (auditiert, dependency-frei). Verifiziere die aktuelle Version aus dem npm-Registry, bevor du pinst. KEINE selbstgebaute Feldarithmetik, KEIN eigenes BigInt-Modular-Inverse – alles über noble.
-
Implementiere mit threshold=2, parties=3 auf einer Prime-Order-Gruppe (Ristretto255 via @noble/curves bevorzugt):
- Pedersen-VSS / Pedersen-DKG: zwei Polynome Grad 1, Koeffizienten- Commitments C_k = g^a_k · h^b_k, h mit unbekanntem log_g(h).
- Verteilte Schlüsselerzeugung: jede Partei dealt einen Beitrag, jede verifiziert jeden empfangenen Share gegen die Commitments.
- Threshold-ElGamal als KEM: Payload NICHT direkt mit ElGamal. Rekonstruiere per 2 partiellen Entschlüsselungen das gemeinsame Gruppenelement, leite daraus per HKDF-SHA256 einen 256-bit Key ab, verschlüssele das Payload mit AES-256-GCM (WebCrypto subtle, nicht selbst gebaut).
- Jede partielle Entschlüsselung trägt einen Chaum-Pedersen-Beweis der DL-Gleichheit; verifiziere VOR der Lagrange-Kombination.
-
Behalte die bestehende öffentliche Schnittstelle bei (gleiche Signaturen), damit Aufrufer unverändert bleiben. Markiere den alten Code deprecated statt ihn zu löschen.
-
Tests: (a) 2 von 3 entschlüsseln erfolgreich, (b) 1 allein scheitert, (c) manipulierte partielle Entschlüsselung wird durch die Verifikation abgelehnt, (d) manipulierter VSS-Share fliegt bei der DKG-Verifikation auf, (e) echtes Payload Round-Trip.
EINSCHRÄNKUNGEN / WARNUNG
- Das ist selbstgebaute Threshold-Krypto. Setze einen unübersehbaren Kommentar an den Kern: nicht auditiert, Komposition über noble ist ungeprüft.
- Nutze ausschließlich noble + WebCrypto für alle Primitiven. Erfinde keine Kurven-, Hash- oder Symmetrie-Operationen selbst.
- Konstante-Zeit-Verhalten kannst du in reinem JS nicht garantieren – halte das im Kommentar fest.
- Ändere nichts an meiner Geheimnis-/Key-Persistenz, ohne vorher zu fragen.