X509StoreExtensions

Namespace: WvdS.System.Security.Cryptography.X509Certificates

Razširitve za X509Store s persistenco post-kvantnih ključev. Omogoča shranjevanje in obnavljanje PQ-ključev v Windows Certificate Store.

Pregled

Windows Certificate Store ne podpira post-kvantnih ključev izvorno. Te razširitve shranjujejo PQ-ključe v ločenem, šifriranem datotečnem sistemu:

%LOCALAPPDATA%\WvdS.Crypto\PqKeys\{thumbprint}.pqkey

Ključi so samodejno šifrirani z DPAPI (Windows) ali AES-256 (medplatformno).

Metode

Metoda Opis
Add(certificate, mode) Doda certifikat in persistira PQ-ključe
AddRange(collection, mode) Doda več certifikatov
Remove(certificate, deletePqKeys) Odstrani certifikat in opcijsko PQ-ključe
RemoveRange(collection, deletePqKeys) Odstrani več certifikatov
Find(findType, findValue, validOnly, restorePqKeys) Poišče certifikate in obnovi PQ-ključe
GetCertificatesWithPqKeys() Vsi certifikati z obnovljenimi PQ-ključi

Statične metode

Metoda Opis
PersistPqKeys(certificate) Ročno persistira PQ-ključe
RestorePqKeys(certificate) Ročno obnovi PQ-ključe
DeletePqKeys(certificate) Izbriše persistirane PQ-ključe
HasPersistedPqKeys(certificate) Preveri ali so PQ-ključi prisotni
GetPersistedPqKeyThumbprints() Našteje vse thumbprinte

Dodajanje certifikata

using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
 
// Dodajanje certifikata s PQ-ključi
var hybridCert = CreateHybridCertificate();
store.Add(hybridCert, CryptoMode.Hybrid);
 
// PQ-ključi so samodejno persistirani
Console.WriteLine($"PQ-ključi shranjeni: {X509StoreExtensions.HasPersistedPqKeys(hybridCert)}");

Iskanje certifikata s PQ-ključi

using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
 
// Iskanje in obnova PQ-ključev
var certs = store.Find(
    X509FindType.FindBySubjectName,
    "MojCertifikat",
    validOnly: true,
    restorePqKeys: true);  // Samodejno naloži PQ-ključe
 
foreach (var cert in certs)
{
    Console.WriteLine($"Najdeno: {cert.Subject}");
    Console.WriteLine($"Način: {cert.GetCryptoMode()}");
 
    // PQ-ključi so zdaj na voljo
    if (PqKeyStore.TryGetPublicKey(cert, out var pqKey))
    {
        Console.WriteLine($"PQ-ključ: {pqKey.Length} bajtov");
    }
}

Vsi certifikati s PQ-ključi

using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
 
var allCerts = store.GetCertificatesWithPqKeys();
 
foreach (var cert in allCerts)
{
    var hasPq = X509StoreExtensions.HasPersistedPqKeys(cert);
    Console.WriteLine($"{cert.Subject}: PQ={hasPq}");
}

Odstranjevanje certifikata

using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
 
var certToRemove = FindCertificate(store);
 
// S čiščenjem PQ-ključev (priporočeno)
store.Remove(certToRemove, deletePqKeys: true);
 
// Brez čiščenja PQ-ključev (ključi ostanejo)
store.Remove(certToRemove, deletePqKeys: false);

PqKeyStoreManager

Dodatni razred za upravljanje shrambe:

// Čiščenje osirotelih ključev (ključi brez pripadajočega certifikata)
int deleted = PqKeyStoreManager.CleanupOrphanedKeys(
    StoreName.My,
    StoreLocation.CurrentUser);
Console.WriteLine($"{deleted} osirotelih ključev izbrisanih");
 
// Varnostna kopija vseh PQ-ključev
PqKeyStoreManager.BackupAllPqKeys(
    "pq-keys-backup.enc",
    "GesloZaVarnostnKopijo123!");
 
// Obnova iz varnostne kopije
int restored = PqKeyStoreManager.RestoreFromBackup(
    "pq-keys-backup.enc",
    "GesloZaVarnostnKopijo123!");
Console.WriteLine($"{restored} ključev obnovljenih");

Šifriranje ključev

Windows (DPAPI)

DataProtectionScope.CurrentUser
- Samo trenutni uporabnik lahko dešifrira ključe
- Ključi so vezani na uporabniški profil

Medplatformno (AES-256)

Key = SHA256(MachineName + UserName)
IV = naključno generiran
- Ključi so vezani na stroj + uporabnika
- Manj varno kot DPAPI

Varno brisanje

PQ-ključi so varno izbrisani:

// Interno se izvede:
// 1. Prepisovanje datoteke z naključnimi podatki
var random = RandomNumberGenerator.GetBytes(fileLength);
File.WriteAllBytes(keyPath, random);
 
// 2. Brisanje datoteke
File.Delete(keyPath);

Primer: Popoln potek dela

// 1. Ustvarjanje hibridnega certifikata
CryptoConfig.EnablePostQuantum();
var cert = CreateHybridCertificate("CN=Hibridni test");
 
// 2. Dodajanje v shrambo
using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
    store.Open(OpenFlags.ReadWrite);
    store.Add(cert, CryptoMode.Hybrid);
}
 
// 3. Ponovni zagon aplikacije...
 
// 4. Kasnejše nalaganje
using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
    store.Open(OpenFlags.ReadOnly);
    var found = store.Find(
        X509FindType.FindBySubjectName,
        "Hibridni test",
        true,
        restorePqKeys: true);
 
    var loadedCert = found[0];
 
    // PQ-ključi so obnovljeni!
    var pqPublicKey = PqKeyStore.GetPublicKey(loadedCert);
    Console.WriteLine($"PQ-ključ naložen: {pqPublicKey.Length} bajtov");
}

Lokacija shrambe

Operacijski sistem Pot
Windows %LOCALAPPDATA%\WvdS.Crypto\PqKeys\
Linux ~/.local/share/WvdS.Crypto/PqKeys/
macOS ~/Library/Application Support/WvdS.Crypto/PqKeys/

Varnostni nasveti

  • PQ-ključi so dostopni samo trenutnemu uporabniku
  • Ustvarite varnostno kopijo pred migracijo sistema
  • Redno izvajajte CleanupOrphanedKeys()
  • Medplatformno šifriranje je manj varno kot DPAPI

Glej tudi


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

Zuletzt geändert: dne 30.01.2026 ob 01:31