Shadowsocks dokumentation

BORT

BORT står för Authenticated Encryption with Associated Data. AEAD-chiffer ger samtidigt konfidentialitet, integritet och autenticitet. De har utmärkt prestanda och energieffektivitet på modern hårdvara. Användare bör använda AEAD-chiffer när det är möjligt.

Följande AEAD-chiffer rekommenderas. Kompatibla Shadowsocks-implementationer måste stödja AEAD_CHACHA20_POLY1305. Implementeringar för enheter med hårdvaru-AES-acceleration bör också implementera AEAD_AES_128_GCM och AEAD_AES_256_GCM.

 

 

 

Namn

Alias

Nyckelstorlek

Saltstorlek

Nonce Storlek

Tagstorlek

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änligen hänvisa till IANA AEAD-registret för namnschema och specifikation.

Nyckelhärledning

Huvudnyckeln kan matas in direkt från användaren eller genereras från ett lösenord.

HKDF_SHA1 är en funktion som tar en hemlig nyckel, ett icke-hemligt salt, en infosträng och producerar en undernyckel som är kryptografiskt stark även om den hemliga inmatningsnyckeln är svag.

HKDF_SHA1(nyckel, salt, info) => undernyckel

Informationssträngen binder den genererade undernyckeln till en specifik applikationskontext. I vårt fall måste det vara strängen "ss-subkey" utan citattecken.

Vi härleder en undernyckel per session från en fördelad huvudnyckel med hjälp av HKDF_SHA1. Salt måste vara unikt under hela livslängden för den fördelade huvudnyckeln.

Autentiserad kryptering/dekryptering

AE_encrypt är en funktion som tar en hemlig nyckel, en icke-hemlig nonce, ett meddelande och producerar chiffertext och en autentiseringstagg. Nonce måste vara unik för en given nyckel i varje anrop.

AE_encrypt(nyckel, nonce, meddelande) => (chiffertext, tagg)

 

AE_decrypt är en funktion som tar en hemlig nyckel, icke-hemlig nonce, chiffertext, en autentiseringstagg och producerar ett originalmeddelande. Om någon av ingångarna manipuleras kommer dekrypteringen att misslyckas.

AE_decrypt(nyckel, nonce, chiffertext, tagg) => meddelande

TCP

En AEAD-krypterad TCP-ström börjar med ett slumpmässigt genererat salt för att härleda undernyckeln per session, följt av valfritt antal krypterade bitar. Varje bit har följande struktur:

[krypterad nyttolastlängd][längdtagg][krypterad nyttolast][nyttolasttagg]

 

Nyttolastlängden är ett 2-byte big-endian osignerat heltal med ett tak på 0x3FFF. De två högre bitarna är reserverade och måste sättas till noll. Nyttolasten är därför begränsad till 16*1024 – 1 byte.

Den första AEAD kryptera/dekryptera operationen använder en räkne nonce som börjar från 0. Efter varje kryptera/dekryptera operation inkrementeras nonce med ett som om det vore ett osignerat heltal. Observera att varje TCP-bit innefattar två AEAD-krypterings-/dekrypteringsoperationer: en för nyttolastens längd och en för nyttolasten. Därför ökar varje bit nonce två gånger.

TCP

En AEAD-krypterad TCP-ström börjar med ett slumpmässigt genererat salt för att härleda undernyckeln per session, följt av valfritt antal krypterade bitar. Varje bit har följande struktur:

[krypterad nyttolastlängd][längdtagg][krypterad nyttolast][nyttolasttagg]

 

Nyttolastlängden är ett 2-byte big-endian osignerat heltal med ett tak på 0x3FFF. De två högre bitarna är reserverade och måste sättas till noll. Nyttolasten är därför begränsad till 16*1024 – 1 byte.

Den första AEAD kryptera/dekryptera operationen använder en räkne nonce som börjar från 0. Efter varje kryptera/dekryptera operation inkrementeras nonce med ett som om det vore ett osignerat heltal. Observera att varje TCP-bit innefattar två AEAD-krypterings-/dekrypteringsoperationer: en för nyttolastens längd och en för nyttolasten. Därför ökar varje bit nonce två gånger.

Starta din 5-dagars gratis provperiod