Documentație Shadowsocks
Navigare
AEAD
AEAD reprezintă Authenticated Encryption cu date asociate. Cifrurile AEAD oferă simultan confidențialitate, integritate și autenticitate. Au performanțe excelente și eficiență energetică pe hardware-ul modern. Utilizatorii ar trebui să utilizeze cifrurile AEAD ori de câte ori este posibil.
Sunt recomandate următoarele cifruri AEAD. Implementările Shadowsocks compatibile trebuie să accepte AEAD_CHACHA20_POLY1305. Implementările pentru dispozitivele cu accelerare AES hardware ar trebui să implementeze și AEAD_AES_128_GCM și AEAD_AES_256_GCM.
Nume si Prenume | Alias | Dimensiunea cheii | Dimensiunea sării | Nonce Size | Dimensiunea etichetei |
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 |
Va rog, referiti-va la Registrul IANA AEAD pentru schema de denumire și specificație.
Derivarea cheii
Cheia principală poate fi introdusă direct de la utilizator sau generată dintr-o parolă.
HKDF_SHA1 este o funcție care preia o cheie secretă, o sare non-secretă, un șir de informații și produce o subcheie care este criptografic puternică, chiar dacă cheia secretă de intrare este slabă.
HKDF_SHA1(cheie, sare, informații) => subcheie
Șirul de informații leagă subcheia generată la un context de aplicație specific. În cazul nostru, trebuie să fie șirul „ss-subkey” fără ghilimele.
Obținem o subcheie per sesiune dintr-o cheie principală pre-partajată folosind HKDF_SHA1. Sarea trebuie să fie unică pe toată durata de viață a cheii principale pre-partajate.
Criptare/Decriptare autentificată
AE_encrypt este o funcție care preia o cheie secretă, un nonce non-secret, un mesaj și produce text cifrat și o etichetă de autentificare. Nonce trebuie să fie unic pentru o anumită cheie în fiecare invocare.
AE_encrypt(cheie, nonce, mesaj) => (text cifrat, etichetă)
AE_decrypt este o funcție care preia o cheie secretă, nonce non-secret, text cifrat, o etichetă de autentificare și produce un mesaj original. Dacă oricare dintre intrări este modificată, decriptarea va eșua.
AE_decrypt(key, nonce, ciphertext, tag) => mesaj
TCP
Un flux TCP criptat AEAD începe cu o sare generată aleatoriu pentru a obține subcheia per sesiune, urmată de orice număr de bucăți criptate. Fiecare bucată are următoarea structură:
[lungimea încărcăturii criptate][etichetă de lungime][sarcină criptată][etichetă de încărcare]
Lungimea sarcinii utile este un număr întreg nesemnat big-endian de 2 octeți, limitat la 0x3FFF. Cei doi biți mai mari sunt rezervați și trebuie setați la zero. Sarcina utilă este, prin urmare, limitată la 16*1024 – 1 octet.
Prima operație de criptare/decriptare AEAD folosește un nonce de numărare începând de la 0. După fiecare operație de criptare/decriptare, nonce este incrementat cu unu, ca și cum ar fi un număr întreg little-endian nesemnat. Rețineți că fiecare fragment TCP implică două operațiuni de criptare/decriptare AEAD: una pentru lungimea încărcăturii utile și una pentru încărcarea utilă. Prin urmare, fiecare bucată crește nonce de două ori.
TCP
Un flux TCP criptat AEAD începe cu o sare generată aleatoriu pentru a obține subcheia per sesiune, urmată de orice număr de bucăți criptate. Fiecare bucată are următoarea structură:
[lungimea încărcăturii criptate][etichetă de lungime][sarcină criptată][etichetă de încărcare]
Lungimea sarcinii utile este un număr întreg nesemnat big-endian de 2 octeți, limitat la 0x3FFF. Cei doi biți mai mari sunt rezervați și trebuie setați la zero. Sarcina utilă este, prin urmare, limitată la 16*1024 – 1 octet.
Prima operație de criptare/decriptare AEAD folosește un nonce de numărare începând de la 0. După fiecare operație de criptare/decriptare, nonce este incrementat cu unu, ca și cum ar fi un număr întreg little-endian nesemnat. Rețineți că fiecare fragment TCP implică două operațiuni de criptare/decriptare AEAD: una pentru lungimea încărcăturii utile și una pentru încărcarea utilă. Prin urmare, fiecare bucată crește nonce de două ori.