Scenario 7.2: Key Encapsulation (ML-KEM)

Categoria: 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 7.1 Crittografia ibrida Combinazione con classico
Applicazione 7.3 Crittografia file Utilizzo pratico
Correlato 11.1 Generazione chiavi Key Generation
Correlato 10.4 TLS ibrido TLS con ML-KEM

« ← 7.1 Crittografia ibrida | ↑ Panoramica crittografia | 7.3 Crittografia file → »


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional

Zuletzt geändert: il 30/01/2026 alle 07:08