Barvna shema: Riviera
Trenutno dejavna stran: start » sl » Dokumentacija » Postkvantna kriptografija » WKL.System.Security.Cryptography – pregled » Navodila » Šifriranje sporočil CMS

Šifriranje sporočil CMS

Podatke šifrirate za prejemnika, katerega potrdilo nosi ključ ML-KEM, na primer za arhiv, katerega vsebina naj ostane zaupna tudi pred prihodnjimi kvantnimi računalniki.

Pregled rešitve

ElementNamen
PostQuantumConfig.Exemptionsz PurePostQuantum dovoli čiste prejemnike ML-KEM in izdajatelja ML-DSA
MLKemKey.Generateustvari par ključev ML-KEM (ML-KEM-768 ali ML-KEM-1024; ML-KEM-512 samo z ReducedParameterSets)
X509CertificateBuilder s ključem ML-KEMizda potrdilo prejemnika
AttachPrivateMLKemKeypotrdilu prejemnika dodeli njegov zasebni ključ
KemEnvelopedCms.Encrypt, Encodešifrira vsebino za enega ali več prejemnikov
KemEnvelopedCms.Decode, Decryptdešifrira pri prejemniku

KemEnvelopedCms je zgrajen kot EnvelopedCms iz .NET.

Izvedba

BSI TR-02102-1 ML-KEM priporoča samo v kombinaciji s klasičnim postopkom, za to pa združevalnika CatKDF ali KeyCombine. KEMRecipientInfo po RFC 9629 uporablja ML-KEM sam, sestavljeni ML-KEM pa združuje s SHA3-256. Obe vrsti prejemnikov zato potrebujeta izjemo, ki jo nastavite enkrat ob zagonu aplikacije; v primeru PurePostQuantum za prejemnika ML-KEM in čistega overitelja ML-DSA:

PostQuantumConfig.Exemptions |= PostQuantumExemptions.PurePostQuantum;

Potrdilo prejemnika; ključ ML-KEM ne more podpisovati, zato potrdilo izda izdajatelj ML-DSA. V primeru je to lasten overitelj:

var now = DateTimeOffset.UtcNow;
using var caKey = MLDsaKey.Generate(MLDsaParameterSet.MLDsa65);
var caRequest = new MLDsaX509SignatureGenerator(caKey).CreateCertificateRequest("CN=Vzorec PQ CA");
caRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, true));
caRequest.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.KeyCertSign, true));
using var ca = caRequest.CreateSelfSigned(now, now.AddYears(10), CryptoMode.PostQuantum);
 
using var archiveKey = MLKemKey.Generate(MLKemParameterSet.MLKem768);
var archiveBuilder = new X509CertificateBuilder(
    new X500DistinguishedName("CN=Vzorec Arhiv"), archiveKey.ExportSubjectPublicKeyInfo(), default);
archiveBuilder.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment, true));
using var archive = archiveBuilder.Create(
    ca, now, now.AddYears(1), RandomNumberGenerator.GetBytes(16), CryptoMode.PostQuantum);
archive.AttachPrivateMLKemKey(archiveKey);

Šifriranje in dešifriranje:

var outgoing = new KemEnvelopedCms(new ContentInfo("Pogodba 2026-17"u8.ToArray()));
outgoing.Encrypt(archive);
byte[] envelope = outgoing.Encode();
 
var incoming = new KemEnvelopedCms();
incoming.Decode(envelope);
incoming.Decrypt(archive);
Console.WriteLine(System.Text.Encoding.UTF8.GetString(incoming.ContentInfo.Content));

Opombe

  • Berljivo samo s KemEnvelopedCms. EnvelopedCms iz .NET sporočil s KEMRecipientInfo ne more dekodirati, tudi ne za prejemnika RSA v istem sporočilu.
  • Hibridno s sestavljenim ML-KEM. Če potrdilo prejemnika nosi sestavljeni ključ ML-KEM, vsebina ostane zaupna, dokler zdrži vsaj eden od obeh delov. Zasebni ključ takrat dodelite z AttachPrivateCompositeMLKemKey. Šifriranje za takega prejemnika potrebuje PostQuantumExemptions.NonRecommendedCombiners; dešifriranje obstoječih sporočil izjeme ne potrebuje in sporoči dogodek PolicyDeviation.
  • Hibridno brez CMS. Za lasten protokol brez CMS HybridKeyAgreement ključ iz ECDH in ML-KEM dogovori s KeyCombine, brez izjeme; glejte Dogovor o hibridnem ključu.
  • Prejemnik RSA v istem sporočilu. Prejemnik s potrdilom RSA dobi KeyTransRecipientInfo z RSAES-OAEP. Tudi on sporočilo odpre s KemEnvelopedCms.
  • Zasebni ključ mora biti v procesu. Decrypt potrebuje zasebni ključ ML-KEM prejemnika. Če manjka, klic ne uspe s CryptographicException.

Sorodne teme

sl/wiki/pqcrypt/lib/how-to/encrypt-cms-messages.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille