Klicanje storitve v sistemu Windows
Ta navodila pokažejo, kako program prek imenovane cevi ustvari ključe, podpisuje in preverja, šifrira in dešifrira ter izvede izmenjavo ključev ML-KEM. Primeri so v PowerShellu; enako deluje vsak jezik, ki zna odpreti imenovano cev in pisati JSON.
Pogoj: storitev teče na \\.\pipe\wvds_crypto, kot opisuje Gradnja in testiranje.
Povezava in pomožna funkcija
$pipe = [System.IO.Pipes.NamedPipeClientStream]::new('.', 'wvds_crypto', 'InOut') $pipe.Connect(5000) $utf8 = [System.Text.UTF8Encoding]::new($false) $reader = [System.IO.StreamReader]::new($pipe, $utf8) $writer = [System.IO.StreamWriter]::new($pipe, $utf8) $writer.NewLine = "`n"; $writer.AutoFlush = $true function Invoke-Crypto([hashtable] $request) { $writer.WriteLine(($request | ConvertTo-Json -Compress)) $reader.ReadLine() | ConvertFrom-Json }
Zahteva je ena vrstica, prav tako odgovor. Povezava ostane odprta za nadaljnje zahteve.
Podpisovanje in preverjanje
$key = Invoke-Crypto @{ operation = 'keygen'; request_id = 'k1'; algorithm = 'ML-DSA'; level = 'ML-DSA-65' } $message = [Convert]::ToBase64String($utf8.GetBytes('meritev 42')) $sig = Invoke-Crypto @{ operation = 'ml_dsa_sign'; request_id = 's1'; key_id = $key.key_id; message = $message } $check = Invoke-Crypto @{ operation = 'ml_dsa_verify'; request_id = 'v1'; level = 'ML-DSA-65' public_key = $key.public_key; message = $message; signature = $sig.signature } $check.valid # True
keygen vrne key_id in javni ključ. Javni ključ shranite sami, če morajo podpisi ostati preverljivi
tudi po ponovnem zagonu storitve. Podpis ML-DSA-65 meri 3309 bajtov (signature_size).
Pri ml_dsa_verify vrednotite polje valid. Napačen podpis ni napaka: odgovor ima success: true in
valid: false.
Šifriranje in dešifriranje
$aes = Invoke-Crypto @{ operation = 'keygen'; request_id = 'k2'; algorithm = 'AES-256-GCM' } $enc = Invoke-Crypto @{ operation = 'aes_encrypt'; request_id = 'e1'; key_id = $aes.key_id; plaintext = $message } $dec = Invoke-Crypto @{ operation = 'aes_decrypt'; request_id = 'd1'; key_id = $aes.key_id ciphertext = $enc.ciphertext; nonce = $enc.nonce; tag = $enc.tag } $utf8.GetString([Convert]::FromBase64String($dec.plaintext)) # meritev 42
Enkratno vrednost izbere storitev. ciphertext, nonce in tag shranjujte ali prenašajte skupaj; če
manjka katerikoli od njih, sporočila ni več mogoče dešifrirati. Po izbiri aad na šifrirano besedilo veže
dodatne podatke, ki ostanejo nešifrirani; v tem primeru pri dešifriranju navedite isti aad.
Dogovor o ključu z ML-KEM
Prejemnik ustvari par ključev in posreduje javni ključ:
$kem = Invoke-Crypto @{ operation = 'keygen'; request_id = 'k3'; algorithm = 'ML-KEM-768' }
Pošiljatelj s tem javnim ključem izvede enkapsulacijo in šifrirano besedilo pošlje prejemniku:
$cap = Invoke-Crypto @{ operation = 'ml_kem_encapsulate'; request_id = 'c1'; public_key = $kem.public_key; level = 'ML-KEM-768' }
Prejemnik izvede dekapsulacijo:
$dcp = Invoke-Crypto @{ operation = 'ml_kem_decapsulate'; request_id = 'c2'; key_id = $kem.key_id; ciphertext = $cap.ciphertext } $cap.shared_secret -eq $dcp.shared_secret # True
Obe strani imata nato isto 32-bajtno skrivnost. Storitev zapusti nešifrirana, kot Base64 v odgovoru. Z
hkdf iz nje izpeljite ključ za dejanski namen in jo na strani odjemalca obravnavajte kot ključ. Za
hibridni postopek po BSI TR-02102-1 jo dodatno kombinirajte s klasičnim algoritmom; glejte
Algoritmi in nabori parametrov.
Prepoznavanje napak
$r = Invoke-Crypto @{ operation = 'keygen'; request_id = 'k4'; algorithm = 'ML-KEM'; level = 'ML-KEM-999' } if (-not $r.success) { "$($r.error.code): $($r.error.message)" }
Izpis: UNSUPPORTED_ALGORITHM: Unsupported ML-KEM level: ML-KEM-999
Pri vsakem odgovoru preverite success. Pomen kod opisuje Kode napak.
Zapiranje povezave
$pipe.Dispose()