Kategorija: Šifriranje
Složenost: ⭐⭐⭐ (Srednja)
Preduvjeti: ML-KEM par ključeva
Procijenjeno vrijeme: 15-20 minuta
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 |
| 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).
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}");
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") );
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") );
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 }
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.
| 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 |
| Odnos | Scenarij | Opis |
|---|---|---|
| Primjena | 7.1 Hibridno šifriranje | Kombinacija s klasičnim |
| Primjena | 7.3 Šifriranje datoteka | Praktična primjena |
| Povezano | 11.1 Generiranje ključeva | Key Generation |
| Povezano | 10.4 Hibridni TLS | TLS s ML-KEM |
« ← 7.1 Hibridno šifriranje | ↑ Pregled šifriranja | 7.3 Šifriranje datoteka → »
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional