~~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//