Shadowsocks dokumentacija
navigacija
AEAD
AEAD označava Authenticated Encryption with Associated Data. AEAD šifre istovremeno pružaju povjerljivost, integritet i autentičnost. Imaju izvrsne performanse i energetsku učinkovitost na modernom hardveru. Korisnici bi trebali koristiti AEAD šifre kad god je to moguće.
Preporučuju se sljedeće AEAD šifre. Sukladne Shadowsocks implementacije moraju podržavati AEAD_CHACHA20_POLY1305. Implementacije za uređaje s hardverskim AES ubrzanjem također bi trebale implementirati AEAD_AES_128_GCM i AEAD_AES_256_GCM.
Ime i Prezime | Pseudonim | Veličina ključa | Veličina soli | Jednokratna veličina | Veličina 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 |
Molimo pogledajte IANA AEAD registar za shemu imenovanja i specifikaciju.
Izvođenje ključa
Glavni ključ može unijeti izravno korisnik ili generirati iz lozinke.
HKDF_SHA1 je funkcija koja uzima tajni ključ, ne-tajnu sol, info string i proizvodi potključ koji je kriptografski jak čak i ako je ulazni tajni ključ slab.
HKDF_SHA1(ključ, sol, info) => potključ
Informacijski niz povezuje generirani potključ s određenim kontekstom aplikacije. U našem slučaju, to mora biti niz "ss-subkey" bez navodnika.
Izvodimo potključ po sesiji iz unaprijed podijeljenog glavnog ključa pomoću HKDF_SHA1. Sol mora biti jedinstven tijekom cijelog vijeka trajanja unaprijed dijeljenog glavnog ključa.
Autentificirano šifriranje/dešifriranje
AE_encrypt je funkcija koja uzima tajni ključ, non-secret, poruku i proizvodi šifrirani tekst i oznaku za provjeru autentičnosti. Jednokratni ključ mora biti jedinstven za dati ključ u svakom pozivanju.
AE_encrypt(key, nonce, message) => (šifrirani tekst, oznaka)
AE_decrypt je funkcija koja uzima tajni ključ, non-secret nonce, šifrirani tekst, oznaku za provjeru autentičnosti i proizvodi izvornu poruku. Ako se bilo koji dio unosa neovlašteno mijenja, dešifriranje neće uspjeti.
AE_decrypt(key, nonce, ciphertext, tag) => poruka
TCP
AEAD kriptirani TCP tok započinje nasumično generiranom soli za izvođenje potključa po sesiji, nakon čega slijedi bilo koji broj šifriranih dijelova. Svaki komad ima sljedeću strukturu:
[šifrirana duljina korisnog sadržaja][oznaka duljine][šifrirani korisni sadržaj][oznaka korisnog sadržaja]
Duljina korisnih podataka je 2-bajtni veliki-endian cijeli broj bez predznaka ograničen na 0x3FFF. Viša dva bita su rezervirana i moraju biti postavljena na nulu. Korisni teret je stoga ograničen na 16*1024 – 1 bajt.
Prva operacija šifriranja/dešifriranja AEAD-a koristi brojanje nonce počevši od 0. Nakon svake operacije šifriranja/dešifriranja, nonce se povećava za jedan kao da je nepredznačeni mali-endian cijeli broj. Imajte na umu da svaki TCP blok uključuje dvije operacije šifriranja/dešifriranja AEAD-a: jednu za duljinu korisnog sadržaja i jednu za korisni sadržaj. Stoga svaki dio povećava nonce dva puta.
TCP
AEAD kriptirani TCP tok započinje nasumično generiranom soli za izvođenje potključa po sesiji, nakon čega slijedi bilo koji broj šifriranih dijelova. Svaki komad ima sljedeću strukturu:
[šifrirana duljina korisnog sadržaja][oznaka duljine][šifrirani korisni sadržaj][oznaka korisnog sadržaja]
Duljina korisnih podataka je 2-bajtni veliki-endian cijeli broj bez predznaka ograničen na 0x3FFF. Viša dva bita su rezervirana i moraju biti postavljena na nulu. Korisni teret je stoga ograničen na 16*1024 – 1 bajt.
Prva operacija šifriranja/dešifriranja AEAD-a koristi brojanje nonce počevši od 0. Nakon svake operacije šifriranja/dešifriranja, nonce se povećava za jedan kao da je nepredznačeni mali-endian cijeli broj. Imajte na umu da svaki TCP blok uključuje dvije operacije šifriranja/dešifriranja AEAD-a: jednu za duljinu korisnog sadržaja i jednu za korisni sadržaj. Stoga svaki dio povećava nonce dva puta.