Scenarij 7.2: Enkapsulacija ključa (ML-KEM)

Kategorija: Šifriranje
Složenost: ⭐⭐⭐ (Srednja)
Preduvjeti: ML-KEM par ključeva
Procijenjeno vrijeme: 15-20 minuta


Opis

Ovaj scenarij opisuje enkapsulaciju ključa s ML-KEM (Module-Lattice-based Key Encapsulation Mechanism, NIST FIPS 203). ML-KEM je post-kvantni mehanizam enkapsulacije ključa (KEM) koji je siguran protiv napada kvantnim računalima.

KEM vs. Razmjena ključeva:

Aspekt Razmjena ključeva (DH) Enkapsulacija ključa (KEM)
Interaktivnost Obje strane aktivne Samo pošiljatelj aktivan
Generiranje ključa Zajednički izračunat Nasumično generiran
Primjena TLS rukovanje Šifriranje, hibridni TLS

ML-KEM skupovi parametara

Parametar Sigurnost Javni ključ Ciphertext Shared Secret
ML-KEM-512 128 bita 800 bajtova 768 bajtova 32 bajta
ML-KEM-768 192 bita 1.184 bajtova 1.088 bajtova 32 bajta
ML-KEM-1024 256 bita 1.568 bajtova 1.568 bajtova 32 bajta

Preporuka: ML-KEM-768 za većinu primjena (BSI preporučuje najmanje 192 bita).


Tijek rada

flowchart LR subgraph Primatelj GEN[KeyGen] --> PK[Javni ključ] GEN --> SK[Tajni ključ] end subgraph Pošiljatelj PK --> ENC[Enkapsulacija] ENC --> CT[Ciphertext] ENC --> SS1[Shared Secret] end subgraph Primatelj2[Primatelj] CT --> DEC[Dekapsulacija] SK --> DEC DEC --> SS2[Shared Secret] end SS1 -.->|jednaki| SS2 style SS1 fill:#e8f5e9 style SS2 fill:#e8f5e9


Primjer koda: Generiranje para ključeva

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
 
using var ctx = PqCryptoContext.Initialize();
 
// Generiranje ML-KEM-768 para ključeva
using var mlKemKeyPair = ctx.GenerateKeyPair(PqAlgorithm.MlKem768);
 
// Izvoz javnog ključa (za pošiljatelja)
var publicKeyPem = mlKemKeyPair.PublicKey.ToPem();
File.WriteAllText("recipient-mlkem.pub.pem", publicKeyPem);
 
// Spremanje privatnog ključa šifrirano
mlKemKeyPair.ToEncryptedPemFile("recipient-mlkem.key.pem", "SecurePassword!");
 
Console.WriteLine("ML-KEM-768 par ključeva generiran:");
Console.WriteLine($"  Javni ključ: {mlKemKeyPair.PublicKey.GetRawData().Length} bajtova");
Console.WriteLine($"  Algorithm OID: {mlKemKeyPair.PublicKey.Oid.Value}");

Primjer koda: Enkapsulacija (Pošiljatelj)

using var ctx = PqCryptoContext.Initialize();
 
// Učitavanje javnog ključa primatelja
var recipientPublicKey = ctx.LoadPublicKey("recipient-mlkem.pub.pem");
 
// Izvođenje enkapsulacije ključa
var (ciphertext, sharedSecret) = ctx.Encapsulate(recipientPublicKey);
 
Console.WriteLine($"Enkapsulacija završena:");
Console.WriteLine($"  Ciphertext: {ciphertext.Length} bajtova");
Console.WriteLine($"  Shared Secret: {sharedSecret.Length} bajtova");
Console.WriteLine($"  Shared Secret (hex): {Convert.ToHexString(sharedSecret)}");
 
// Slanje ciphertexta primatelju
File.WriteAllBytes("ciphertext.bin", ciphertext);
 
// Korištenje Shared Secreta za šifriranje
var encryptionKey = ctx.DeriveKey(
    sharedSecret,
    outputLength: 32,
    info: Encoding.UTF8.GetBytes("aes-encryption-key")
);

Primjer koda: Dekapsulacija (Primatelj)

using var ctx = PqCryptoContext.Initialize();
 
// Učitavanje privatnog ključa
var privateKey = ctx.LoadPrivateKey("recipient-mlkem.key.pem", "SecurePassword!");
 
// Primanje ciphertexta
var ciphertext = File.ReadAllBytes("ciphertext.bin");
 
// Izvođenje dekapsulacije
var sharedSecret = ctx.Decapsulate(privateKey, ciphertext);
 
Console.WriteLine($"Dekapsulacija završena:");
Console.WriteLine($"  Shared Secret: {sharedSecret.Length} bajtova");
Console.WriteLine($"  Shared Secret (hex): {Convert.ToHexString(sharedSecret)}");
 
// Derivacija istog ključa kao pošiljatelj
var decryptionKey = ctx.DeriveKey(
    sharedSecret,
    outputLength: 32,
    info: Encoding.UTF8.GetBytes("aes-encryption-key")
);

Wrapper klasa za 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("Nevaljani skup parametara")
        };
 
        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
}

Obrada grešaka

try
{
    var sharedSecret = ctx.Decapsulate(privateKey, ciphertext);
}
catch (CryptographicException ex) when (ex.Message.Contains("decapsulation"))
{
    // Dekapsulacija neuspješna - ciphertext manipuliran ili pogrešan ključ
    Console.WriteLine("Dekapsulacija neuspješna: Ciphertext nevaljan");
    throw new SecurityException("Provjera integriteta neuspješna", ex);
}
catch (ArgumentException ex)
{
    // Pogrešan format
    Console.WriteLine($"Greška formata: {ex.Message}");
    throw;
}

Sigurnosna napomena: ML-KEM je IND-CCA2 siguran. Kod grešaka dekapsulacije vraća se deterministička, ali nepredvidljiva vrijednost (implicitno odbijanje). To sprječava napade odabranim ciphertextom.


Parametri po industrijama

Industrija Preporučeni parametar Obrazloženje
Standardni IT ML-KEM-768 Dobra ravnoteža
Financijski sektor ML-KEM-768/1024 Regulatorni zahtjevi
Zdravstvo ML-KEM-768 Dugoročna zaštita podataka
Vlada ML-KEM-1024 Najviša sigurnost
IoT/Ugradbeni ML-KEM-512 Ograničeni resursi

Povezani scenariji

Odnos Scenarij Opis
Primjena 7.1 Hibridno šifriranje Kombinacija s klasičnim
Primjena 7.3 Šifriranje datoteka Praktična primjena
Povezano 11.1 Generiranje ključeva Key Generation
Povezano 10.4 Hibridni TLS TLS s ML-KEM

« ← 7.1 Hibridno šifriranje | ↑ Pregled šifriranja | 7.3 Šifriranje datoteka → »


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