Entwicklung & Code
Mitschöpfer von DuckDB: „Es war klar, dass eine neue Architektur notwendig ist“

Hannes Mühleisen
(Bild: Hannes Mühleisen)
Hannes Mühleisen ist Mitschöpfer von DuckDB und CEO von DuckDB Labs. Zusammen mit Mark Raasveldt hat er DuckDB ursprünglich als Forschungssprojekt am Centrum Wiskunde & Informatica (CWI) Amsterdam ins Leben gerufen.
Weiterlesen nach der Anzeige

Golo Roden ist Gründer und CTO von the native web GmbH. Er beschäftigt sich mit der Konzeption und Entwicklung von Web- und Cloud-Anwendungen sowie -APIs, mit einem Schwerpunkt auf Event-getriebenen und Service-basierten verteilten Architekturen. Sein Leitsatz lautet, dass Softwareentwicklung kein Selbstzweck ist, sondern immer einer zugrundeliegenden Fachlichkeit folgen muss.
Golo: Hannes, du bist einer der Mitschöpfer von DuckDB und Mitgründer von DuckDB Labs. Als DuckDB im Sommer 2024 in Version 1.0 erschienen ist, habe ich für heise darüber berichtet – und seitdem ist viel passiert. Bevor wir in die Details gehen, würde ich gerne ganz am Anfang beginnen: DuckDB hat seine Wurzeln in eurer Forschung am CWI in Amsterdam, wo du und Mark Raasveldt jahrelang an Datenbank-Internas gearbeitet habt. Was war der Moment (oder die Lücke), an dem ihr beide entschieden habt, dass die Welt tatsächlich noch eine weitere Datenbank benötigt, und was sollte sie ursprünglich sein?
Hannes: Wir haben damals recht eng mit Statistikern zusammengearbeitet, die große Umfragedaten auswerten mussten. Für uns war klar, die brauchen Datenbank-Technologie! Aber als wir das vorgeschlagen haben, haben die gesagt, dass sie eigentlich keine Lust auf eine Datenbank im klassischen Sinne haben. Es war zum Beispiel vor Docker nicht einfach, eine Datenbank lokal zu installieren, ohne Experte zu sein. Außerdem konnte man den Zustand der Datenbank auch nicht ohne weiteres mit jemand anderem teilen.
Es war klar, dass eine neue Architektur notwendig ist, ein eingebettetes analytisches Datenbanksystem. Das gab es damals noch gar nicht. Es war recht schnell klar, dass wir eine komplette Neuentwicklung brauchten – ein sauberes Design, das auf das eingebettete Einsatzmodell zugeschnitten war, mit einer modernen Systemarchitektur.
Im Sommer 2018 beschlossen wir, dies in die Tat umzusetzen, und begannen mit der Implementierung von DuckDB.
Der Begriff „SQLite for Analytics“ haftet DuckDB schon seit Jahren an. Er bringt vieles in nur drei Worten auf den Punkt, kann aber auch reduzierend wirken. Wie treffend findest du dieses Framing aus deiner heutigen Sicht, und wo greift es zu kurz?
Weiterlesen nach der Anzeige
Hannes: „SQLite für Analytics“ war in den ersten fünf Jahren eine treffende Beschreibung des Projekts. Im Laufe der Zeit haben wir einen leistungsfähigen Erweiterungsmechanismus hinzugefügt, der die Arbeit mit nahezu jedem Dateiformat wie Parquet, JSON oder Iceberg und vielen gängigen Speicheroptionen, zum Beispiel S3-API, ermöglicht. Deshalb haben wir begonnen, DuckDB als universelles Datenwerkzeug zu bezeichnen.
Das ist vielleicht weniger einprägsam als die ursprüngliche Beschreibung, erfasst aber, dass das System inzwischen wesentlich vielseitiger ist. Und wenn man ein SQLite für Analytics braucht, kann man DuckDB nach wie vor dafür verwenden.
Jenseits von Big Data
Du vertrittst seit einiger Zeit die Position, dass verteilte Systeme für die allermeisten analytischen Workloads schlicht überdimensioniert sind – und dass eine einzelne moderne Maschine deutlich mehr leisten kann, als die Branche meist annimmt. Das ist ein Argument, das ich auch in einem ausführlichen iX-Test aufgegriffen habe, in dem ich DuckDB als schlanke Alternative zu Apache Spark positioniert habe. Magst du diese These in deinen eigenen Worten machen? Und wie reagierst du auf Leute, die dich daraufhin sofort dafür kritisieren, ihr Problem zu unterschätzen?
Hannes: Mein Argument stützt sich auf drei Säulen. Erstens: Die Hardwareentwicklung hat große Fortschritte gemacht, und moderne Computer sind erstaunlich leistungsfähig. Heute wird ein leistungsstarker Laptop mit einem Dutzend schneller CPU-Kerne, mehreren zehn Gigabyte Arbeitsspeicher und einer schnellen SSD mit Terabytes an Speicherplatz ausgeliefert. Ein Server kann leicht das Zehnfache und mehr bieten.
Zweitens: Das Feld der Datenbankarchitektur hat sich seit 2010 – als Big Data aufkam – erheblich weiterentwickelt. Wir konnten auf Ergebnisse zu spaltenbasierter Speicherung, vektorisierter Abfrageverarbeitung, Parallelität und Nebenläufigkeitskontrolle aufbauen. Darüber hinaus haben wir eigene Forschung zu Themen wie Kompression und Operatoren für Datenmengen, die den Arbeitsspeicher übersteigen, betrieben.
Drittens: Was die meisten nicht bedenken – auch wenn eine Organisation auf Petabytes an Daten sitzt, muss man nie alle Daten in einer einzigen Abfrage verarbeiten. Dafür gibt es inzwischen belastbare Belege: In den letzten Jahren haben sowohl Snowflake als auch Redshift Stichproben und Statistiken ihrer Benutzerabfragen veröffentlicht – wahre Fundgruben, um reale Workloads zu verstehen. George Fraser von Fivetran hat eine hervorragende Analyse dazu vorgestellt, in der er zeigt, dass selbst unter den Abfragen auf Snowflake und Redshift das 99,9-Perzentil etwa 300 GB scannt und somit problemlos auf einem einzelnen Knoten laufen könnte.
Performance ist einer der auffälligsten Aspekte von DuckDB – viele Erstanwender beschreiben ihre erste Erfahrung mit den Worten „das kann nicht stimmen, lass mich das Ergebnis nochmal prüfen“. Welche architektonischen Entscheidungen sind dafür aus deiner Sicht am wichtigsten, und welche davon sind für Außenstehende nicht offensichtlich?
Hannes: Wir haben bereits über die Entscheidung für eine Einzelknoten-Architektur gesprochen, die verschiedene Arten von Overhead in Implementierung, Betrieb und Leistung eliminiert. Aber es gibt auch einige nicht triviale architektonische Entscheidungen.
Wir haben uns für vektorisierte Ausführung statt JIT-Kompilierung entschieden, weil sie perfekt für analytische Workloads und langfristig deutlich einfacher zu warten ist. Wir haben keine GPUs oder exotische Hardware wie KI-Beschleuniger eingesetzt, sondern all unsere Energie darauf verwendet, die effizientesten Algorithmen für die CPU zu schreiben. Und schließlich haben wir bei der Implementierung dieser Algorithmen bewusst auf SIMD-Intrinsics (manuell ausformulierte Vektorbefehle) verzichtet. Stattdessen haben wir skalaren Code geschrieben und den Compiler die Auto-Vektorisierung übernehmen lassen. Das Ergebnis ist hoch portabler und zugleich leistungsfähiger Code.
Darüber hinaus – wie in der vorherigen Frage besprochen – sind viele aktuelle Forschungsergebnisse in DuckDB eingeflossen. Die Verarbeitung von Datenmengen, die den Arbeitsspeicher übersteigen, durch Auslagerung auf die Festplatte trägt maßgeblich zur Leistung von DuckDB bei. Die meisten modernen Datenbanksysteme können auf die Festplatte auslagern, aber wenn sie es tun, erleben sie einen Performance-Absturz. DuckDB nutzt moderne Flash-basierte Speicher, um dies wesentlich eleganter zu handhaben – oft bemerken die Benutzer kaum, dass ihre Abfragen auf die Festplatte ausgelagert wurden.
Das Ökosystem
Die Reichweite von DuckDB in die Python- und R-Communities, in Node.js, in alle möglichen Tools und Notebooks ist bemerkenswert. War diese Ökosystem-Strategie von Anfang an bewusst gewählt, oder ist sie entstanden, weil die Leute DuckDB in ihre Workflows hineingezogen haben?
Hannes: Man muss die Anwender natürlich da abholen, wo sie sind. Am Anfang stellten wir uns vor, dass DuckDB für Data-Science-Workloads genutzt werden würde, und das bestimmte die erste Auswahl an Clients. Wir brauchten natürlich einen Kommandozeilen-Client. Auf der Sprachseite war Python bereits sehr stark, und wir hatten enge Verbindungen zur R-Community, also entschieden wir uns, diese Clients zuerst zu implementieren.
Node.js folgte bald darauf. Als DuckDB wuchs, begann die Community eigenständig Clients zu entwickeln. Das ermöglichte es uns, deren Akzeptanz zu beobachten, bevor wir die Arbeit des Kernteams in fünfzehn verschiedene Treiber investierten. Zum Beispiel wurde der DuckDB-Go-Treiber zunächst von Marc Boeker implementiert, der den Code später an die DuckDB Foundation übergab.
Der Extension-Mechanismus wirkt wie eine eher leise, aber sehr folgenreiche Designentscheidung. Er erlaubt DuckDB, Formate zu lesen, für die es nicht gebaut wurde, mit Object Stores zu arbeiten und sogar mit anderen Datenbanken zu sprechen. Wie denkst du über die Grenze zwischen dem, was in den Kern gehört, und dem, was in einer Extension besser aufgehoben ist?
Hannes: Wir sehen, dass DuckDB in ressourcenbeschränkten Umgebungen eingesetzt wird – Einplatinencomputer, Browser-Tabs, Container mit begrenztem Arbeitsspeicher. Um diesen Einsatz zu ermöglichen, wollen wir den Kern von DuckDB kleinhalten und nur das Wesentliche einbauen: den SQL-Parser, die Datenbank-Engine, die Speicher-Engine, den CSV-Reader – und den Erweiterungsmechanismus. Die meisten anderen Funktionen wie der Parquet-Reader oder sogar HTTPS-Unterstützung stehen als Erweiterungen zur Verfügung.
Ein schöner Nebeneffekt dieses leistungsfähigen Erweiterungsmechanismus ist, dass unsere Community eigene Erweiterungen bauen kann. Derzeit gibt es mehr als 180 Community-Erweiterungen für DuckDB, die jeweils neue Funktionen ins System bringen und sich mit einer einzigen Zeile installieren lassen.
Entwicklung & Code
LMDB 1.0: Datenbank ohne Server und ohne Write-Ahead-Log
Die freie Embedded-Datenbank LMDB (Lightning Memory-Mapped Database) hat Version 1.0 erreicht. Mit dem ersten Major-Release dokumentieren die Entwickler die API und das Verhalten der Bibliothek neu und stellen eine aktualisierte Dokumentation bereit. Für bestehende Anwendungen gibt es einen eigenen Migrationsleitfaden von der 0.9-Serie.
Weiterlesen nach der Anzeige
LMDB ist eine in Anwendungen eingebettete Key/Value-Datenbankbibliothek für lokale Datenhaltung. Sie richtet sich an Entwickler, die eine transaktionssichere Datenbank ohne separaten Serverprozess benötigen, etwa für Verzeichnisdienste, Caches oder Metadaten. Anders als klassische Datenbanksysteme lädt LMDB Daten nicht in einen eigenen Puffer-Cache, sondern bildet die komplette Datenbank per Memory Mapping in den virtuellen Adressraum des Prozesses ab. Lesezugriffe erfolgen dadurch direkt auf die gemappten Speicherbereiche, ohne zusätzliche Speicherallokationen oder Kopieroperationen.
Memory Mapping statt Datenbank-Cache
Das Grundprinzip von LMDB bleibt auch mit Version 1.0 unverändert. Die Bibliothek verwendet einen B-Baum als Datenstruktur und überlässt das Caching vollständig dem Betriebssystem. Da Datensätze direkt aus dem Speicherabbild gelesen werden, entfallen Zwischenschritte wie malloc() oder memcpy() beim Auslesen von Daten. Das reduziert den Verwaltungsaufwand und kann insbesondere bei leseintensiven Workloads die Leistung steigern. Grundlage dafür ist die Memory-Mapping-Funktion des Betriebssystems, bei der Dateiinhalte transparent in den virtuellen Speicher eingeblendet werden.
Auch das Transaktionsmodell bleibt erhalten. LMDB bietet ACID-Eigenschaften und setzt auf Multi-Version Concurrency Control (MVCC). Neue Daten werden per Copy-on-Write geschrieben, sodass bereits vorhandene Seiten niemals überschrieben werden. Ein Leser sieht dadurch stets einen konsistenten Datenbestand, während Schreibvorgänge parallel vorbereitet werden können. Ein typisches Beispiel ist ein Dienst, der kontinuierlich Konfigurationsdaten ausliest, während ein Verwaltungswerkzeug Änderungen schreibt: Leser arbeiten ohne Sperren weiter und werden durch den Schreibvorgang nicht blockiert.
Ein Schreiber, viele Leser
Das Nebenläufigkeitsmodell von LMDB unterscheidet sich von vielen anderen Datenbanken. Beliebig viele Prozesse oder Threads können gleichzeitig lesen, Schreibtransaktionen werden dagegen vollständig serialisiert. Zu jedem Zeitpunkt darf nur eine Schreibtransaktion aktiv sein. Dadurch schließt das System Deadlocks zwischen konkurrierenden Schreibern aus. Leser blockieren Schreiber nicht, ebenso wenig müssen Leser auf laufende Schreibvorgänge warten.
Die Entwickler verzichten außerdem bewusst auf ein Write-Ahead-Log oder ein Append-only-Protokoll. Statt regelmäßig Logdateien zusammenzuführen oder Datenbanken zu komprimieren, verwaltet LMDB freie Seiten innerhalb der Datenbank selbst und verwendet sie für spätere Schreibvorgänge erneut. Dadurch wächst die Datenbank im Normalbetrieb nicht unbegrenzt an, wie es bei logbasierten Verfahren ohne Wartung passieren kann.
Weiterlesen nach der Anzeige
Hinweise für den Betrieb
Die Release-Notes auf GitHub sowie die Dokumentation weisen auf einige Einschränkungen hin: Lange laufende Lesetransaktionen können verhindern, dass bereits freigegebene Seiten wiederverwendet werden. Dadurch kann die Datenbankdatei unnötig anwachsen. Entwickler sollten deshalb lang andauernde Transaktionen vermeiden und abgebrochene Prozesse regelmäßig auf verwaiste Reader-Einträge prüfen. Dafür stehen unter anderem die Funktion mdb_reader_check sowie das Werkzeug mdb_stat zur Verfügung.
Nicht empfohlen wird außerdem der Einsatz auf Netzwerkdateisystemen. Da LMDB auf Memory Mapping sowie Dateisperren des Betriebssystems setzt, können dort Synchronisationsprobleme auftreten. Auch das gleichzeitige mehrfache Öffnen derselben Datenbank innerhalb eines Prozesses gilt laut Dokumentation als problematisch.
(fo)
Entwicklung & Code
MongoDB integriert Vektorsuche direkt in die Datenbank
MongoDB stellt seine Volltextsuche und Vektorsuche nun allgemein für selbst verwaltete Installationen bereit. Die Funktionen sind sowohl für MongoDB Enterprise Advanced als auch für die Community Edition verfügbar. Entwickler können damit Suchabfragen, semantische Suche und hybride Suchverfahren direkt in ihrer Datenbank nutzen, ohne eine separate Suchplattform mit eigener Datensynchronisation betreiben zu müssen.
Weiterlesen nach der Anzeige
MongoDB ist eine dokumentenorientierte NoSQL-Datenbank, die JSON-ähnliche BSON-Dokumente speichert. Sie wird häufig für Anwendungen mit flexiblen Datenmodellen eingesetzt und ist sowohl als Cloud-Dienst MongoDB Atlas als auch für den Eigenbetrieb erhältlich. Bislang standen einige der erweiterten Suchfunktionen vor allem in Atlas zur Verfügung.
Volltext-, Vektor- und Hybridsuche aus einer Hand
Laut der Ankündigung erreichen die Suchfunktionen in selbst verwalteten Umgebungen nun Funktionsparität mit MongoDB Atlas. Unterstützt werden unter anderem die Aggregationsstufen $search, $searchMeta, $vectorSearch, $rankFusion und $scoreFusion. Dadurch lassen sich klassische Volltextsuche und semantische Vektorsuche in einer gemeinsamen Abfrage kombinieren.
Während die Volltextsuche Dokumente anhand von Schlüsselwörtern und sprachabhängigen Merkmalen durchsucht, vergleicht die Vektorsuche numerische Repräsentationen von Inhalten, sogenannte Embeddings. Dadurch lassen sich auch inhaltlich ähnliche Dokumente finden, selbst wenn sie andere Begriffe verwenden. Eine hybride Suche verbindet beide Verfahren und kann so sowohl exakte Treffer als auch semantisch passende Ergebnisse liefern. Solche Ansätze kommen unter anderem in RAG-Systemen (Retrieval-Augmented Generation) zum Einsatz, bei denen Sprachmodelle externe Wissensquellen in ihre Antworten einbeziehen.
KI-Funktionen direkt in der Datenbank
MongoDB integriert außerdem eine automatische Erzeugung von Embeddings auf Basis der Modelle von Voyage AI. Entwickler müssen die Vektoren damit nicht mehr selbst außerhalb der Datenbank erzeugen und synchronisieren. Laut MongoDB erfolgt die automatische Embedding-Erstellung derzeit über einen von MongoDB gehosteten Dienst von Voyage AI. Zusätzlich stehen sogenannte Reranker zur Verfügung, die Suchergebnisse nachträglich neu bewerten und in eine relevantere Reihenfolge bringen sollen.
Der Anbieter sieht die Neuerungen vor allem als Baustein für KI-Anwendungen wie Chatbots, Empfehlungssysteme oder KI-Agenten. Statt Daten zwischen Datenbank, Suchmaschine und Vektor-Datenbank zu replizieren, sollen sich Such- und KI-Workloads innerhalb derselben Plattform umsetzen lassen. Die Suchtechnologie basiert dabei auf Apache Lucene.
Weiterlesen nach der Anzeige
In der Community Edition stehen Such- und Vektorsuche ab MongoDB 8.2 ohne zusätzliche Lizenzkosten unter der Server Side Public License (SSPL) zur Verfügung. Die Funktionen laufen in einem separaten Prozess namens mongot, der parallel zum eigentlichen Datenbankprozess mongod betrieben wird. MongoDB hat den Quellcode von mongot nach eigenen Angaben ebenfalls unter der SSPL veröffentlicht.
Für Enterprise-Kunden werden die Suchfunktionen als kostenpflichtige Erweiterung von MongoDB Enterprise Advanced angeboten. Für Kubernetes-basierte Installationen erfolgt die Bereitstellung über MongoDB Controllers for Kubernetes (MCK), sodass sich Such- und Vektorsuche in Kubernetes-basierte On-Premises-, Private-Cloud- oder Hybrid-Cloud-Umgebungen integrieren lassen. Nach Angaben des Herstellers richtet sich das Angebot insbesondere an Unternehmen mit regulatorischen Anforderungen oder isolierten Infrastrukturen, die KI-Anwendungen vollständig unter eigener Kontrolle betreiben möchten.
(fo)
Entwicklung & Code
Neu in .NET 10.0 [30]: Algorithmen für die Post-Quanten-Kryptografie
.NET 10.0 enthält drei neue asymmetrische Kryptografie-Algorithmen: ML-KEM (FIPS 203), ML-DSA (FIPS 204) und SLH-DSA (FIPS 205), die im August 2024 die US-amerikanischen Bundesbehörde National Institute of Standards and Technology (NIST) verabschiedet hat.
Weiterlesen nach der Anzeige

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.
Federal Information Processing Standards (FIPS) sind offizielle technische Standards des NIST:
| FIPS | Algorithmus | Zweck | .NET-10.0-Klasse |
| 203 | ML‑KEM (CRYSTALS‑Kyber) | Schlüsselaustausch für AES u.a. | System.Security.Cryptography.MLKem |
| 204 | ML‑DSA (CRYSTALS‑Dilithium) | Digitale Signatur zur Authentifizierung und Datenintegrität | System.Security.Cryptography.MLDsa |
| 205 | SLH‑DSA (SPHINCS+) | Digitale Signatur (Alternative Signaturen, falls später bei ML‑DSA Schwächen entdeckt werden.) | System.Security.Cryptography.SlhDsa |
| 206 | FN‑DSA (FALCON) | Digitale Signatur (geplantes weiteres optionales Signaturverfahren) | keine |
Diese Kryptografie-Algorithmen gehören zur Klasse Post-Quanten-Kryptografie (Post-Quantum Cryptography, PQC). Das sind neuere kryptografische Verfahren, die selbst dann sicher bleiben sollen, wenn leistungsstarke Quantencomputer verfügbar sind. Heute etablierte Algorithmen wie RSA und ECC basieren auf mathematischen Problemen, die Quantencomputer recht schnell lösen können. PQC-Algorithmen sollen auch mit Quantencomputern nicht schnell angreifbar sein.
(Bild: King / stock.adobe.com)

