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