~~NOTOC~~ ====== Scenario 7.2: Key Encapsulation (ML-KEM) ====== **Categoria:** [[.:start|Crittografia]] \\ **Complessità:** Media \\ **Prerequisiti:** Coppia chiavi ML-KEM \\ **Tempo stimato:** 15-20 minuti ---- ===== Descrizione ===== Questo scenario descrive la **Key Encapsulation** con ML-KEM (Module-Lattice-based Key Encapsulation Mechanism, NIST FIPS 203). ML-KEM è un meccanismo di Key Encapsulation (KEM) Post-Quantum, sicuro contro attacchi di computer quantistici. **KEM vs. Key Exchange:** ^ Aspetto ^ Key Exchange (DH) ^ Key Encapsulation (KEM) ^ | Interattività | Entrambe le parti attive | Solo mittente attivo | | Generazione chiave | Calcolata insieme | Generata casualmente | | Applicazione | TLS Handshake | Crittografia, TLS ibrido | ---- ===== Set di parametri ML-KEM ===== ^ Parametri ^ Sicurezza ^ Chiave pubblica ^ Ciphertext ^ Shared Secret ^ | **ML-KEM-512** | 128-bit | 800 Bytes | 768 Bytes | 32 Bytes | | **ML-KEM-768** | 192-bit | 1.184 Bytes | 1.088 Bytes | 32 Bytes | | **ML-KEM-1024** | 256-bit | 1.568 Bytes | 1.568 Bytes | 32 Bytes | **Raccomandazione:** ML-KEM-768 per la maggior parte delle applicazioni (BSI raccomanda almeno 192-bit). ---- ===== Workflow ===== flowchart LR subgraph Destinatario GEN[KeyGen] --> PK[Chiave pubblica] GEN --> SK[Chiave segreta] end subgraph Mittente PK --> ENC[Encapsulate] ENC --> CT[Ciphertext] ENC --> SS1[Shared Secret] end subgraph Destinatario2[Destinatario] CT --> DEC[Decapsulate] SK --> DEC DEC --> SS2[Shared Secret] end SS1 -.->|uguale| SS2 style SS1 fill:#e8f5e9 style SS2 fill:#e8f5e9 ---- ===== Esempio codice: Generare coppia di chiavi ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using var ctx = PqCryptoContext.Initialize(); // Generare coppia di chiavi ML-KEM-768 using var mlKemKeyPair = ctx.GenerateKeyPair(PqAlgorithm.MlKem768); // Esportare chiave pubblica (per il mittente) var publicKeyPem = mlKemKeyPair.PublicKey.ToPem(); File.WriteAllText("recipient-mlkem.pub.pem", publicKeyPem); // Salvare chiave privata cifrata mlKemKeyPair.ToEncryptedPemFile("recipient-mlkem.key.pem", "SecurePassword!"); Console.WriteLine("Coppia chiavi ML-KEM-768 generata:"); Console.WriteLine($" Chiave pubblica: {mlKemKeyPair.PublicKey.GetRawData().Length} Bytes"); Console.WriteLine($" Algorithm OID: {mlKemKeyPair.PublicKey.Oid.Value}"); ---- ===== Esempio codice: Encapsulation (Mittente) ===== using var ctx = PqCryptoContext.Initialize(); // Caricare chiave pubblica destinatario var recipientPublicKey = ctx.LoadPublicKey("recipient-mlkem.pub.pem"); // Eseguire Key Encapsulation var (ciphertext, sharedSecret) = ctx.Encapsulate(recipientPublicKey); Console.WriteLine($"Encapsulation completata:"); Console.WriteLine($" Ciphertext: {ciphertext.Length} Bytes"); Console.WriteLine($" Shared Secret: {sharedSecret.Length} Bytes"); Console.WriteLine($" Shared Secret (hex): {Convert.ToHexString(sharedSecret)}"); // Inviare ciphertext al destinatario File.WriteAllBytes("ciphertext.bin", ciphertext); // Usare Shared Secret per cifratura var encryptionKey = ctx.DeriveKey( sharedSecret, outputLength: 32, info: Encoding.UTF8.GetBytes("aes-encryption-key") ); ---- ===== Esempio codice: Decapsulation (Destinatario) ===== using var ctx = PqCryptoContext.Initialize(); // Caricare chiave privata var privateKey = ctx.LoadPrivateKey("recipient-mlkem.key.pem", "SecurePassword!"); // Ricevere ciphertext var ciphertext = File.ReadAllBytes("ciphertext.bin"); // Eseguire Decapsulation var sharedSecret = ctx.Decapsulate(privateKey, ciphertext); Console.WriteLine($"Decapsulation completata:"); Console.WriteLine($" Shared Secret: {sharedSecret.Length} Bytes"); Console.WriteLine($" Shared Secret (hex): {Convert.ToHexString(sharedSecret)}"); // Derivare stessa chiave del mittente var decryptionKey = ctx.DeriveKey( sharedSecret, outputLength: 32, info: Encoding.UTF8.GetBytes("aes-encryption-key") ); ---- ===== Classe wrapper per ML-KEM ===== public class MlKemService { private readonly PqCryptoContext _ctx; public MlKemService() { _ctx = PqCryptoContext.Initialize(); } public (byte[] PublicKey, byte[] PrivateKey) GenerateKeyPair(MlKemParameterSet paramSet = MlKemParameterSet.MlKem768) { var algorithm = paramSet switch { MlKemParameterSet.MlKem512 => PqAlgorithm.MlKem512, MlKemParameterSet.MlKem768 => PqAlgorithm.MlKem768, MlKemParameterSet.MlKem1024 => PqAlgorithm.MlKem1024, _ => throw new ArgumentException("Set di parametri non valido") }; using var keyPair = _ctx.GenerateKeyPair(algorithm); return ( keyPair.PublicKey.GetRawData(), keyPair.PrivateKey.GetRawData() ); } public (byte[] Ciphertext, byte[] SharedSecret) Encapsulate(byte[] publicKey) { using var pubKey = _ctx.ImportPublicKey(publicKey); return _ctx.Encapsulate(pubKey); } public byte[] Decapsulate(byte[] privateKey, byte[] ciphertext) { using var privKey = _ctx.ImportPrivateKey(privateKey); return _ctx.Decapsulate(privKey, ciphertext); } } public enum MlKemParameterSet { MlKem512, MlKem768, MlKem1024 } ---- ===== Gestione errori ===== try { var sharedSecret = ctx.Decapsulate(privateKey, ciphertext); } catch (CryptographicException ex) when (ex.Message.Contains("decapsulation")) { // Decapsulation fallita - Ciphertext manipolato o chiave errata Console.WriteLine("Decapsulation fallita: Ciphertext non valido"); throw new SecurityException("Verifica integrità fallita", ex); } catch (ArgumentException ex) { // Formato errato Console.WriteLine($"Errore formato: {ex.Message}"); throw; } **Nota di sicurezza:** ML-KEM è IND-CCA2 sicuro. In caso di errori di decapsulation viene restituito un valore deterministico ma imprevedibile (rifiuto implicito). Questo previene attacchi Chosen-Ciphertext. ---- ===== Parametri specifici per settore ===== ^ Settore ^ Parametro raccomandato ^ Motivazione ^ | **IT standard** | ML-KEM-768 | Buon equilibrio | | **Settore finanziario** | ML-KEM-768/1024 | Requisiti normativi | | **Sanità** | ML-KEM-768 | Protezione dati a lungo termine | | **Governo** | ML-KEM-1024 | Massima sicurezza | | **IoT/Embedded** | ML-KEM-512 | Risorse limitate | ---- ===== Scenari correlati ===== ^ Relazione ^ Scenario ^ Descrizione ^ | **Applicazione** | [[.:hybrid_encryption|7.1 Crittografia ibrida]] | Combinazione con classico | | **Applicazione** | [[.:file_encryption|7.3 Crittografia file]] | Utilizzo pratico | | **Correlato** | [[it:int:pqcrypt:szenarien:schluessel:generierung|11.1 Generazione chiavi]] | Key Generation | | **Correlato** | [[it:int:pqcrypt:szenarien:tls:hybrid_tls|10.4 TLS ibrido]] | TLS con ML-KEM | ---- << [[.:hybrid_encryption|← 7.1 Crittografia ibrida]] | [[.:start|↑ Panoramica crittografia]] | [[.:file_encryption|7.3 Crittografia file →]] >> {{tag>scenario crittografia ml-kem kem post-quantum fips203}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//