~~NOTOC~~ ====== Scenarij 7.1: Hibridno šifriranje ====== **Kategorija:** [[.:start|Šifriranje]] \\ **Kompleksnost:** Visoka \\ **Predpogoji:** Par ključev ML-KEM, klasični par ključev \\ **Ocenjeni čas:** 20-30 minut ---- ===== Opis ===== Ta scenarij opisuje **hibridno šifriranje** s klasičnimi (RSA/ECDH) in post-kvantnimi (ML-KEM) algoritmi. Hibridno šifriranje združuje oba postopka za zaščito tako pred klasičnimi kot pred kvantnimi napadi. **Koncept:** * **Klasični ključ** - Zaščita pred današnjimi grožnjami * **PQ ključ** - Zaščita pred prihodnjimi kvantnimi računalniki * **Kombinirani ključ** - Varnost dokler je eden od obeh varen ---- ===== Potek dela ===== flowchart LR subgraph Posiljatelj DATA[Podatki] --> SYM[AES-256-GCM] KEY1[RSA/ECDH izmenjava ključev] --> KDF KEY2[ML-KEM enkapsulacija ključa] --> KDF KDF[HKDF kombinacija] --> SYM end subgraph Prejemnik SYM2[AES-256-GCM dešifriranje] KDF2[HKDF kombinacija] --> SYM2 DEC1[RSA/ECDH dešifriranje] --> KDF2 DEC2[ML-KEM dekapsulacija] --> KDF2 end SYM --> |Šifriran tekst| SYM2 style KDF fill:#e8f5e9 style KDF2 fill:#e8f5e9 ---- ===== Primer kode (C#) ===== using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; using System.Security.Cryptography; using var ctx = PqCryptoContext.Initialize(); // Ključi prejemnika (oba algoritma) var recipientEcdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP384); var recipientMlKem = ctx.GenerateKeyPair(PqAlgorithm.MlKem768); // === ŠIFRIRANJE === // 1. Klasična izmenjava ključev (ECDH) using var senderEcdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP384); var ecdhSharedSecret = senderEcdh.DeriveKeyMaterial(recipientEcdh.PublicKey); // 2. PQ enkapsulacija ključa (ML-KEM) var (mlKemCiphertext, mlKemSharedSecret) = ctx.Encapsulate(recipientMlKem.PublicKey); // 3. Kombinacija ključev preko HKDF var combinedSecret = CombineSecrets(ecdhSharedSecret, mlKemSharedSecret); var encryptionKey = ctx.DeriveKey( combinedSecret, outputLength: 32, salt: null, info: Encoding.UTF8.GetBytes("hybrid-encryption-v1") ); // 4. Šifriranje podatkov var plaintext = Encoding.UTF8.GetBytes("Skrivno sporočilo"); var nonce = RandomNumberGenerator.GetBytes(12); var ciphertext = new byte[plaintext.Length]; var tag = new byte[16]; using var aes = new OpenSslAesGcm(encryptionKey); aes.Encrypt(nonce, plaintext, ciphertext, tag); // 5. Sestavitev šifriranega sporočila var encryptedMessage = new HybridEncryptedMessage { EcdhPublicKey = senderEcdh.PublicKey.ExportSubjectPublicKeyInfo(), MlKemCiphertext = mlKemCiphertext, Nonce = nonce, Ciphertext = ciphertext, Tag = tag }; Console.WriteLine($"Šifrirano: {encryptedMessage.Ciphertext.Length} bajtov"); ---- ===== Dešifriranje ===== // === DEŠIFRIRANJE === using var ctx = PqCryptoContext.Initialize(); // Nalaganje zasebnih ključev prejemnika var recipientEcdh = ctx.LoadEcdhPrivateKey("recipient-ecdh.key.pem", "Password!"); var recipientMlKem = ctx.LoadPrivateKey("recipient-mlkem.key.pem", "Password!"); // 1. Klasična izmenjava ključev var senderEcdhPubKey = ECDiffieHellman.Create(); senderEcdhPubKey.ImportSubjectPublicKeyInfo(encryptedMessage.EcdhPublicKey, out _); var ecdhSharedSecret = recipientEcdh.DeriveKeyMaterial(senderEcdhPubKey.PublicKey); // 2. PQ dekapsulacija ključa var mlKemSharedSecret = ctx.Decapsulate(recipientMlKem, encryptedMessage.MlKemCiphertext); // 3. Kombinacija ključev var combinedSecret = CombineSecrets(ecdhSharedSecret, mlKemSharedSecret); var decryptionKey = ctx.DeriveKey( combinedSecret, outputLength: 32, salt: null, info: Encoding.UTF8.GetBytes("hybrid-encryption-v1") ); // 4. Dešifriranje podatkov var decrypted = new byte[encryptedMessage.Ciphertext.Length]; using var aes = new OpenSslAesGcm(decryptionKey); aes.Decrypt( encryptedMessage.Nonce, encryptedMessage.Ciphertext, encryptedMessage.Tag, decrypted ); var message = Encoding.UTF8.GetString(decrypted); Console.WriteLine($"Dešifrirano: {message}"); ---- ===== Kombinacija skrivnosti (HKDF) ===== private static byte[] CombineSecrets(byte[] secret1, byte[] secret2) { // Združi in zgoščeni - preprosta ampak varna metoda // Alternativno: Vzporedni HKDF in XOR var combined = new byte[secret1.Length + secret2.Length]; Buffer.BlockCopy(secret1, 0, combined, 0, secret1.Length); Buffer.BlockCopy(secret2, 0, combined, secret1.Length, secret2.Length); // HKDF Extract return HKDF.Extract(HashAlgorithmName.SHA256, combined); } ---- ===== Oblika sporočila ===== public class HybridEncryptedMessage { // Glava public string Version { get; set; } = "1.0"; public string Algorithm { get; set; } = "ECDH-P384+ML-KEM-768/AES-256-GCM"; // Enkapsulacija ključa public byte[] EcdhPublicKey { get; set; } // ECDH efemerni javni ključ public byte[] MlKemCiphertext { get; set; } // ML-KEM šifriran tekst // Šifrirana vsebina public byte[] Nonce { get; set; } // 12 bajtov public byte[] Ciphertext { get; set; } // Spremenljivo public byte[] Tag { get; set; } // 16 bajtov // Serializacija public byte[] Serialize() { using var ms = new MemoryStream(); using var writer = new BinaryWriter(ms); writer.Write(Version); writer.Write(Algorithm); writer.Write(EcdhPublicKey.Length); writer.Write(EcdhPublicKey); writer.Write(MlKemCiphertext.Length); writer.Write(MlKemCiphertext); writer.Write(Nonce.Length); writer.Write(Nonce); writer.Write(Ciphertext.Length); writer.Write(Ciphertext); writer.Write(Tag.Length); writer.Write(Tag); return ms.ToArray(); } } ---- ===== Kombinacije algoritmov ===== ^ Kombinacija ^ Klasično ^ PQ ^ Varnostni nivo ^ | Standardno | ECDH P-384 | ML-KEM-768 | 192-bitov hibridno | | Visoka varnost | ECDH P-521 | ML-KEM-1024 | 256-bitov hibridno | | Podpora za podedovano | RSA-4096 + ECDH P-256 | ML-KEM-512 | 128-bitov hibridno | | Minimalno | X25519 | ML-KEM-512 | 128-bitov hibridno | ---- ===== Panožne zahteve ===== ^ Panoga ^ Min. varnost ^ Priporočena kombinacija ^ | **Finančni sektor** | 192-bitov | ECDH P-384 + ML-KEM-768 | | **Zdravstvo** | 128-bitov | ECDH P-256 + ML-KEM-512 | | **Vlada** | 256-bitov | ECDH P-521 + ML-KEM-1024 | | **Energetika** | 192-bitov | ECDH P-384 + ML-KEM-768 | ---- ===== Povezani scenariji ===== ^ Povezava ^ Scenarij ^ Opis ^ | **Komponenta** | [[.:key_encapsulation|7.2 Enkapsulacija ključev]] | Podrobnosti ML-KEM | | **Aplikacija** | [[.:file_encryption|7.3 Šifriranje datotek]] | Praktična uporaba | | **Povezano** | [[sl:int:pqcrypt:szenarien:schluessel:generierung|11.1 Generiranje ključev]] | Ustvarjanje ključev | ---- << [[.:start|← Pregled šifriranja]] | [[sl:int:pqcrypt:szenarien:start|↑ Scenariji]] | [[.:key_encapsulation|7.2 Enkapsulacija ključev →]] >> {{tag>szenario verschluesselung hybrid ml-kem ecdh}} ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//