Shadowsocks dokumentasie
navigasie
VOORAF
VOORAF staan vir Authenticated Encryption with Associated Data. AEAD-syfers verskaf terselfdertyd vertroulikheid, integriteit en egtheid. Hulle het uitstekende werkverrigting en kragdoeltreffendheid op moderne hardeware. Gebruikers moet AEAD-syfers gebruik waar moontlik.
Die volgende AEAD-syfers word aanbeveel. Voldoende Shadowsocks-implementerings moet AEAD_CHACHA20_POLY1305 ondersteun. Implementerings vir toestelle met hardeware AES-versnelling moet ook AEAD_AES_128_GCM en AEAD_AES_256_GCM implementeer.
Naam | alias | Sleutelgrootte | Sout Grootte | Nie-grootte | Merk grootte |
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 |
Verwys asseblief na IANA AEAD-register vir naamskema en spesifikasie.
Sleutel afleiding
Die hoofsleutel kan direk vanaf die gebruiker ingevoer word of vanaf 'n wagwoord gegenereer word.
HKDF_SHA1 is 'n funksie wat 'n geheime sleutel, 'n nie-geheime sout, 'n inligtingstring neem, en 'n subsleutel produseer wat kriptografies sterk is, selfs al is die insette geheime sleutel swak.
HKDF_SHA1(sleutel, sout, info) => subsleutel
Die inligtingstring bind die gegenereerde subsleutel aan 'n spesifieke toepassingskonteks. In ons geval moet dit die string “ss-subkey” sonder aanhalingstekens wees.
Ons lei 'n per-sessie subsleutel af van 'n vooraf-gedeelde hoofsleutel met behulp van HKDF_SHA1. Sout moet uniek wees deur die hele lewe van die voorafgedeelde hoofsleutel.
Geverifieerde enkripsie/dekripsie
AE_encrypt is 'n funksie wat 'n geheime sleutel, 'n nie-geheime nonce, 'n boodskap neem en syferteks en 'n verifikasiemerker produseer. Nonce moet uniek wees vir 'n gegewe sleutel in elke aanroep.
AE_encrypt(sleutel, nonce, boodskap) => (syferteks, merker)
AE_decrypt is 'n funksie wat 'n geheime sleutel, nie-geheime nonce, syferteks, 'n verifikasiemerker neem en 'n oorspronklike boodskap produseer. As daar met enige van die invoer gepeuter word, sal die dekripsie misluk.
AE_decrypt(sleutel, nonce, ciphertext, tag) => boodskap
TCP
'n AEAD-geënkripteerde TCP-stroom begin met 'n lukraak gegenereerde sout om die per-sessie subsleutel af te lei, gevolg deur enige aantal geënkripteerde stukke. Elke stuk het die volgende struktuur:
[geënkripteerde loonvraglengte][lengtemerker][geïnkripteer loonvrag][loonvragmerker]
Loonvraglengte is 'n 2-grepe groot-endian ongetekende heelgetal wat beperk is tot 0x3FFF. Die hoër twee bisse is gereserveer en moet op nul gestel word. Loonvrag is dus beperk tot 16*1024 – 1 grepe.
Die eerste AEAD-enkripteer/dekripteer-bewerking gebruik 'n tel-nonce wat vanaf 0 begin. Na elke enkripteer/dekripteer-bewerking word die nonce met een verhoog asof dit 'n ongetekende klein-endian heelgetal is. Let daarop dat elke TCP-stuk twee AEAD-enkripteer/dekripteer-bewerkings behels: een vir die loonvraglengte en een vir die loonvrag. Daarom verhoog elke stukkie die nonce twee keer.
TCP
'n AEAD-geënkripteerde TCP-stroom begin met 'n lukraak gegenereerde sout om die per-sessie subsleutel af te lei, gevolg deur enige aantal geënkripteerde stukke. Elke stuk het die volgende struktuur:
[geënkripteerde loonvraglengte][lengtemerker][geïnkripteer loonvrag][loonvragmerker]
Loonvraglengte is 'n 2-grepe groot-endian ongetekende heelgetal wat beperk is tot 0x3FFF. Die hoër twee bisse is gereserveer en moet op nul gestel word. Loonvrag is dus beperk tot 16*1024 – 1 grepe.
Die eerste AEAD-enkripteer/dekripteer-bewerking gebruik 'n tel-nonce wat vanaf 0 begin. Na elke enkripteer/dekripteer-bewerking word die nonce met een verhoog asof dit 'n ongetekende klein-endian heelgetal is. Let daarop dat elke TCP-stuk twee AEAD-enkripteer/dekripteer-bewerkings behels: een vir die loonvraglengte en een vir die loonvrag. Daarom verhoog elke stukkie die nonce twee keer.