Shadowsocks-documentatie
Navigatie
AED
AED staat voor Authenticated Encryption with Associated Data. AEAD-cijfers bieden tegelijkertijd vertrouwelijkheid, integriteit en authenticiteit. Ze hebben uitstekende prestaties en energie-efficiëntie op moderne hardware. Gebruikers moeten waar mogelijk AEAD-cijfers gebruiken.
De volgende AEAD-cijfers worden aanbevolen. Conforme Shadowsocks-implementaties moeten AEAD_CHACHA20_POLY1305 ondersteunen. Implementaties voor apparaten met hardwarematige AES-versnelling moeten ook AEAD_AES_128_GCM en AEAD_AES_256_GCM implementeren.
Naam | Alias | Sleutelgrootte | Zout grootte | Geen enkele maat | Tag Size |
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 |
Raadpleeg IANA AEAD-register voor naamgevingsschema en specificatie.
Sleutelafleiding
De hoofdsleutel kan rechtstreeks door de gebruiker worden ingevoerd of op basis van een wachtwoord worden gegenereerd.
HKDF_SHA1 is een functie die een geheime sleutel, een niet-geheime salt, een inforeeks neemt en een subsleutel produceert die cryptografisch sterk is, zelfs als de ingevoerde geheime sleutel zwak is.
HKDF_SHA1(sleutel, zout, info) => subsleutel
De infostring bindt de gegenereerde subsleutel aan een specifieke toepassingscontext. In ons geval moet het de string "ss-subkey" zijn zonder aanhalingstekens.
We leiden een subsleutel per sessie af van een vooraf gedeelde hoofdsleutel met behulp van HKDF_SHA1. Zout moet gedurende de hele levensduur van de vooraf gedeelde hoofdsleutel uniek zijn.
Geverifieerde codering/decodering
AE_encrypt is een functie die een geheime sleutel, een niet-geheime nonce, een bericht neemt en cijfertekst en een authenticatietag produceert. Nonce moet bij elke aanroep uniek zijn voor een bepaalde sleutel.
AE_encrypt(sleutel, nonce, bericht) => (cijfertekst, tag)
AE_decrypt is een functie die een geheime sleutel, niet-geheime nonce, cijfertekst, een authenticatietag gebruikt en een origineel bericht produceert. Als er met een van de invoer is geknoeid, mislukt de decodering.
AE_decrypt(sleutel, nonce, cijfertekst, tag) => bericht
TCP
Een met AEAD versleutelde TCP-stream begint met een willekeurig gegenereerde salt om de subsleutel per sessie af te leiden, gevolgd door een willekeurig aantal versleutelde chunks. Elke brok heeft de volgende structuur:
[gecodeerde payload-lengte][lengte-tag][gecodeerde payload][payload-tag]
De lengte van de payload is een 2-byte big-endian geheel getal zonder teken met een maximum van 0x3FFF. De twee hoogste bits zijn gereserveerd en moeten op nul worden gezet. Payload is daarom beperkt tot 16*1024 – 1 bytes.
De eerste AEAD-versleutelings-/ontsleutelingsbewerking gebruikt een tellende nonce die begint bij 0. Na elke versleutelings-/ontsleutelingsbewerking wordt de nonce met één opgehoogd alsof het een niet-ondertekend little-endian geheel getal is. Merk op dat elk TCP-chunk twee AEAD-versleutelings-/ontsleutelingsbewerkingen omvat: één voor de lengte van de payload en één voor de payload. Daarom verhoogt elk stuk de nonce twee keer.
TCP
Een met AEAD versleutelde TCP-stream begint met een willekeurig gegenereerde salt om de subsleutel per sessie af te leiden, gevolgd door een willekeurig aantal versleutelde chunks. Elke brok heeft de volgende structuur:
[gecodeerde payload-lengte][lengte-tag][gecodeerde payload][payload-tag]
De lengte van de payload is een 2-byte big-endian geheel getal zonder teken met een maximum van 0x3FFF. De twee hoogste bits zijn gereserveerd en moeten op nul worden gezet. Payload is daarom beperkt tot 16*1024 – 1 bytes.
De eerste AEAD-versleutelings-/ontsleutelingsbewerking gebruikt een tellende nonce die begint bij 0. Na elke versleutelings-/ontsleutelingsbewerking wordt de nonce met één opgehoogd alsof het een niet-ondertekend little-endian geheel getal is. Merk op dat elk TCP-chunk twee AEAD-versleutelings-/ontsleutelingsbewerkingen omvat: één voor de lengte van de payload en één voor de payload. Daarom verhoogt elk stuk de nonce twee keer.