Shadowsocks dokumentation
Navigering
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.