Documentazione di Shadowsocks
navigazzioni
AEAD
AEAD sta per Criptazione Autentificata cù Dati Associati. I cifri AEAD furnisce simultaneamente cunfidenziale, integrità è autenticità. Hanu un rendimentu eccellente è efficienza energetica nantu à hardware mudernu. L'utilizatori anu da utilizà i cifri AEAD sempre chì hè pussibule.
I seguenti cifri AEAD sò cunsigliati. L'implementazioni Shadowsocks conformi devenu supportà AEAD_CHACHA20_POLY1305. L'implementazioni per i dispositi cù l'accelerazione AES hardware anu ancu implementà AEAD_AES_128_GCM è AEAD_AES_256_GCM.
nomu | Alias | Size Key | Salt Size | Nonce Size | 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 |
Remplittate Registru IANA AEAD per u schema di nome è specificazione.
Derivazione chjave
A chjave maestra pò esse inserita direttamente da l'utilizatore o generata da una password.
HKDF_SHA1 hè una funzione chì piglia una chjave sicreta, un sali micca sicretu, una stringa d'infurmazioni, è pruduce una subkey chì hè criptograficamente forte ancu s'è a chjave secreta di input hè debule.
HKDF_SHA1(key, sale, info) => subkey
A stringa d'infurmazione unisce a subkey generata à un cuntestu specificu di l'applicazione. In u nostru casu, deve esse a stringa "ss-subkey" senza virgulette.
Derivemu una subkey per sessione da una chjave maestra pre-spartita utilizendu HKDF_SHA1. Salt deve esse unicu per tutta a vita di a chjave maestra pre-spartita.
Criptazione / Decrittografia autenticata
AE_encrypt hè una funzione chì piglia una chjave secreta, una nonce non-secreta, un missaghju, è pruduce ciphertext è un tag d'autentificazione. Nonce deve esse unicu per una chjave data in ogni invucazione.
AE_encrypt(key, nonce, message) => (ciphertext, tag)
AE_decrypt hè una funzione chì piglia una chjave secreta, nonce non-secret, ciphertext, un tag d'autentificazione, è pruduce un missaghju originale. Se qualcunu di l'input hè manipulatu, a decryption falla.
AE_decrypt (key, nonce, ciphertext, tag) => missaghju
TCP
Un flussu TCP criptatu AEAD principia cù un sali generatu aleatoriamente per derivà a subkey per sessione, seguita da qualsiasi quantità di pezzi criptati. Ogni pezzu hà a seguente struttura:
[lunghezza di carica criptata][tag di lunghezza] [tag di carica criptata]
A lunghezza di u payload hè un interu senza signu big-endian di 2 byte limitatu à 0x3FFF. I dui bits più alti sò riservati è deve esse stabilitu à zero. U payload hè dunque limitatu à 16 * 1024 - 1 bytes.
A prima operazione di criptu / decrypt AEAD usa un nonce di cunti chì partenu da 0. Dopu à ogni operazione di criptu / decrypt, u nonce hè incrementatu da unu cum'è s'ellu era un integer little-endian senza signu. Nota chì ogni pezzu TCP implica duie operazioni di criptografia / decriptazione AEAD: una per a durata di a carica utile, è una per a carica utile. Dunque ogni pezzu aumenta u nonce duie volte.
TCP
Un flussu TCP criptatu AEAD principia cù un sali generatu aleatoriamente per derivà a subkey per sessione, seguita da qualsiasi quantità di pezzi criptati. Ogni pezzu hà a seguente struttura:
[lunghezza di carica criptata][tag di lunghezza] [tag di carica criptata]
A lunghezza di u payload hè un interu senza signu big-endian di 2 byte limitatu à 0x3FFF. I dui bits più alti sò riservati è deve esse stabilitu à zero. U payload hè dunque limitatu à 16 * 1024 - 1 bytes.
A prima operazione di criptu / decrypt AEAD usa un nonce di cunti chì partenu da 0. Dopu à ogni operazione di criptu / decrypt, u nonce hè incrementatu da unu cum'è s'ellu era un integer little-endian senza signu. Nota chì ogni pezzu TCP implica duie operazioni di criptografia / decriptazione AEAD: una per a durata di a carica utile, è una per a carica utile. Dunque ogni pezzu aumenta u nonce duie volte.