Scenarij 7.1: Hibridno šifriranje

Kategorija: Šifriranje
Složenost: ⭐⭐⭐⭐ (Visoka)
Preduvjeti: ML-KEM par ključeva, klasični par ključeva
Procijenjeno vrijeme: 20-30 minuta


Opis

Ovaj scenarij opisuje hibridno šifriranje s klasičnim (RSA/ECDH) i post-kvantnim (ML-KEM) algoritmima. Hibridno šifriranje kombinira oba postupka kako bi se zaštitilo od klasičnih i kvantnih napada.

Koncept:

  • Klasični ključ - Zaštita od trenutnih prijetnji
  • PQ ključ - Zaštita od budućih kvantnih računala
  • Kombinirani ključ - Sigurnost dok god je jedan od dva siguran

Tijek rada

flowchart LR subgraph Pošiljatelj DATA[Podaci] --> SYM[AES-256-GCM] KEY1[RSA/ECDH Key Exchange] --> KDF KEY2[ML-KEM Key Encapsulation] --> KDF KDF[HKDF Combine] --> SYM end subgraph Primatelj SYM2[AES-256-GCM Decrypt] KDF2[HKDF Combine] --> SYM2 DEC1[RSA/ECDH Decrypt] --> KDF2 DEC2[ML-KEM Decapsulate] --> KDF2 end SYM --> |Ciphertext| SYM2 style KDF fill:#e8f5e9 style KDF2 fill:#e8f5e9


Primjer koda (C#)

using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
using System.Security.Cryptography;
 
using var ctx = PqCryptoContext.Initialize();
 
// Ključevi primatelja (oba algoritma)
var recipientEcdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP384);
var recipientMlKem = ctx.GenerateKeyPair(PqAlgorithm.MlKem768);
 
// === ŠIFRIRANJE ===
 
// 1. Klasična razmjena ključeva (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. Kombiniranje ključeva putem HKDF
var combinedSecret = CombineSecrets(ecdhSharedSecret, mlKemSharedSecret);
var encryptionKey = ctx.DeriveKey(
    combinedSecret,
    outputLength: 32,
    salt: null,
    info: Encoding.UTF8.GetBytes("hybrid-encryption-v1")
);
 
// 4. Šifriranje podataka
var plaintext = Encoding.UTF8.GetBytes("Tajna poruka");
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. Sastavljanje šifrirane poruke
var encryptedMessage = new HybridEncryptedMessage
{
    EcdhPublicKey = senderEcdh.PublicKey.ExportSubjectPublicKeyInfo(),
    MlKemCiphertext = mlKemCiphertext,
    Nonce = nonce,
    Ciphertext = ciphertext,
    Tag = tag
};
 
Console.WriteLine($"Šifrirano: {encryptedMessage.Ciphertext.Length} bajtova");

Dešifriranje

// === DEŠIFRIRANJE ===
 
using var ctx = PqCryptoContext.Initialize();
 
// Učitavanje privatnih ključeva primatelja
var recipientEcdh = ctx.LoadEcdhPrivateKey("recipient-ecdh.key.pem", "Password!");
var recipientMlKem = ctx.LoadPrivateKey("recipient-mlkem.key.pem", "Password!");
 
// 1. Klasična razmjena ključeva
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. Kombiniranje ključeva
var combinedSecret = CombineSecrets(ecdhSharedSecret, mlKemSharedSecret);
var decryptionKey = ctx.DeriveKey(
    combinedSecret,
    outputLength: 32,
    salt: null,
    info: Encoding.UTF8.GetBytes("hybrid-encryption-v1")
);
 
// 4. Dešifriranje podataka
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 tajni (HKDF)

private static byte[] CombineSecrets(byte[] secret1, byte[] secret2)
{
    // Concat i hash - jednostavna ali sigurna metoda
    // Alternativno: paralelni HKDF i 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);
}

Format poruke

public class HybridEncryptedMessage
{
    // Zaglavlje
    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 ciphertext
 
    // Šifrirani sadržaj
    public byte[] Nonce { get; set; }           // 12 bajtova
    public byte[] Ciphertext { get; set; }      // Varijabilno
    public byte[] Tag { get; set; }             // 16 bajtova
 
    // Serijalizacija
    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 algoritama

Kombinacija Klasični PQ Razina sigurnosti
Standard ECDH P-384 ML-KEM-768 192-bitna hibridna
Visoka sigurnost ECDH P-521 ML-KEM-1024 256-bitna hibridna
Legacy podrška RSA-4096 + ECDH P-256 ML-KEM-512 128-bitna hibridna
Minimalna X25519 ML-KEM-512 128-bitna hibridna

Zahtjevi po industrijama

Industrija Min. sigurnost Preporučena kombinacija
Financijski sektor 192 bita ECDH P-384 + ML-KEM-768
Zdravstvo 128 bita ECDH P-256 + ML-KEM-512
Vlada 256 bita ECDH P-521 + ML-KEM-1024
Energetika 192 bita ECDH P-384 + ML-KEM-768

Povezani scenariji

Odnos Scenarij Opis
Komponenta 7.2 Enkapsulacija ključa ML-KEM detalji
Primjena 7.3 Šifriranje datoteka Praktična primjena
Povezano 11.1 Generiranje ključeva Kreiranje ključeva

« ← Pregled šifriranja | ↑ Scenariji | 7.2 Enkapsulacija ključa → »


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional

Zuletzt geändert: 30.01.2026. u 07:23