====== SignatureExtensions ====== **Namespace:** ''WvdS.System.Security.Cryptography.Signatures'' Drop-In Replacement razširitve za digitalne podpise s podporo za post-kvantno kriptografijo. Razširja ''RSA'', ''ECDsa'' in ''X509Certificate2'' s PQ-hibridnimi funkcijami podpisovanja. ===== Pregled ===== Ta razred ponuja tri vrste podpisov: | Način | Klasičen | ML-DSA | Uporaba | | Classic | ✓ | - | Standardno .NET obnašanje | | Hybrid | ✓ | ✓ | Maksimalna varnost | | PostQuantum | - | ✓ | Čisto post-kvantno | ===== RSA SignData/VerifyData ===== using var rsa = RSA.Create(2048); byte[] data = Encoding.UTF8.GetBytes("Pomembni podatki"); // Podpisovanje z eksplicitnim načinom byte[] signature = rsa.SignData( data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); // Preverjanje bool isValid = rsa.VerifyData( data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); ==== Tokovni podpis ==== 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(); // Podpisovanje byte[] signature = ecdsa.SignData( data, HashAlgorithmName.SHA256, CryptoMode.Hybrid); // Preverjanje bool isValid = ecdsa.VerifyData( data, signature, HashAlgorithmName.SHA256, CryptoMode.Hybrid); ===== Podpisi na osnovi certifikatov ===== var certificate = GetSigningCertificate(); byte[] data = GetDataToSign(); // Podpisovanje (samodejno uporablja RSA ali ECDSA) byte[] signature = certificate.SignData( data, HashAlgorithmName.SHA256, CryptoMode.Hybrid); // Preverjanje bool isValid = certificate.VerifyData( data, signature, HashAlgorithmName.SHA256, CryptoMode.Hybrid); Tip ključa je samodejno prepoznan: * RSA-certifikat → RSA.SignData + ML-DSA * ECDSA-certifikat → ECDsa.SignData + ML-DSA ===== Samostojni ML-DSA ===== Neposredni ML-DSA podpisi brez klasičnega ključa: // Generiranje para ključev var (publicKey, privateKey) = SignatureExtensions.GenerateMlDsaKeyPair(); // Podpisovanje byte[] data = GetDataToSign(); byte[] signature = SignatureExtensions.SignMlDsa(data, privateKey); // Preverjanje bool isValid = SignatureExtensions.VerifyMlDsa(data, signature, publicKey); ===== Hibridni format podpisa ===== ┌────────────────────────────────────────────┐ │ [4 bajti] Dolžina klasičnega podpisa │ │ [n bajtov] Klasični podpis (RSA/ECDSA) │ │ [m bajtov] PQ-podpis (ML-DSA-65) │ └────────────────────────────────────────────┘ ^ Komponenta ^ Tipična velikost ^ | Polje dolžine | 4 bajti | | RSA-2048 podpis | 256 bajtov | | ECDSA P-256 podpis | ~70 bajtov | | ML-DSA-65 podpis | 3.293 bajtov | | **Hibridni RSA** | **~3.553 bajtov** | | **Hibridni ECDSA** | **~3.367 bajtov** | ===== Začasni PQ-ključi ===== Za samostojne podpise (brez certifikata) se uporabljajo nitno-lokalni začasni ključi: // Nastavitev lastnih ključev var (pubKey, privKey) = SignatureExtensions.GenerateMlDsaKeyPair(); SignatureExtensions.SetTransientPqKey(pubKey, privKey); // Zdaj se lahko SignData/VerifyData uporabljata brez certifikata byte[] sig = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); // Samo javni ključ za preverjanje SignatureExtensions.SetTransientPqPublicKey(pubKey); bool valid = rsa.VerifyData(data, sig, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); // Čiščenje (prepiše zasebni ključ z ničlami) SignatureExtensions.ClearTransientPqKey(); ===== Pregled metod ===== ==== RSA razširitve ==== ^ Metoda ^ Parametri ^ Vrnjeno ^ | ''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 razširitve ==== ^ Metoda ^ Parametri ^ Vrnjeno ^ | ''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 razširitve ==== ^ Metoda ^ Parametri ^ Vrnjeno ^ | ''SignData(data, hash, mode)'' | byte[], HashAlgorithmName, CryptoMode? | byte[] | | ''VerifyData(data, sig, hash, mode)'' | byte[], byte[], HashAlgorithmName, CryptoMode? | bool | ==== Samostojni ML-DSA ==== ^ Metoda ^ Parametri ^ Vrnjeno ^ | ''GenerateMlDsaKeyPair()'' | - | (byte[] PublicKey, byte[] PrivateKey) | | ''SignMlDsa(data, privateKey)'' | byte[], byte[] | byte[] | | ''VerifyMlDsa(data, sig, publicKey)'' | byte[], byte[], byte[] | bool | ==== Upravljanje začasnih ključev ==== ^ Metoda ^ Opis ^ | ''SetTransientPqKey(pub, priv)'' | Nastavi par ključev za nit | | ''SetTransientPqPublicKey(pub)'' | Nastavi samo javni ključ | | ''ClearTransientPqKey()'' | Varno izbriše ključe | ===== Primer: Popoln potek dela ===== // 1. Konfiguracija CryptoMode CryptoConfig.DefaultMode = CryptoMode.Hybrid; // 2. Nalaganje certifikata (s PQ-ključi) var cert = X509Certificate2ExportExtensions.ImportPfx( "signing-cert.pfx", "password"); // 3. Podpisovanje dokumenta byte[] documentData = File.ReadAllBytes("contract.pdf"); byte[] signature = cert.SignData(documentData, HashAlgorithmName.SHA256); // 4. Shranjevanje podpisa File.WriteAllBytes("contract.sig", signature); // 5. Kasnejše preverjanje var verifyCert = new X509Certificate2("signing-cert.cer"); bool isValid = verifyCert.VerifyData( File.ReadAllBytes("contract.pdf"), File.ReadAllBytes("contract.sig"), HashAlgorithmName.SHA256); Console.WriteLine($"Podpis veljaven: {isValid}"); ===== Varnostni nasveti ===== * V načinu PostQuantum ni ustvarjen klasični podpis - ni nazaj združljivo * Začasni ključi so shranjeni nitno-lokalno - ne delite med nitmi * Pokličite ''ClearTransientPqKey()'' ko ključi niso več potrebni ===== Glej tudi ===== * [[.:start|Signatures Namespace]] * [[.:signeddataextensions|SignedDataExtensions]] * [[..:x509certificates:x509certificate2extensions|X509Certificate2Extensions]] * [[sl:int:pqcrypt:konzepte:algorithmen|Algoritem ML-DSA]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//