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

Kategorija: Šifriranje
Kompleksnost: Srednja
Predpogoji: Par ključev ML-KEM
Ocenjeni čas: 15-20 minut


Opis

Ta scenarij opisuje enkapsulacijo ključev z ML-KEM (Module-Lattice-based Key Encapsulation Mechanism, NIST FIPS 203). ML-KEM je post-kvantni mehanizem za enkapsulacijo ključev (KEM), ki je varen pred napadi kvantnih računalnikov.

KEM proti izmenjavi ključev:

Vidik Izmenjava ključev (DH) Enkapsulacija ključev (KEM)
Interaktivnost Obe strani aktivni Samo pošiljatelj aktiven
Generiranje ključa Skupno izračunano Naključno generirano
Uporaba TLS rokovanje Šifriranje, hibridni TLS

Nabori parametrov ML-KEM

Parameter Varnost Javni ključ Šifriran tekst Skupna skrivnost
ML-KEM-512 128-bitov 800 bajtov 768 bajtov 32 bajtov
ML-KEM-768 192-bitov 1.184 bajtov 1.088 bajtov 32 bajtov
ML-KEM-1024 256-bitov 1.568 bajtov 1.568 bajtov 32 bajtov

Priporočilo: ML-KEM-768 za večino aplikacij (BSI priporoča vsaj 192-bitov).


Potek dela

flowchart LR subgraph Prejemnik GEN[KeyGen] --> PK[Javni ključ] GEN --> SK[Zasebni ključ] end subgraph Posiljatelj PK --> ENC[Enkapsulacija] ENC --> CT[Šifriran tekst] ENC --> SS1[Skupna skrivnost] end subgraph Prejemnik2[Prejemnik] CT --> DEC[Dekapsulacija] SK --> DEC DEC --> SS2[Skupna skrivnost] end SS1 -.->|enako| SS2 style SS1 fill:#e8f5e9 style SS2 fill:#e8f5e9


Primer kode: Generiranje para ključev

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

Primer kode: Enkapsulacija (pošiljatelj)

using var ctx = PqCryptoContext.Initialize();
 
// Nalaganje javnega ključa prejemnika
var recipientPublicKey = ctx.LoadPublicKey("recipient-mlkem.pub.pem");
 
// Izvedba enkapsulacije ključa
var (ciphertext, sharedSecret) = ctx.Encapsulate(recipientPublicKey);
 
Console.WriteLine($"Enkapsulacija končana:");
Console.WriteLine($"  Šifriran tekst: {ciphertext.Length} bajtov");
Console.WriteLine($"  Skupna skrivnost: {sharedSecret.Length} bajtov");
Console.WriteLine($"  Skupna skrivnost (hex): {Convert.ToHexString(sharedSecret)}");
 
// Pošiljanje šifriranega teksta prejemniku
File.WriteAllBytes("ciphertext.bin", ciphertext);
 
// Uporaba skupne skrivnosti za šifriranje
var encryptionKey = ctx.DeriveKey(
    sharedSecret,
    outputLength: 32,
    info: Encoding.UTF8.GetBytes("aes-encryption-key")
);

Primer kode: Dekapsulacija (prejemnik)

using var ctx = PqCryptoContext.Initialize();
 
// Nalaganje zasebnega ključa
var privateKey = ctx.LoadPrivateKey("recipient-mlkem.key.pem", "SecurePassword!");
 
// Prejem šifriranega teksta
var ciphertext = File.ReadAllBytes("ciphertext.bin");
 
// Izvedba dekapsulacije
var sharedSecret = ctx.Decapsulate(privateKey, ciphertext);
 
Console.WriteLine($"Dekapsulacija končana:");
Console.WriteLine($"  Skupna skrivnost: {sharedSecret.Length} bajtov");
Console.WriteLine($"  Skupna skrivnost (hex): {Convert.ToHexString(sharedSecret)}");
 
// Izpeljava istega ključa kot pošiljatelj
var decryptionKey = ctx.DeriveKey(
    sharedSecret,
    outputLength: 32,
    info: Encoding.UTF8.GetBytes("aes-encryption-key")
);

Ovojni razred 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("Neveljaven nabor parametrov")
        };
 
        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
}

Obravnava napak

try
{
    var sharedSecret = ctx.Decapsulate(privateKey, ciphertext);
}
catch (CryptographicException ex) when (ex.Message.Contains("decapsulation"))
{
    // Dekapsulacija neuspešna - šifriran tekst spremenjen ali napačen ključ
    Console.WriteLine("Dekapsulacija neuspešna: Šifriran tekst neveljaven");
    throw new SecurityException("Preverjanje celovitosti neuspešno", ex);
}
catch (ArgumentException ex)
{
    // Napačna oblika
    Console.WriteLine($"Napaka oblike: {ex.Message}");
    throw;
}

Varnostna opomba: ML-KEM je IND-CCA2 varen. Ob napakah dekapsulacije se vrne deterministična, a nepredvidljiva vrednost (implicitna zavrnitev). To preprečuje napade z izbranim šifriranim tekstom.


Panožni parametri

Panoga Priporočen parameter Utemeljitev
Standardni IT ML-KEM-768 Dobro ravnovesje
Finančni sektor ML-KEM-768/1024 Regulativne zahteve
Zdravstvo ML-KEM-768 Dolgoročna zaščita podatkov
Vlada ML-KEM-1024 Najvišja varnost
IoT/Vgrajeno ML-KEM-512 Omejeni viri

Povezani scenariji

Povezava Scenarij Opis
Aplikacija 7.1 Hibridno šifriranje Kombinacija s klasičnim
Aplikacija 7.3 Šifriranje datotek Praktična uporaba
Povezano 11.1 Generiranje ključev Generiranje ključev
Povezano 10.4 Hibridni TLS TLS z ML-KEM

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


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