Inhaltsverzeichnis
NativeCryptoProvider
Namespace: WvdS.System.Security.Cryptography.Providers
Provider crittografico basato su P/Invoke per applicazioni Server e Desktop. Comunica direttamente con OpenSSL 3.6 tramite Platform Invocation Services.
Panoramica
Il NativeCryptoProvider e il provider predefinito per:
- Blazor Server
- ASP.NET Core
- Applicazioni Desktop (Windows, Linux, macOS)
- Applicazioni Console
- Windows Services / Linux Daemons
Proprieta
| Proprieta | Tipo | Descrizione |
|---|---|---|
Name | string | "Native (P/Invoke)" |
IsAvailable | bool | true se OpenSSL 3.6 e raggiungibile |
Inizializzazione
using WvdS.System.Security.Cryptography.Providers; // Creare provider var provider = new NativeCryptoProvider(); // Inizializzare (carica OpenSSL) await provider.InitializeAsync(); // Verificare disponibilita if (provider.IsAvailable) { Console.WriteLine($"Provider: {provider.Name}"); Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}"); }
Operazioni ML-DSA
GenerateMlDsaKeyPairAsync
Genera una coppia di chiavi ML-DSA.
var (publicKey, privateKey) = await provider.GenerateMlDsaKeyPairAsync("ML-DSA-65"); // Algoritmi supportati: // - "ML-DSA-44" (NIST Level 1) // - "ML-DSA-65" (NIST Level 3, raccomandato) // - "ML-DSA-87" (NIST Level 5)
SignMlDsaAsync
Firma dati con ML-DSA.
byte[] data = Encoding.UTF8.GetBytes("Dati importanti"); byte[] signature = await provider.SignMlDsaAsync(data, privateKey);
VerifyMlDsaAsync
Verifica una firma ML-DSA.
bool isValid = await provider.VerifyMlDsaAsync(data, signature, publicKey);
Operazioni ML-KEM
GenerateMlKemKeyPairAsync
Genera una coppia di chiavi ML-KEM.
var (publicKey, privateKey) = await provider.GenerateMlKemKeyPairAsync("ML-KEM-768"); // Algoritmi supportati: // - "ML-KEM-512" (NIST Level 1) // - "ML-KEM-768" (NIST Level 3, raccomandato) // - "ML-KEM-1024" (NIST Level 5)
EncapsulateAsync
Incapsula un Shared Secret con la chiave pubblica.
var (sharedSecret, ciphertext) = await provider.EncapsulateAsync(recipientPublicKey); // sharedSecret: 32 Bytes chiave simmetrica // ciphertext: Da inviare al destinatario
DecapsulateAsync
Decapsula il Shared Secret.
byte[] sharedSecret = await provider.DecapsulateAsync(ciphertext, privateKey);
Operazioni certificati
CreateEphemeralCertificateAsync
Crea un certificato ML-DSA effimero.
var (pubKey, privKey) = await provider.GenerateMlDsaKeyPairAsync(); byte[] certBytes = await provider.CreateEphemeralCertificateAsync( "CN=Ephemeral Test", TimeSpan.FromHours(24), privKey); var cert = new X509Certificate2(certBytes);
SignCertificateAsync
Firma dati TBS del certificato con ML-DSA.
byte[] tbsCertificate = GetTbsCertificate(); byte[] signedCert = await provider.SignCertificateAsync(tbsCertificate, privateKey);
Panoramica metodi
| Metodo | Parametri | Ritorno |
|---|---|---|
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[]> |
Configurazione percorso OpenSSL
// Impostare il percorso prima di InitializeAsync() CryptoConfig.OpenSslPath = @"C:\OpenSSL\bin"; var provider = new NativeCryptoProvider(); await provider.InitializeAsync();
Percorsi di ricerca predefiniti:
| Sistema operativo | Percorsi |
|---|---|
| Windows | .\, C:\OpenSSL\bin, PATH |
| Linux | /usr/local/lib64, /usr/lib/x86_64-linux-gnu |
| macOS | /opt/homebrew/lib, /usr/local/lib |
Note sulle prestazioni
Prestazioni P/Invoke:
- Esecuzione sincrona nel codice nativo
- Wrapper Task per coerenza API con WasmCryptoProvider
- Overhead minimo grazie all'accesso diretto alla memoria
- Thread-safe grazie alla sincronizzazione interna di OpenSSL
Esempio completo
using WvdS.System.Security.Cryptography.Providers; // 1. Inizializzare provider var provider = new NativeCryptoProvider(); await provider.InitializeAsync(); Console.WriteLine($"OpenSSL: {provider.GetOpenSslVersion()}"); // 2. ML-KEM Key Exchange var (alicePublic, alicePrivate) = await provider.GenerateMlKemKeyPairAsync(); var (bobPublic, bobPrivate) = await provider.GenerateMlKemKeyPairAsync(); // Alice incapsula per Bob var (aliceSecret, ciphertext) = await provider.EncapsulateAsync(bobPublic); // Bob decapsula var bobSecret = await provider.DecapsulateAsync(ciphertext, bobPrivate); // I Shared Secrets sono identici Console.WriteLine($"Keys match: {aliceSecret.SequenceEqual(bobSecret)}"); // 3. Firma ML-DSA var (sigPubKey, sigPrivKey) = await provider.GenerateMlDsaKeyPairAsync(); byte[] message = Encoding.UTF8.GetBytes("Messaggio importante"); byte[] signature = await provider.SignMlDsaAsync(message, sigPrivKey); bool isValid = await provider.VerifyMlDsaAsync(message, signature, sigPubKey); Console.WriteLine($"Signature valid: {isValid}");
Note di sicurezza
- Richiede OpenSSL 3.6.0 o superiore con algoritmi PQ
- Le chiavi private vengono mantenute nella memoria del processo
- Le chiavi non vengono cancellate automaticamente alla chiusura dell'applicazione
- Per massima sicurezza: cancellare le chiavi esplicitamente con
CryptographicOperations.ZeroMemory
Vedi anche
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional
Zuletzt geändert: il 30/01/2026 alle 00:13