Shadowsocks dokumentacija
Navigacija
AEAD
AEAD reiškia autentifikuotą šifravimą su susijusiais duomenimis. AEAD šifrai vienu metu užtikrina konfidencialumą, vientisumą ir autentiškumą. Jie pasižymi puikiu našumu ir energijos vartojimo efektyvumu šiuolaikinėje aparatinėje įrangoje. Jei įmanoma, vartotojai turėtų naudoti AEAD šifrus.
Rekomenduojami šie AEAD šifrai. Suderinami „Shadowsocks“ diegimai turi palaikyti AEAD_CHACHA20_POLY1305. Įrenginiams su aparatūros AES spartinimu taip pat turėtų būti įdiegta AEAD_AES_128_GCM ir AEAD_AES_256_GCM.
Vardas | Pravardė | Rakto dydis | Druskos dydis | Nonce dydis | Žymos dydis |
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 |
Prašome kreiptis į IANA AEAD registras pavadinimų schemai ir specifikacijai.
Raktų išvedimas
Pagrindinis raktas gali būti įvestas tiesiai iš vartotojo arba sugeneruotas iš slaptažodžio.
HKDF_SHA1 yra funkcija, kuri paima slaptą raktą, neslaptąją druską, informacijos eilutę ir sukuria kriptografiškai stiprų dalinį raktą, net jei įvesties slaptasis raktas yra silpnas.
HKDF_SHA1(raktas, druska, informacija) => dalinis raktas
Informacijos eilutė susieja sugeneruotą dalinį raktą su konkrečiu programos kontekstu. Mūsų atveju tai turi būti eilutė „ss-subkey“ be kabučių.
Seanso dalinį raktą gauname iš iš anksto bendrinamo pagrindinio rakto, naudodami HKDF_SHA1. Druska turi būti unikali per visą iš anksto bendrinamo pagrindinio rakto galiojimo laiką.
Autentifikuotas šifravimas / iššifravimas
AE_encrypt yra funkcija, kuri paima slaptą raktą, neslaptąjį nežymėjimą, pranešimą ir sukuria šifruotą tekstą bei autentifikavimo žymą. Nonce turi būti unikalus nurodytam raktui kiekvienoje iškvietime.
AE_encrypt(raktas, nonce, pranešimas) => (šifruotas tekstas, žyma)
AE_decrypt yra funkcija, kuri paima slaptą raktą, neslaptąjį nonce, šifruotą tekstą, autentifikavimo žymą ir sukuria originalų pranešimą. Jei kuri nors įvestis yra sugadinta, iššifravimas nepavyks.
AE_decrypt(raktas, nonce, šifruotas tekstas, žyma) => pranešimas
TCP
AEAD užšifruotas TCP srautas prasideda atsitiktinai sugeneruota druska, kad būtų gautas per seansą dalinis raktas, po kurio seka bet koks užšifruotų dalių skaičius. Kiekvienas gabalas turi tokią struktūrą:
[šifruotas krovinio ilgis][ilgio žyma][šifruotas krovinys][naudingos apkrovos žyma]
Naudingosios apkrovos ilgis yra 2 baitų didžiojo beženklio sveikasis skaičius, kurio viršutinė riba yra 0x3FFF. Du aukštesni bitai yra rezervuoti ir turi būti nustatyti į nulį. Todėl naudingoji apkrova yra ribojama iki 16 * 1024 – 1 baitas.
Pirmojoje AEAD šifravimo / iššifravimo operacijoje naudojamas skaičiavimas nonce, prasidedantis nuo 0. Po kiekvienos šifravimo / iššifravimo operacijos nonce padidinamas vienu, tarsi tai būtų nepasirašytas sveikasis skaičius. Atkreipkite dėmesį, kad kiekvienas TCP gabalas apima dvi AEAD šifravimo / iššifravimo operacijas: vieną naudingosios apkrovos ilgį ir kitą naudingą apkrovą. Todėl kiekvienas gabalas padidina nonce du kartus.
TCP
AEAD užšifruotas TCP srautas prasideda atsitiktinai sugeneruota druska, kad būtų gautas per seansą dalinis raktas, po kurio seka bet koks užšifruotų dalių skaičius. Kiekvienas gabalas turi tokią struktūrą:
[šifruotas krovinio ilgis][ilgio žyma][šifruotas krovinys][naudingos apkrovos žyma]
Naudingosios apkrovos ilgis yra 2 baitų didžiojo beženklio sveikasis skaičius, kurio viršutinė riba yra 0x3FFF. Du aukštesni bitai yra rezervuoti ir turi būti nustatyti į nulį. Todėl naudingoji apkrova yra ribojama iki 16 * 1024 – 1 baitas.
Pirmojoje AEAD šifravimo / iššifravimo operacijoje naudojamas skaičiavimas nonce, prasidedantis nuo 0. Po kiekvienos šifravimo / iššifravimo operacijos nonce padidinamas vienu, tarsi tai būtų nepasirašytas sveikasis skaičius. Atkreipkite dėmesį, kad kiekvienas TCP gabalas apima dvi AEAD šifravimo / iššifravimo operacijas: vieną naudingosios apkrovos ilgį ir kitą naudingą apkrovą. Todėl kiekvienas gabalas padidina nonce du kartus.