Shadowsocksin dokumentaatio
suunnistus
AEAD
AEAD tarkoittaa Authenticated Encryption with Associated Data. AEAD-salaukset tarjoavat samanaikaisesti luottamuksellisuuden, eheyden ja aitouden. Niillä on erinomainen suorituskyky ja tehokkuus nykyaikaisissa laitteissa. Käyttäjien tulee käyttää AEAD-salauksia aina kun mahdollista.
Seuraavat AEAD-salaukset ovat suositeltavia. Yhteensopivien Shadowsocks-toteutusten on tuettava AEAD_CHACHA20_POLY1305:tä. Toteutuksissa laitteille, joissa on laitteisto-AES-kiihdytys, tulisi ottaa käyttöön myös AEAD_AES_128_GCM ja AEAD_AES_256_GCM.
Nimi | alias | Avaimen koko | Suolan koko | Nonce koko | Tag-koko |
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 |
Katso IANA AEAD rekisteri nimeämistä ja määrittelyä varten.
Avaimen johtaminen
Pääavain voidaan syöttää suoraan käyttäjältä tai generoida salasanasta.
HKDF_SHA1 on funktio, joka ottaa salaisen avaimen, ei-salaisen suolan, tietomerkkijonon ja tuottaa aliavaimen, joka on kryptografisesti vahva, vaikka syötettävä salainen avain olisi heikko.
HKDF_SHA1(avain, suola, tiedot) => aliavain
Tietomerkkijono sitoo luodun aliavaimen tiettyyn sovelluskontekstiin. Meidän tapauksessamme sen on oltava merkkijono "ss-subkey" ilman lainausmerkkejä.
Johdamme istuntokohtaisen aliavaimen ennalta jaetusta pääavaimesta HKDF_SHA1:n avulla. Suolan on oltava ainutlaatuinen esijaetun pääavaimen koko käyttöiän ajan.
Todennettu salaus/salauksen purku
AE_encrypt on toiminto, joka ottaa salaisen avaimen, ei-salaisen noncen, viestin ja tuottaa salatekstin ja todennustunnisteen. Noncen on oltava yksilöllinen annetulle avaimelle kussakin kutsussa.
AE_encrypt(avain, nonce, message) => (salateksti, tunniste)
AE_decrypt on toiminto, joka ottaa salaisen avaimen, ei-salaisen noncen, salatekstin, todennustunnisteen ja tuottaa alkuperäisen viestin. Jos jotain syötteistä on peukaloitu, salauksen purku epäonnistuu.
AE_decrypt(avain, nonce, salateksti, tunniste) => viesti
TCP
AEAD-salattu TCP-virta alkaa satunnaisesti luodulla suolalla, joka johtaa istuntokohtaisen aliavaimen, jota seuraa mikä tahansa määrä salattuja paloja. Jokaisella palalla on seuraava rakenne:
[salatun hyötykuorman pituus][pituustunniste][salattu hyötykuorma][hyötykuorman tunniste]
Hyötykuorman pituus on 2-tavuinen etumerkitön kokonaisluku, jonka yläraja on 0x3FFF. Kaksi korkeampaa bittiä on varattu ja ne on asetettava nollaan. Hyötykuorma on siksi rajoitettu arvoon 16*1024 – 1 tavu.
Ensimmäinen AEAD-salaus/salauksenpurku-operaatio käyttää laskenta-noncea, joka alkaa nollasta. Jokaisen salaus-/salauksenpurkuoperaation jälkeen nonce-arvoa kasvatetaan yhdellä ikään kuin se olisi etumerkitön pieni-endian kokonaisluku. Huomaa, että jokainen TCP-osa sisältää kaksi AEAD-salaus-/salauksenpurkutoimintoa: yksi hyötykuorman pituudelle ja toinen hyötykuormalle. Siksi jokainen pala lisää nonce-arvoa kahdesti.
TCP
AEAD-salattu TCP-virta alkaa satunnaisesti luodulla suolalla, joka johtaa istuntokohtaisen aliavaimen, jota seuraa mikä tahansa määrä salattuja paloja. Jokaisella palalla on seuraava rakenne:
[salatun hyötykuorman pituus][pituustunniste][salattu hyötykuorma][hyötykuorman tunniste]
Hyötykuorman pituus on 2-tavuinen etumerkitön kokonaisluku, jonka yläraja on 0x3FFF. Kaksi korkeampaa bittiä on varattu ja ne on asetettava nollaan. Hyötykuorma on siksi rajoitettu arvoon 16*1024 – 1 tavu.
Ensimmäinen AEAD-salaus/salauksenpurku-operaatio käyttää laskenta-noncea, joka alkaa nollasta. Jokaisen salaus-/salauksenpurkuoperaation jälkeen nonce-arvoa kasvatetaan yhdellä ikään kuin se olisi etumerkitön pieni-endian kokonaisluku. Huomaa, että jokainen TCP-osa sisältää kaksi AEAD-salaus-/salauksenpurkutoimintoa: yksi hyötykuorman pituudelle ja toinen hyötykuormalle. Siksi jokainen pala lisää nonce-arvoa kahdesti.