Inhaltsverzeichnis
NativeCryptoProvider
Namespace: WvdS.System.Security.Cryptography.Providers
P/Invoke-osnovan kriptografski ponudnik za strežnike in namizne aplikacije. Komunicira neposredno z OpenSSL 3.6 preko Platform Invocation Services.
Pregled
NativeCryptoProvider je privzeti ponudnik za:
- Blazor Server
- ASP.NET Core
- Namizne aplikacije (Windows, Linux, macOS)
- Konzolne aplikacije
- Windows Services / Linux Daemons
Lastnosti
| Lastnost | Tip | Opis |
|---|---|---|
Name | string | "Native (P/Invoke)" |
IsAvailable | bool | true če je OpenSSL 3.6 dosegljiv |
Inicializacija
using WvdS.System.Security.Cryptography.Providers; // Ustvarjanje ponudnika var provider = new NativeCryptoProvider(); // Inicializacija (naloži OpenSSL) await provider.InitializeAsync(); // Preverjanje razpoložljivosti if (provider.IsAvailable) { Console.WriteLine($"Ponudnik: {provider.Name}"); Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}"); }
Operacije ML-DSA
GenerateMlDsaKeyPairAsync
Generira ML-DSA par ključev.
var (publicKey, privateKey) = await provider.GenerateMlDsaKeyPairAsync("ML-DSA-65"); // Podprti algoritmi: // - "ML-DSA-44" (NIST Level 1) // - "ML-DSA-65" (NIST Level 3, priporočeno) // - "ML-DSA-87" (NIST Level 5)
SignMlDsaAsync
Podpiše podatke z ML-DSA.
byte[] data = Encoding.UTF8.GetBytes("Pomembni podatki"); byte[] signature = await provider.SignMlDsaAsync(data, privateKey);
VerifyMlDsaAsync
Preveri ML-DSA podpis.
bool isValid = await provider.VerifyMlDsaAsync(data, signature, publicKey);
Operacije ML-KEM
GenerateMlKemKeyPairAsync
Generira ML-KEM par ključev.
var (publicKey, privateKey) = await provider.GenerateMlKemKeyPairAsync("ML-KEM-768"); // Podprti algoritmi: // - "ML-KEM-512" (NIST Level 1) // - "ML-KEM-768" (NIST Level 3, priporočeno) // - "ML-KEM-1024" (NIST Level 5)
EncapsulateAsync
Enkapsulira skupno skrivnost z javnim ključem.
var (sharedSecret, ciphertext) = await provider.EncapsulateAsync(recipientPublicKey); // sharedSecret: 32 bajtov simetrični ključ // ciphertext: Pošlji prejemniku
DecapsulateAsync
Dekapsulira skupno skrivnost.
byte[] sharedSecret = await provider.DecapsulateAsync(ciphertext, privateKey);
Operacije s certifikati
CreateEphemeralCertificateAsync
Ustvari kratkoživ ML-DSA certifikat.
var (pubKey, privKey) = await provider.GenerateMlDsaKeyPairAsync(); byte[] certBytes = await provider.CreateEphemeralCertificateAsync( "CN=Efemerni test", TimeSpan.FromHours(24), privKey); var cert = new X509Certificate2(certBytes);
SignCertificateAsync
Podpiše TBS-podatke certifikata z ML-DSA.
byte[] tbsCertificate = GetTbsCertificate(); byte[] signedCert = await provider.SignCertificateAsync(tbsCertificate, privateKey);
Pregled metod
| Metoda | Parametri | Vrnjeno |
|---|---|---|
InitializeAsync() | - | Task |
GetOpenSslVersion() | - | string |
GenerateMlDsaKeyPairAsync | string algorithm | Task<(byte[], byte[])> |
SignMlDsaAsync | byte[] data, byte[] privateKey | Task<byte[]> |
VerifyMlDsaAsync | byte[] data, byte[] signature, byte[] publicKey | Task<bool> |
GenerateMlKemKeyPairAsync | string algorithm | Task<(byte[], byte[])> |
EncapsulateAsync | byte[] publicKey | Task<(byte[], byte[])> |
DecapsulateAsync | byte[] ciphertext, byte[] privateKey | Task<byte[]> |
CreateEphemeralCertificateAsync | string subject, TimeSpan validity, byte[] privateKey | Task<byte[]> |
SignCertificateAsync | byte[] tbsCertificate, byte[] privateKey | Task<byte[]> |
Konfiguracija poti OpenSSL
// Pred InitializeAsync() nastavite pot CryptoConfig.OpenSslPath = @"C:\OpenSSL\bin"; var provider = new NativeCryptoProvider(); await provider.InitializeAsync();
Privzete iskalne poti:
| Operacijski sistem | Poti |
|---|---|
| Windows | .\, C:\OpenSSL\bin, PATH |
| Linux | /usr/local/lib64, /usr/lib/x86_64-linux-gnu |
| macOS | /opt/homebrew/lib, /usr/local/lib |
Nasveti glede zmogljivosti
Zmogljivost P/Invoke:
- Sinhrona izvedba v izvorni kodi
- Task-ovoj za konsistenco API-ja z WasmCryptoProvider
- Minimalni stroški zaradi neposrednega dostopa do pomnilnika
- Nitno-varno preko notranje sinhronizacije OpenSSL
Popoln primer
using WvdS.System.Security.Cryptography.Providers; // 1. Inicializacija ponudnika var provider = new NativeCryptoProvider(); await provider.InitializeAsync(); Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}"); // 2. ML-KEM izmenjava ključev var (alicePublic, alicePrivate) = await provider.GenerateMlKemKeyPairAsync(); var (bobPublic, bobPrivate) = await provider.GenerateMlKemKeyPairAsync(); // Alice enkapsulira za Boba var (aliceSecret, ciphertext) = await provider.EncapsulateAsync(bobPublic); // Bob dekapsulira var bobSecret = await provider.DecapsulateAsync(ciphertext, bobPrivate); // Skupni skrivnosti sta enaki Console.WriteLine($"Ključi se ujemajo: {aliceSecret.SequenceEqual(bobSecret)}"); // 3. ML-DSA podpis var (sigPubKey, sigPrivKey) = await provider.GenerateMlDsaKeyPairAsync(); byte[] message = Encoding.UTF8.GetBytes("Pomembno sporočilo"); byte[] signature = await provider.SignMlDsaAsync(message, sigPrivKey); bool isValid = await provider.VerifyMlDsaAsync(message, signature, sigPubKey); Console.WriteLine($"Podpis veljaven: {isValid}");
Varnostni nasveti
- Zahteva OpenSSL 3.6.0 ali novejši s PQ-algoritmi
- Zasebni ključi so shranjeni v pomnilniku procesa
- Ob koncu aplikacije ključi niso samodejno izbrisani
- Za najvišjo varnost: Ključe eksplicitno izbrišite s
CryptographicOperations.ZeroMemory
Glej tudi
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional
Zuletzt geändert: dne 30.01.2026 ob 01:24