====== SignatureExtensions ====== **Namespace:** ''WvdS.System.Security.Cryptography.Signatures'' Drop-In Replacement proširenja za digitalne potpise s Post-Quantum podrškom. Proširuje ''RSA'', ''ECDsa'' i ''X509Certificate2'' s PQ-hibridnim funkcijama potpisivanja. ===== Pregled ===== Ova klasa nudi tri vrste potpisa: | Način | Klasični | ML-DSA | Uporaba | | Classic | ✓ | - | Standardno .NET ponašanje | | Hybrid | ✓ | ✓ | Maksimalna sigurnost | | PostQuantum | - | ✓ | Čisto post-quantum | ===== RSA SignData/VerifyData ===== using var rsa = RSA.Create(2048); byte[] data = Encoding.UTF8.GetBytes("Važni podaci"); // Potpisivanje s eksplicitnim načinom byte[] signature = rsa.SignData( data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); // Verifikacija bool isValid = rsa.VerifyData( data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); ==== Stream potpis ==== 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(); // Potpisivanje byte[] signature = ecdsa.SignData( data, HashAlgorithmName.SHA256, CryptoMode.Hybrid); // Verifikacija bool isValid = ecdsa.VerifyData( data, signature, HashAlgorithmName.SHA256, CryptoMode.Hybrid); ===== Potpisi temeljeni na certifikatu ===== var certificate = GetSigningCertificate(); byte[] data = GetDataToSign(); // Potpisivanje (automatski koristi RSA ili ECDSA) byte[] signature = certificate.SignData( data, HashAlgorithmName.SHA256, CryptoMode.Hybrid); // Verifikacija bool isValid = certificate.VerifyData( data, signature, HashAlgorithmName.SHA256, CryptoMode.Hybrid); Tip ključa se automatski prepoznaje: * RSA certifikat → RSA.SignData + ML-DSA * ECDSA certifikat → ECDsa.SignData + ML-DSA ===== Samostalni ML-DSA ===== Direktni ML-DSA potpisi bez klasičnog ključa: // Generiranje para ključeva var (publicKey, privateKey) = SignatureExtensions.GenerateMlDsaKeyPair(); // Potpisivanje byte[] data = GetDataToSign(); byte[] signature = SignatureExtensions.SignMlDsa(data, privateKey); // Verifikacija bool isValid = SignatureExtensions.VerifyMlDsa(data, signature, publicKey); ===== Format hibridnog potpisa ===== ┌────────────────────────────────────────────┐ │ [4 bajta] Duljina klasičnog potpisa │ │ [n bajtova] Klasični potpis (RSA/ECDSA) │ │ [m bajtova] PQ potpis (ML-DSA-65) │ └────────────────────────────────────────────┘ ^ Komponenta ^ Tipična veličina ^ | Polje duljine | 4 bajta | | RSA-2048 potpis | 256 bajtova | | ECDSA P-256 potpis | ~70 bajtova | | ML-DSA-65 potpis | 3.293 bajta | | **Hibridni RSA** | **~3.553 bajta** | | **Hibridni ECDSA** | **~3.367 bajtova** | ===== Prolazni PQ ključevi ===== Za samostalne potpise (bez certifikata) koriste se thread-lokalni prolazni ključevi: // Postavljanje vlastitih ključeva var (pubKey, privKey) = SignatureExtensions.GenerateMlDsaKeyPair(); SignatureExtensions.SetTransientPqKey(pubKey, privKey); // Sada se SignData/VerifyData mogu koristiti bez certifikata byte[] sig = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); // Samo javni ključ za verifikaciju SignatureExtensions.SetTransientPqPublicKey(pubKey); bool valid = rsa.VerifyData(data, sig, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); // Čišćenje (prepisuje privatni ključ nulama) SignatureExtensions.ClearTransientPqKey(); ===== Pregled metoda ===== ==== RSA proširenja ==== ^ Metoda ^ Parametri ^ Povratni tip ^ | ''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 proširenja ==== ^ Metoda ^ Parametri ^ Povratni tip ^ | ''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 proširenja ==== ^ Metoda ^ Parametri ^ Povratni tip ^ | ''SignData(data, hash, mode)'' | byte[], HashAlgorithmName, CryptoMode? | byte[] | | ''VerifyData(data, sig, hash, mode)'' | byte[], byte[], HashAlgorithmName, CryptoMode? | bool | ==== Samostalni ML-DSA ==== ^ Metoda ^ Parametri ^ Povratni tip ^ | ''GenerateMlDsaKeyPair()'' | - | (byte[] PublicKey, byte[] PrivateKey) | | ''SignMlDsa(data, privateKey)'' | byte[], byte[] | byte[] | | ''VerifyMlDsa(data, sig, publicKey)'' | byte[], byte[], byte[] | bool | ==== Upravljanje prolaznim ključevima ==== ^ Metoda ^ Opis ^ | ''SetTransientPqKey(pub, priv)'' | Postavlja par ključeva za thread | | ''SetTransientPqPublicKey(pub)'' | Postavlja samo javni ključ | | ''ClearTransientPqKey()'' | Sigurno briše ključeve | ===== Primjer: Potpuni tijek rada ===== // 1. Konfiguriranje CryptoMode CryptoConfig.DefaultMode = CryptoMode.Hybrid; // 2. Učitavanje certifikata (s PQ ključevima) var cert = X509Certificate2ExportExtensions.ImportPfx( "signing-cert.pfx", "password"); // 3. Potpisivanje dokumenta byte[] documentData = File.ReadAllBytes("contract.pdf"); byte[] signature = cert.SignData(documentData, HashAlgorithmName.SHA256); // 4. Spremanje potpisa File.WriteAllBytes("contract.sig", signature); // 5. Kasnija verifikacija var verifyCert = new X509Certificate2("signing-cert.cer"); bool isValid = verifyCert.VerifyData( File.ReadAllBytes("contract.pdf"), File.ReadAllBytes("contract.sig"), HashAlgorithmName.SHA256); Console.WriteLine($"Potpis valjan: {isValid}"); ===== Sigurnosne napomene ===== * U PostQuantum načinu ne stvara se klasični potpis - nije unatrag kompatibilno * Prolazni ključevi se pohranjuju thread-lokalno - ne dijeliti između niti * Pozvati ''ClearTransientPqKey()'' kada ključevi više nisu potrebni ===== Vidi također ===== * [[.:start|Signatures prostor imena]] * [[.:signeddataextensions|SignedDataExtensions]] * [[..:x509certificates:x509certificate2extensions|X509Certificate2Extensions]] * [[hr:int:pqcrypt:konzepte:algorithmen|ML-DSA algoritam]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//