====== SignatureExtensions ======
**Namespace:** ''WvdS.System.Security.Cryptography.Signatures''
Drop-In Replacement Extensions für digitale Signaturen mit Post-Quantum Support. Erweitert ''RSA'', ''ECDsa'' und ''X509Certificate2'' um PQ-hybride Signierfunktionen.
===== Übersicht =====
Diese Klasse bietet drei Arten von Signaturen:
| Modus | Klassisch | ML-DSA | Verwendung |
| Classic | ✓ | - | Standard .NET Verhalten |
| Hybrid | ✓ | ✓ | Maximale Sicherheit |
| PostQuantum | - | ✓ | Rein post-quantum |
===== RSA SignData/VerifyData =====
using var rsa = RSA.Create(2048);
byte[] data = Encoding.UTF8.GetBytes("Wichtige Daten");
// Signieren mit explizitem Modus
byte[] signature = rsa.SignData(
data,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1,
CryptoMode.Hybrid);
// Verifizieren
bool isValid = rsa.VerifyData(
data,
signature,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1,
CryptoMode.Hybrid);
==== Stream-Signatur ====
using var fileStream = File.OpenRead("document.pdf");
byte[] signature = rsa.SignData(
fileStream,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1,
CryptoMode.Hybrid);
===== ECDsa SignData/VerifyData =====
using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256);
byte[] data = GetDataToSign();
// Signieren
byte[] signature = ecdsa.SignData(
data,
HashAlgorithmName.SHA256,
CryptoMode.Hybrid);
// Verifizieren
bool isValid = ecdsa.VerifyData(
data,
signature,
HashAlgorithmName.SHA256,
CryptoMode.Hybrid);
===== Zertifikat-basierte Signaturen =====
var certificate = GetSigningCertificate();
byte[] data = GetDataToSign();
// Signieren (verwendet automatisch RSA oder ECDSA)
byte[] signature = certificate.SignData(
data,
HashAlgorithmName.SHA256,
CryptoMode.Hybrid);
// Verifizieren
bool isValid = certificate.VerifyData(
data,
signature,
HashAlgorithmName.SHA256,
CryptoMode.Hybrid);
Der Key-Typ wird automatisch erkannt:
* RSA-Zertifikat → RSA.SignData + ML-DSA
* ECDSA-Zertifikat → ECDsa.SignData + ML-DSA
===== Standalone ML-DSA =====
Direkte ML-DSA Signaturen ohne klassischen Key:
// Key-Paar generieren
var (publicKey, privateKey) = SignatureExtensions.GenerateMlDsaKeyPair();
// Signieren
byte[] data = GetDataToSign();
byte[] signature = SignatureExtensions.SignMlDsa(data, privateKey);
// Verifizieren
bool isValid = SignatureExtensions.VerifyMlDsa(data, signature, publicKey);
===== Hybrides Signaturformat =====
┌────────────────────────────────────────────┐
│ [4 Bytes] Länge klassische Signatur │
│ [n Bytes] Klassische Signatur (RSA/ECDSA) │
│ [m Bytes] PQ-Signatur (ML-DSA-65) │
└────────────────────────────────────────────┘
^ Komponente ^ Typische Größe ^
| Längenfeld | 4 Bytes |
| RSA-2048 Signatur | 256 Bytes |
| ECDSA P-256 Signatur | ~70 Bytes |
| ML-DSA-65 Signatur | 3.293 Bytes |
| **Hybrid RSA** | **~3.553 Bytes** |
| **Hybrid ECDSA** | **~3.367 Bytes** |
===== Transiente PQ-Keys =====
Für Standalone-Signaturen (ohne Zertifikat) werden thread-lokale transiente Keys verwendet:
// Eigene Keys setzen
var (pubKey, privKey) = SignatureExtensions.GenerateMlDsaKeyPair();
SignatureExtensions.SetTransientPqKey(pubKey, privKey);
// Jetzt können SignData/VerifyData ohne Zertifikat verwendet werden
byte[] sig = rsa.SignData(data, HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1, CryptoMode.Hybrid);
// Nur Public Key für Verifikation
SignatureExtensions.SetTransientPqPublicKey(pubKey);
bool valid = rsa.VerifyData(data, sig, HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1, CryptoMode.Hybrid);
// Aufräumen (überschreibt Private Key mit Nullen)
SignatureExtensions.ClearTransientPqKey();
===== Methoden-Übersicht =====
==== RSA Extensions ====
^ Methode ^ Parameter ^ Rückgabe ^
| ''SignData(data, hash, padding, mode)'' | byte[], HashAlgorithmName, RSASignaturePadding, CryptoMode? | byte[] |
| ''SignData(stream, hash, padding, mode)'' | Stream, HashAlgorithmName, RSASignaturePadding, CryptoMode? | byte[] |
| ''VerifyData(data, sig, hash, padding, mode)'' | byte[], byte[], HashAlgorithmName, RSASignaturePadding, CryptoMode? | bool |
==== ECDsa Extensions ====
^ Methode ^ Parameter ^ Rückgabe ^
| ''SignData(data, hash, mode)'' | byte[], HashAlgorithmName, CryptoMode? | byte[] |
| ''SignData(stream, hash, mode)'' | Stream, HashAlgorithmName, CryptoMode? | byte[] |
| ''VerifyData(data, sig, hash, mode)'' | byte[], byte[], HashAlgorithmName, CryptoMode? | bool |
==== X509Certificate2 Extensions ====
^ Methode ^ Parameter ^ Rückgabe ^
| ''SignData(data, hash, mode)'' | byte[], HashAlgorithmName, CryptoMode? | byte[] |
| ''VerifyData(data, sig, hash, mode)'' | byte[], byte[], HashAlgorithmName, CryptoMode? | bool |
==== Standalone ML-DSA ====
^ Methode ^ Parameter ^ Rückgabe ^
| ''GenerateMlDsaKeyPair()'' | - | (byte[] PublicKey, byte[] PrivateKey) |
| ''SignMlDsa(data, privateKey)'' | byte[], byte[] | byte[] |
| ''VerifyMlDsa(data, sig, publicKey)'' | byte[], byte[], byte[] | bool |
==== Transiente Key-Verwaltung ====
^ Methode ^ Beschreibung ^
| ''SetTransientPqKey(pub, priv)'' | Setzt Key-Paar für Thread |
| ''SetTransientPqPublicKey(pub)'' | Setzt nur Public Key |
| ''ClearTransientPqKey()'' | Löscht Keys sicher |
===== Beispiel: Vollständiger Workflow =====
// 1. CryptoMode konfigurieren
CryptoConfig.DefaultMode = CryptoMode.Hybrid;
// 2. Zertifikat laden (mit PQ-Keys)
var cert = X509Certificate2ExportExtensions.ImportPfx(
"signing-cert.pfx",
"password");
// 3. Dokument signieren
byte[] documentData = File.ReadAllBytes("contract.pdf");
byte[] signature = cert.SignData(documentData, HashAlgorithmName.SHA256);
// 4. Signatur speichern
File.WriteAllBytes("contract.sig", signature);
// 5. Später verifizieren
var verifyCert = new X509Certificate2("signing-cert.cer");
bool isValid = verifyCert.VerifyData(
File.ReadAllBytes("contract.pdf"),
File.ReadAllBytes("contract.sig"),
HashAlgorithmName.SHA256);
Console.WriteLine($"Signatur gültig: {isValid}");
===== Sicherheitshinweise =====
* Im PostQuantum-Modus wird keine klassische Signatur erstellt - nicht rückwärtskompatibel
* Transiente Keys werden thread-lokal gespeichert - nicht zwischen Threads teilen
* ''ClearTransientPqKey()'' aufrufen, wenn Keys nicht mehr benötigt werden
===== Siehe auch =====
* [[.:start|Signatures Namespace]]
* [[.:signeddataextensions|SignedDataExtensions]]
* [[..:x509certificates:x509certificate2extensions|X509Certificate2Extensions]]
* [[de:int:pqcrypt:konzepte:algorithmen|ML-DSA Algorithmus]]
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//