Dokumentacija Shadowsocks
ostalo
AEAD
AEAD pomeni overjeno šifriranje s povezanimi podatki. Šifre AEAD hkrati zagotavljajo zaupnost, celovitost in pristnost. Imajo odlično zmogljivost in energetsko učinkovitost na sodobni strojni opremi. Uporabniki naj uporabljajo šifre AEAD, kadar koli je to mogoče.
Priporočene so naslednje šifre AEAD. Skladne implementacije Shadowsocks morajo podpirati AEAD_CHACHA20_POLY1305. Izvedbe za naprave s strojnim pospeševanjem AES bi morale izvajati tudi AEAD_AES_128_GCM in AEAD_AES_256_GCM.
Ime | Alias | Velikost ključa | Velikost soli | Nonce Velikost | Velikost oznake |
AEAD_CHACHA20_POLY1305 | chacha20-ietf-poly1305 | 32 | 32 | 12 | 16 |
AEAD_AES_256_GCM | aes-256-gcm | 32 | 32 | 12 | 16 |
AEAD_AES_128_GCM | aes-128-gcm | 16 | 16 | 12 | 16 |
Prosimo, glejte register IANA AEAD za shemo poimenovanja in specifikacijo.
Izpeljava ključa
Glavni ključ lahko vnesete neposredno od uporabnika ali ustvarite iz gesla.
HKDF_SHA1 je funkcija, ki vzame skrivni ključ, nesekretno sol, informacijski niz in ustvari podključ, ki je kriptografsko močan, tudi če je vhodni skrivni ključ šibek.
HKDF_SHA1(ključ, sol, informacije) => podključ
Informacijski niz poveže ustvarjeni podključ z določenim kontekstom aplikacije. V našem primeru mora biti to niz "ss-subkey" brez narekovajev.
Podključ za sejo izpeljemo iz vnaprej deljenega glavnega ključa z uporabo HKDF_SHA1. Sol mora biti edinstven skozi celotno življenjsko dobo glavnega ključa v vnaprejšnji skupni rabi.
Preverjeno šifriranje/dešifriranje
AE_encrypt je funkcija, ki sprejme skrivni ključ, non-secret, sporočilo ter ustvari šifrirano besedilo in oznako za preverjanje pristnosti. Nonce mora biti edinstven za dani ključ pri vsakem klicu.
AE_encrypt(ključ, nonce, sporočilo) => (šifrirano besedilo, oznaka)
AE_decrypt je funkcija, ki vzame skrivni ključ, non-secret nonce, šifrirano besedilo, oznako za preverjanje pristnosti in ustvari izvirno sporočilo. Če je kateri od vnosov spremenjen, dešifriranje ne bo uspelo.
AE_decrypt(key, nonce, ciphertext, tag) => sporočilo
TCP
Tok TCP, šifriran z AEAD, se začne z naključno generirano soljo za izpeljavo podključa za sejo, ki mu sledi poljubno število šifriranih kosov. Vsak kos ima naslednjo strukturo:
[šifrirana dolžina tovora][oznaka dolžine][šifrirana tovora][oznaka tovora]
Dolžina koristnega tovora je 2-bajtno nepredznačeno celo število z velikim endianom, omejeno na 0x3FFF. Višja dva bita sta rezervirana in ju je treba nastaviti na nič. Obremenitev je zato omejena na 16*1024 – 1 bajt.
Prva operacija šifriranja/dešifriranja AEAD uporablja štetje nonce, ki se začne od 0. Po vsaki operaciji šifriranja/dešifriranja se nonce poveča za ena, kot da bi šlo za nepredznačeno celo število z redkim začetkom. Upoštevajte, da vsak kos TCP vključuje dve operaciji šifriranja/dešifriranja AEAD: eno za dolžino tovora in eno za tovor. Zato vsak kos dvakrat poveča enkratno vrednost.
TCP
Tok TCP, šifriran z AEAD, se začne z naključno generirano soljo za izpeljavo podključa za sejo, ki mu sledi poljubno število šifriranih kosov. Vsak kos ima naslednjo strukturo:
[šifrirana dolžina tovora][oznaka dolžine][šifrirana tovora][oznaka tovora]
Dolžina koristnega tovora je 2-bajtno nepredznačeno celo število z velikim endianom, omejeno na 0x3FFF. Višja dva bita sta rezervirana in ju je treba nastaviti na nič. Obremenitev je zato omejena na 16*1024 – 1 bajt.
Prva operacija šifriranja/dešifriranja AEAD uporablja štetje nonce, ki se začne od 0. Po vsaki operaciji šifriranja/dešifriranja se nonce poveča za ena, kot da bi šlo za nepredznačeno celo število z redkim začetkom. Upoštevajte, da vsak kos TCP vključuje dve operaciji šifriranja/dešifriranja AEAD: eno za dolžino tovora in eno za tovor. Zato vsak kos dvakrat poveča enkratno vrednost.