mthiim/dilithium-java – Implementierung eines quantencomputerresistenten Kryptografie-Algorithmus in Java
(github.com/mthiim)- Implementierung von Dilithium 3.1 in Java, bei der die primitiven Operationen als JCE Provider gekapselt sind; Schlüsselgenerierung, Signieren und Verifizieren können über die standardisierten Java-Kryptografie-Schnittstellen genutzt werden
- Vor dem Hintergrund, dass RSA und ECC anfällig für Angriffe durch Quantencomputer mit Shor's algorithm sind, handelt es sich um eine Implementierung zum Experimentieren und Lernen mit Dilithium, einem der von NIST ausgewählten Post-Quantum-Verfahren für digitale Signaturen
- Gehört zur CRYSTALS-Algorithmensammlung; Dilithium basiert auf algebraischen Gittern und wurde anhand der C-Referenzimplementierung und der Dokumentation umgesetzt, während das intern verwendete SHAKE128/256 über die Abhängigkeit Bouncy Castle bereitgestellt wird
- Unterstützt alle dokumentierten Sicherheitsstufen 2, 3 und 5; alle drei Stufen verwenden ein deterministic signature scheme und bestehen die KAT-Tests des offiziellen Pakets
- Der JCE-Nutzungsablauf besteht darin, zunächst
DilithiumProviderzu registrieren und anschließend mitKeyPairGenerator.getInstance("Dilithium"),Signature.getInstance("Dilithium")undKeyFactory.getInstance("Dilithium")Schlüsselgenerierung, Signieren, Verifizieren und Schlüsselwiederherstellung auszuführen- Die Sicherheitsstufe wird mit
DilithiumParameterSpec.LEVEL2,LEVEL3,LEVEL5odergetSpecForSecurityLevel()angegeben - Öffentliche und private Schlüssel erhalten ihre Byte-Darstellung über
.getEncoded()und werden in einem mit der Referenzimplementierung kompatiblen Format serialisiert und deserialisiert - Die Byte-Darstellung kodiert die parameter spec nicht, daher muss bei der Schlüsselwiederherstellung die parameter spec in
DilithiumPublicKeySpecoderDilithiumPrivateKeySpecexplizit angegeben werden
- Die Sicherheitsstufe wird mit
- Stellt das Utility
KAT.javabereit, das die known-answer test-Request-Dateien des offiziellen Dilithium-Pakets liest und Response-Dateien erzeugt; die Laufzeitargumente haben das Format<input-request-file> <output-response-file> <level> - Die aktuelle Implementierung entspricht Dilithium 3.1 und unterscheidet sich von den in Standardisierung befindlichen Versionen FIPS 204 bzw. ML-DSA
- Eine „for fun“ innerhalb weniger Tage geschriebene Implementierung; kein production-grade code, keine Prüfung auf Schwachstellen durch Dritte und keinerlei Garantie oder Support
- Veröffentlicht unter der Apache-2.0-Lizenz
1 Kommentare
Hacker-News-Kommentare
Es freut mich zu sehen, dass mein Projekt auf Hacker News Aufmerksamkeit bekommt. Das hier ist eine reine Spielzeug-Implementierung, inspiriert von dem Paper und der Referenzimplementierung.
Alle bereitgestellten Testfälle bestehen, aber ich habe es hauptsächlich zum Spaß gebaut und um zu sehen, ob es sich sauber in die standardmäßigen JCE-Schnittstellen einfügt. Bei Fragen oder Feedback einfach gern melden.
Die zentralen Teile dieser Dilithium-Spielzeug-Implementierung sind größtenteils hier zu sehen: https://github.com/mthiim/dilithium-java/blob/main/src/main/...
Ich frage mich, ob es eine gute Idee ist, Post-Quanten-Kryptografie-Algorithmen zusätzlich zu etablierteren und weiter verbreiteten Algorithmen wie RSA/ECDSA zu verwenden.
Post-Quanten-Kryptografie ist noch so neu, dass sie sich noch nicht besonders bequem einsetzen lässt.
Cloudflare hat vor Kurzem Post-Quanten-Kryptografie aktiviert und verwendet X25519+Kyber [0]. Die Post-Quanten-Kryptografie von Signal nutzt denselben Ansatz [1].
Dieser Trend scheint daraus entstanden zu sein, dass vor einigen Jahren ein Post-Quanten-Algorithmus auf einem klassischen Computer gebrochen wurde [2].
Ein Angreifer muss nun sowohl den klassischen als auch den Post-Quanten-Algorithmus brechen.
[0] https://blog.cloudflare.com/post-quantum-to-origins/
[1] https://signal.org/blog/pqxdh/
[2] https://www.quantamagazine.org/post-quantum-cryptography-sch...
Man bräuchte wohl Millionen von Qubits, während modernste Geräte derzeit bestenfalls im Bereich einiger Hundert liegen. Ich glaube daher nicht, dass wir uns in den nächsten Jahren, vielleicht sogar Jahrzehnten, in produktivem Code große Sorgen um Post-Quanten-Algorithmen machen müssen.
Dieser Ansatz stellt sicher, dass man sowohl den klassischen als auch den Post-Quanten-Algorithmus brechen muss, um auf den Klartext zuzugreifen. Ob man die Verschlüsselung einfach nur einhüllt oder wie im Beispiel von Campagna und Petcher einen hybriden KEM-Kombinator verwendet, ist eine subtilere Frage und erfordert ein differenzierteres Urteil, als ich es geben kann.
In jedem Fall erscheint es wahrscheinlicher, als heutige Standardschlüssel per Brute Force zu brechen, daher gibt es gute Gründe, schon heute Post-Quanten-Sicherheit zu priorisieren.
Vorsicht ist aber ebenfalls angebracht. Wenn PQ-Algorithmen Seitenkanäle oder Implementierungsschwächen haben, kann das die Lage sogar deutlich verschlimmern. Im schlimmsten Fall hat eine PQ-Implementierung etwa eine Remote-Code-Execution-Schwachstelle. Deshalb ist es sinnvoll, vorsichtig vorzugehen und den Code streng zu prüfen.
Beim Schlüsselaustausch ist das relativ einfach; je nach Verfahren kann man die Ausgaben per XOR verknüpfen oder aneinanderhängen.
In der README wird eine Abhängigkeit von Bouncy Castle erwähnt, und BC enthält bereits mehrere Java-basierte PQC-Signaturverfahren. Siehe https://doc.primekey.com/bouncycastle/interoperability#Inter... und https://github.com/bcgit/bc-java.
Vor ein paar Tagen warnte Daniel Bernstein, die NSA wolle fehlerhafte Post-Quanten-Kryptografie-Implementierungen verbreiten. Ich finde den Link gerade nicht.
https://news.ycombinator.com/item?id=37756656
Hier gibt es eine selbst geschriebene/portierte Single-File-Java-Implementierung von sphincs+, einem weiteren Post-Quanten-Signaturverfahren.
https://github.com/Peergos/sphincsplus
„Es ist seit Langem bekannt, dass die Kryptografiealgorithmen RSA und ECC anfällig für Angriffe durch Quantencomputer mit dem Shor-Algorithmus sind.“
Wenn das stimmt und Quantencomputer in dieser Größenordnung tatsächlich Realität werden, frage ich mich, welche Auswirkungen das auf Bitcoin hätte.
„Dies ist eine Implementierung, die ich innerhalb weniger Tage zum Spaß geschrieben habe. Sie ist nicht als produktionsreifer Code gedacht. Es wird keinerlei Garantie oder Support irgendeiner Art gegeben. Sie kann aber nützlich sein, um sich Post-Quanten-Algorithmen anzusehen und damit zu experimentieren. Nutzung auf eigene Gefahr. Wenn Ihnen diese Bedingungen nicht gefallen, sollten Sie diese Software nicht verwenden.“