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