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.
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).
| 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 |
| 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 |
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)}");
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"); } }
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}"); }
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);
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");
DataProtectionScope.CurrentUser - Samo trenutni uporabnik lahko dešifrira ključe - Ključi so vezani na uporabniški profil
Key = SHA256(MachineName + UserName) IV = naključno generiran - Ključi so vezani na stroj + uporabnika - Manj varno kot DPAPI
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);
// 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"); }
| Operacijski sistem | Pot |
|---|---|
| Windows | %LOCALAPPDATA%\WvdS.Crypto\PqKeys\ |
| Linux | ~/.local/share/WvdS.Crypto/PqKeys/ |
| macOS | ~/Library/Application Support/WvdS.Crypto/PqKeys/ |
CleanupOrphanedKeys()Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional