Š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
| Element | Namen |
|---|---|
PostQuantumConfig.Exemptions | z PurePostQuantum dovoli čiste prejemnike ML-KEM in izdajatelja ML-DSA |
MLKemKey.Generate | ustvari par ključev ML-KEM (ML-KEM-768 ali ML-KEM-1024; ML-KEM-512 samo z ReducedParameterSets) |
X509CertificateBuilder s ključem ML-KEM | izda potrdilo prejemnika |
AttachPrivateMLKemKey | potrdilu prejemnika dodeli njegov zasebni ključ |
KemEnvelopedCms.Encrypt, Encode | šifrira vsebino za enega ali več prejemnikov |
KemEnvelopedCms.Decode, Decrypt | deš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.EnvelopedCmsiz .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 potrebujePostQuantumExemptions.NonRecommendedCombiners; dešifriranje obstoječih sporočil izjeme ne potrebuje in sporoči dogodekPolicyDeviation. - Hibridno brez CMS. Za lasten protokol brez CMS
HybridKeyAgreementključ 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.
Decryptpotrebuje zasebni ključ ML-KEM prejemnika. Če manjka, klic ne uspe sCryptographicException.