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