Color scheme: Light
You are here: start » sl » Dokumentacija » Postkvantna kriptografija » WKL.System.Security.Cryptography – pregled » Prvi koraki » Prva hibridna veriga potrdil

Prva hibridna veriga potrdil

Za izmišljeno podjetje Vzorec d.o.o. izdate hibridno korensko potrdilo, z njim izdate strežniško potrdilo za www.example.com in verigo preverite dvakrat: enkrat tako, kot jo preveri vsaka obstoječa programska oprema, in enkrat skupaj s postkvantnim delom. »Hibridno« pomeni, da vsako potrdilo poleg običajnega podpisa RSA nosi še podpis ML-DSA. Programska oprema, ki PQ ne pozna, vidi običajno potrdilo RSA.

Predpogoji

  • .NET 8 SDK ali novejši za izvajanje primera, .NET 10 SDK za prevajanje knjižnice.
  • OpenSSL 3.5 ali novejši za arhitekturo procesa, glejte Predpogoji.
  • Neobvezno, za navzkrižno preverjanje v 6. koraku: katero koli orodje ukazne vrstice OpenSSL, različica 3.0 ali novejša.

Koraki

1. korak: Ustvarite projekt in vključite knjižnico

dotnet new console -n VzorecPki -f net8.0
cd VzorecPki
dotnet add reference ..\sys-sec-crypto\WKL.System.Security.Cryptography.Extensions.csproj

Pot prilagodite mestu, kjer je izvorna koda knjižnice.

2. korak: Vključite OpenSSL in vklopite hibridni način

Vsebino datoteke Program.cs zamenjajte z:

using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using WKL.System.Security.Cryptography;
using WKL.System.Security.Cryptography.X509Certificates;
 
PostQuantumConfig.OpenSslPath = @"C:\OpenSSL\bin";
PostQuantumConfig.EnablePostQuantum(CryptoMode.Hybrid);
Console.WriteLine(PostQuantumConfig.GetOpenSslVersion());

OpenSslPath je mapa z datoteko libcrypto. EnablePostQuantum naloži OpenSSL in sproži CryptographicException, če ga ni ali če ne ponuja ML-DSA in ML-KEM. Knjižnica torej nikoli neopazno ne nadaljuje brez dela PQ.

Preverjanje: dotnet run izpiše različico OpenSSL, na primer OpenSSL 3.6.1 27 Jan 2026.

3. korak: Izdajte hibridno korensko potrdilo

Dodajte:

using var rootKey = RSA.Create(3072);
var rootRequest = new CertificateRequest(
    "CN=Vzorec Root CA", rootKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
rootRequest.CertificateExtensions.Add(new X509BasicConstraintsExtension(true, false, 0, true));
rootRequest.CertificateExtensions.Add(
    new X509KeyUsageExtension(X509KeyUsageFlags.KeyCertSign | X509KeyUsageFlags.CrlSign, true));
 
using var root = rootRequest.CreateSelfSigned(
    DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(5), CryptoMode.Hybrid);
Console.WriteLine(root.GetSignatureAlgorithmDescription());

To je klic .NET z enim dodatnim argumentom. Brez CryptoMode.Hybrid bi nastalo običajno potrdilo RSA. Knjižnica za potrdilo ustvari par ključev ML-DSA-65 in zasebni ključ hrani v pomnilniku, dokler proces teče.

Preverjanje: Izpis je sha256RSA + ML-DSA-65 (Hybrid).

4. korak: Izdajte strežniško potrdilo

using var leafKey = RSA.Create(2048);
var leafRequest = new CertificateRequest(
    "CN=www.example.com", leafKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
 
using var leaf = leafRequest.Create(
    root, DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(1),
    RandomNumberGenerator.GetBytes(16), CryptoMode.Hybrid);
using var server = leaf.CopyWithPrivateKey(leafKey);
Console.WriteLine(server.HasPqSignature());

Korensko potrdilo podpiše s svojim ključem RSA in s ključem ML-DSA iz 3. koraka. Če tega ključa v procesu ni, na primer ker je bilo korensko potrdilo naloženo iz datoteke PEM namesto iz datoteke PFX, klic ne uspe s CryptographicException, ki navede izdajatelja.

Preverjanje: Izpis je True.

5. korak: Preverite verigo skupaj s postkvantnim delom

using var chain = new X509Chain();
chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
chain.ChainPolicy.CustomTrustStore.Add(root);
chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
 
bool valid = chain.Build(server, CryptoMode.Hybrid);
Console.WriteLine($"Veriga veljavna: {valid}");
foreach (var element in chain.GetValidationReport().Elements)
{
    Console.WriteLine($"{element.Subject}: {element.PqSignatureStatus}");
}
 
File.WriteAllText("root.pem", root.ExportCertificatePem());
File.WriteAllText("server.pem", server.ExportCertificatePem());

Build s CryptoMode.Hybrid najprej izvede običajno preverjanje .NET in nato preveri vsak podpis ML-DSA v verigi. Neveljaven podpis vrne false, enako kot v .NET; klasični razlog navede chain.ChainStatus, rezultat PQ za vsako potrdilo pa GetValidationReport().

Preverjanje: Izpis je:

Veriga veljavna: True
CN=www.example.com: Valid
CN=Vzorec Root CA: Valid

6. korak: Navzkrižno preverite s klasičnim preverjevalnikom

openssl verify -CAfile root.pem server.pem

OpenSSL preveri podpisa RSA in prezre nekritični razširitvi z delom PQ.

Preverjanje: Izpis je server.pem: OK.

Pričakovani rezultat

Imate dve potrdili, ki ju vsaka obstoječa programska oprema sprejme kot potrdili RSA in katerih podpise ML-DSA knjižnica dodatno preveri. Zasebna ključa ML-DSA obstajata samo v procesu, ki teče. Da ju trajno ohranite, potrdilo izvozite kot datoteko PFX.

Naslednji koraki

sl/wiki/pqcrypt/lib/getting-started/first-hybrid-certificate-chain.txt · Last modified: by Wolfgang van der Stille