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