Das ist neu in .NET 11.0: Dr. Holger Schwichtenberg und weitere Experten präsentieren am 17. November 2026 auf der Online-Konferenz betterCode() .NET 11.0 die Änderungen für Entwicklerinnen und Entwickler. Das Programm steht jetzt fest, Tickets zum Frühbucherpreis sind verfügbar.
Die neuen Klassen findet man im .NET-Namensraum System.Security.Cryptography:
System.Security.Cryptography.MLKemSystem.Security.Cryptography.MLDsaSystem.Security.Cryptography.SlhDsa
Weiterlesen nach der Anzeige
Microsoft will aber FIPS 206 nicht implementieren: „We do not believe there is a need for any FIPS 206 algorithms in .NET workloads, they are planned as ’never’ until evidence suggests otherwise.“
Windows liefert diese Algorithmen in der Cryptography Next Generation API (CNG) seit Windows Insiders, Canary Channel Build 27852 oder höher mit. Eine stabile Version gibt es seit Windows 11 25H2 und Windows Server 2025. Für macOS- und Linux-Systeme braucht man die OpenSSL-Bibliothek ab Version 3.5. Folgender Code zeigt einige Beispiele für PQC:
using System.Security.Cryptography;
namespace NET10_Console;
public class FCL10_PQC
{
public void GetSupportedStandards()
{
CUI.Demo("Post-Quantum Cryptography (PQC) in .NET 10.0");
CUI.H2("Prüfung, ob die PQC-Algorithmen verfügbar sind");
Console.WriteLine("ML-KEM (FIPS 203) für Verschlüsselung: " + System.Security.Cryptography.MLKem.IsSupported);
Console.WriteLine("ML-DSA (FIPS 204) für Digitale Signaturen: " + System.Security.Cryptography.MLDsa.IsSupported);
#pragma warning disable SYSLIB5006 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
Console.WriteLine("SLH-DSA (FIPS 205) für Digitale Signaturen (Alternative/Reserve): " + System.Security.Cryptography.SlhDsa.IsSupported);
}
///
/// ML-KEM (quantensicher) schützt den Schlüsselaustausch
/// AES-256 (quantenresistent) verschlüsselt die Daten
/// Beide zusammen bieten vollständigen Quantenschutz
///
public void KEMDemo()
{
CUI.Demo(nameof(KEMDemo) + ": Verschlüsselung mit AES unter Verwendung von ML-KEM zum Schlüsselaustausch");
try
{
string originalText = "Dies ist ein vertraulicher Text, der mit Post-Quantum Cryptography geschützt wird!";
CUI.H2("Originaltext");
Console.WriteLine(originalText);
// 1. Empfänger generiert Schlüsselpaar
CUI.H2("1. Schlüsselpaar generieren (Empfänger)");
using MLKem receiverKey = MLKem.GenerateKey(MLKemAlgorithm.MLKem1024);
// Export/Import als PEM
string publicKeyPem = receiverKey.ExportSubjectPublicKeyInfoPem();
Console.WriteLine($"Öffentlicher Schlüssel (PEM): {publicKeyPem.Substring(0, Math.Min(80, publicKeyPem.Length))}...");
// 2. Sender verwendet öffentlichen Schlüssel für Encapsulation
CUI.H2("2. Gemeinsames Geheimnis erzeugen (Sender)");
using MLKem senderKey = MLKem.ImportFromPem(publicKeyPem);
// ML-KEM 1024: Ciphertext = 1568 Bytes, Shared Secret = 32 Bytes
byte[] ciphertext = new byte[1568];
byte[] sharedSecretSender = new byte[32];
senderKey.Encapsulate(ciphertext, sharedSecretSender);
Console.WriteLine($"Ciphertext Größe: {ciphertext.Length} Bytes");
Console.WriteLine($"Gemeinsames Geheimnis (Sender): {Convert.ToHexString(sharedSecretSender)}");
// 3. Sender verschlüsselt Daten mit AES unter Verwendung des gemeinsamen Geheimnisses
CUI.H2("3. Daten mit AES verschlüsseln (Sender)");
byte[] encryptedData;
byte[] iv;
using (Aes aes = Aes.Create())
{
aes.Key = sharedSecretSender;
aes.GenerateIV();
iv = aes.IV;
using ICryptoTransform encryptor = aes.CreateEncryptor();
byte[] plainBytes = System.Text.Encoding.UTF8.GetBytes(originalText);
encryptedData = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
}
Console.WriteLine($"Verschlüsselte Daten: {Convert.ToHexString(encryptedData)}");
Console.WriteLine($"IV: {Convert.ToHexString(iv)}");
// 4. Empfänger extrahiert gemeinsames Geheimnis mit Decapsulation
CUI.H2("4. Gemeinsames Geheimnis extrahieren (Empfänger)");
byte[] sharedSecretReceiver = new byte[32];
receiverKey.Decapsulate(ciphertext, sharedSecretReceiver);
Console.WriteLine($"Gemeinsames Geheimnis (Empfänger): {Convert.ToHexString(sharedSecretReceiver)}");
Console.WriteLine($"Geheimnisse identisch: {sharedSecretSender.SequenceEqual(sharedSecretReceiver)}");
// 5. Empfänger entschlüsselt Daten mit AES
CUI.H2("5. Daten mit AES entschlüsseln (Empfänger)");
string decryptedText;
using (Aes aes = Aes.Create())
{
aes.Key = sharedSecretReceiver;
aes.IV = iv;
using ICryptoTransform decryptor = aes.CreateDecryptor();
byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
decryptedText = System.Text.Encoding.UTF8.GetString(decryptedBytes);
}
CUI.H2("Entschlüsselter Text");
CUI.Green(decryptedText);
CUI.Success($"Verschlüsselung erfolgreich: {originalText == decryptedText}");
}
catch (Exception ex)
{
CUI.Error(ex);
}
}
///
/// ML-DSA (FIPS 204) - Post-Quantum Digitale Signaturen
/// Quantensichere Alternative zu RSA/ECDSA für digitale Signaturen
///
public void DSADemo()
{
CUI.Demo(nameof(DSADemo) + ": ML-DSA (FIPS 204) - Post-Quantum Digitale Signaturen");
try
{
string originalText = "Dieses Dokument muss digital signiert werden, um Integrität und Authentizität zu gewährleisten.";
CUI.H2("Originaldokument");
Console.WriteLine(originalText);
byte[] data = System.Text.Encoding.UTF8.GetBytes(originalText);
// 1. Sender generiert Schlüsselpaar
CUI.H2("1. Schlüsselpaar generieren (Sender)");
using MLDsa senderKey = MLDsa.GenerateKey(MLDsaAlgorithm.MLDsa87);
Console.WriteLine($"Algorithmus: {MLDsaAlgorithm.MLDsa87} (höchste Sicherheitsstufe)");
// Export öffentlicher Schlüssel als PEM
string publicKeyPem = senderKey.ExportSubjectPublicKeyInfoPem();
Console.WriteLine($"Öffentlicher Schlüssel (PEM): {publicKeyPem.Substring(0, Math.Min(80, publicKeyPem.Length))}...");
// 2. Sender signiert die Daten
CUI.H2("2. Daten signieren (Sender)");
byte[] signature = senderKey.SignData(data);
Console.WriteLine($"Signatur Größe: {signature.Length} Bytes");
Console.WriteLine($"Signatur: {Convert.ToHexString(signature).Substring(0, Math.Min(100, Convert.ToHexString(signature).Length))}...");
// 3. Empfänger importiert öffentlichen Schlüssel
CUI.H2("3. Öffentlichen Schlüssel importieren (Empfänger)");
using MLDsa verifierKey = MLDsa.ImportFromPem(publicKeyPem);
Console.WriteLine("Öffentlicher Schlüssel erfolgreich importiert");
// 4. Empfänger verifiziert die Signatur
CUI.H2("4. Signatur verifizieren (Empfänger)");
bool isValid = verifierKey.VerifyData(data, signature);
if (isValid)
{
CUI.Success("✓ Signatur ist gültig! Datenintegrität bestätigt.");
}
else
{
CUI.Error("✗ Signatur ist ungültig! Daten wurden möglicherweise manipuliert.");
}
// 5. Manipulationsversuch demonstrieren
CUI.H2("5. Manipulationsversuch demonstrieren");
byte[] manipulatedData = System.Text.Encoding.UTF8.GetBytes(originalText + " MANIPULIERT!");
bool isManipulatedValid = verifierKey.VerifyData(manipulatedData, signature);
if (!isManipulatedValid)
{
CUI.Warning("✓ Manipulation wurde erkannt! Signatur ist für geänderte Daten ungültig.");
}
else
{
CUI.Error("✗ FEHLER: Manipulation wurde nicht erkannt!");
}
}
catch (Exception ex)
{
CUI.Error(ex);
}
}

Der Screenshot zeigt die Ausgabe des Beispielcodes (Abb. 1).
(rme)
-
Künstliche Intelligenzvor 3 MonateniX-Workshop Angriffsziel lokales AD − Schwachstellen finden und beheben
-
Künstliche Intelligenzvor 3 Monaten„Don’t Starve Elsewhere“: Survival‑Hit kehrt nach zehn Jahren zurück
-
Künstliche Intelligenzvor 3 MonatenKine‑Exakta: Die erste Spiegelreflexkamera fürs Kleinbild
-
Künstliche Intelligenzvor 3 MonatenWeitere Entlassungswelle bei Disney: Bis zu 1000 Mitarbeiter betroffen
-
Künstliche Intelligenzvor 3 Monaten
xTool P3 im Test: CO₂-Laser mit 80 Watt schneidet und graviert auch Acryl
-
Apps & Mobile Entwicklungvor 2 MonatenMega-GPUs für Nvidia, AMD & Co: TSMC zeigt CoWoS-Package mit >11.600 mm² & 24 × HBM5E
-
Social Mediavor 2 MonatenMetas neuer Creative Setup Workflow: Was sich wirklich ändert – und warum das nicht nur eine UI-Frage ist!
-
Künstliche Intelligenzvor 2 MonatenApple‑Geräte mit Microsoft Intune verwalten – zweiteiliges Live-Webinar
