~~NOTOC~~
====== Scenarij 7.2: Enkapsulacija ključev (ML-KEM) ======
**Kategorija:** [[.:start|Š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** | [[.:hybrid_encryption|7.1 Hibridno šifriranje]] | Kombinacija s klasičnim |
| **Aplikacija** | [[.:file_encryption|7.3 Šifriranje datotek]] | Praktična uporaba |
| **Povezano** | [[sl:int:pqcrypt:szenarien:schluessel:generierung|11.1 Generiranje ključev]] | Generiranje ključev |
| **Povezano** | [[sl:int:pqcrypt:szenarien:tls:hybrid_tls|10.4 Hibridni TLS]] | TLS z ML-KEM |
----
<< [[.:hybrid_encryption|← 7.1 Hibridno šifriranje]] | [[.:start|↑ Pregled šifriranja]] | [[.:file_encryption|7.3 Šifriranje datotek →]] >>
{{tag>szenario verschluesselung ml-kem kem post-quantum fips203}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//