Shadowsocks dokumentation

FREM

FREM står for Authenticated Encryption with Associated Data. AEAD-cifre giver samtidig fortrolighed, integritet og autenticitet. De har fremragende ydeevne og strømeffektivitet på moderne hardware. Brugere bør bruge AEAD-cifre, når det er muligt.

Følgende AEAD-cifre anbefales. Kompatible Shadowsocks-implementeringer skal understøtte AEAD_CHACHA20_POLY1305. Implementeringer til enheder med hardware-AES-acceleration bør også implementere AEAD_AES_128_GCM og AEAD_AES_256_GCM.

 

 

 

Navn

Alias

Nøglestørrelse

Salt størrelse

Ikke størrelse

Tagstørrelse

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

Vær sød at henvise til IANA AEAD register til navneskema og specifikation.

Nøgleafledning

Hovednøglen kan indtastes direkte fra brugeren eller genereres fra en adgangskode.

HKDF_SHA1 er en funktion, der tager en hemmelig nøgle, et ikke-hemmeligt salt, en infostreng og producerer en undernøgle, der er kryptografisk stærk, selvom den hemmelige inputnøgle er svag.

HKDF_SHA1(nøgle, salt, info) => undernøgle

Infostrengen binder den genererede undernøgle til en specifik applikationskontekst. I vores tilfælde skal det være strengen "ss-subkey" uden anførselstegn.

Vi udleder en per-session undernøgle fra en foruddelt hovednøgle ved hjælp af HKDF_SHA1. Salt skal være unikt gennem hele den foruddelte hovednøgles levetid.

Autentificeret kryptering/dekryptering

AE_encrypt er en funktion, der tager en hemmelig nøgle, en ikke-hemmelig nonce, en besked og producerer chiffertekst og et autentificeringsmærke. Nonce skal være unik for en given nøgle i hver påkaldelse.

AE_encrypt(key, nonce, message) => (chiffertekst, tag)

 

AE_decrypt er en funktion, der tager en hemmelig nøgle, ikke-hemmelig nonce, chiffertekst, et autentificeringsmærke og producerer en original besked. Hvis der manipuleres med noget af inputtet, vil dekrypteringen mislykkes.

AE_decrypt(nøgle, nonce, chiffertekst, tag) => besked

TCP

En AEAD-krypteret TCP-stream starter med et tilfældigt genereret salt for at udlede per-session-undernøglen, efterfulgt af et vilkårligt antal krypterede bidder. Hver chunk har følgende struktur:

[krypteret nyttelastlængde][længdetag][krypteret nyttelast][nyttelasttag]

 

Nyttelastlængden er et 2-byte big-endian usigneret heltal med et loft på 0x3FFF. De højeste to bit er reserveret og skal sættes til nul. Nyttelast er derfor begrænset til 16*1024 – 1 bytes.

Den første AEAD kryptering/dekryptering operation bruger en tælle nonce startende fra 0. Efter hver kryptering/dekryptering operation øges nonce med én, som om det var et usigneret lille endian heltal. Bemærk, at hver TCP-chunk involverer to AEAD-krypterings-/dekrypteringsoperationer: en for nyttelastlængden og en for nyttelasten. Derfor øger hver del nonce to gange.

TCP

En AEAD-krypteret TCP-stream starter med et tilfældigt genereret salt for at udlede per-session-undernøglen, efterfulgt af et vilkårligt antal krypterede bidder. Hver chunk har følgende struktur:

[krypteret nyttelastlængde][længdetag][krypteret nyttelast][nyttelasttag]

 

Nyttelastlængden er et 2-byte big-endian usigneret heltal med et loft på 0x3FFF. De højeste to bit er reserveret og skal sættes til nul. Nyttelast er derfor begrænset til 16*1024 – 1 bytes.

Den første AEAD kryptering/dekryptering operation bruger en tælle nonce startende fra 0. Efter hver kryptering/dekryptering operation øges nonce med én, som om det var et usigneret lille endian heltal. Bemærk, at hver TCP-chunk involverer to AEAD-krypterings-/dekrypteringsoperationer: en for nyttelastlængden og en for nyttelasten. Derfor øger hver del nonce to gange.

Start din 5-dages gratis prøveperiode