Color scheme: Light
You are here: start » sl » Dokumentacija » Postkvantna kriptografija » WvdS Crypto Service – pregled » Navodila » Klicanje storitve v sistemu Windows

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()

Sorodne teme

sl/wiki/pqcrypt/svc/how-to/call-windows-service.txt · Last modified: by Wolfgang van der Stille