Shadowsocks-Dokumentation
Navigation
AEAD
AEAD steht für Authenticated Encryption with Associated Data. AEAD-Chiffren bieten gleichzeitig Vertraulichkeit, Integrität und Authentizität. Sie haben eine hervorragende Leistung und Energieeffizienz auf moderner Hardware. Benutzer sollten wann immer möglich AEAD-Chiffren verwenden.
Die folgenden AEAD-Chiffren werden empfohlen. Kompatible Shadowsocks-Implementierungen müssen AEAD_CHACHA20_POLY1305 unterstützen. Implementierungen für Geräte mit Hardware-AES-Beschleunigung sollten auch AEAD_AES_128_GCM und AEAD_AES_256_GCM implementieren.
Name und Vorname | Alias | Schlüsselgröße | Salzgröße | Nonce-Größe | Etikettengröße |
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 |
Bitte beachten Sie IANA AEAD-Register für Namensschema und Spezifikation.
Schlüsselableitung
Der Hauptschlüssel kann direkt vom Benutzer eingegeben oder aus einem Passwort generiert werden.
HKDF_SHA1 ist eine Funktion, die einen geheimen Schlüssel, ein nicht geheimes Salt und eine Info-Zeichenfolge verwendet und einen Unterschlüssel erzeugt, der kryptografisch stark ist, selbst wenn der eingegebene geheime Schlüssel schwach ist.
HKDF_SHA1(Schlüssel, Salt, Info) => Unterschlüssel
Die Infozeichenfolge bindet den generierten Unterschlüssel an einen bestimmten Anwendungskontext. In unserem Fall muss es der String „ss-subkey“ ohne Anführungszeichen sein.
Wir leiten einen Unterschlüssel pro Sitzung von einem vorinstallierten Hauptschlüssel mit HKDF_SHA1 ab. Salt muss während der gesamten Lebensdauer des vorinstallierten Hauptschlüssels eindeutig sein.
Authentifizierte Verschlüsselung/Entschlüsselung
AE_encrypt ist eine Funktion, die einen geheimen Schlüssel, eine nicht geheime Nonce, eine Nachricht nimmt und Chiffretext und ein Authentifizierungs-Tag erzeugt. Nonce muss für einen bestimmten Schlüssel in jedem Aufruf eindeutig sein.
AE_encrypt(Schlüssel, Nonce, Nachricht) => (Chiffretext, Tag)
AE_decrypt ist eine Funktion, die einen geheimen Schlüssel, eine nicht geheime Nonce, Chiffretext und ein Authentifizierungs-Tag nimmt und eine Originalnachricht erzeugt. Wenn eine der Eingaben manipuliert wird, schlägt die Entschlüsselung fehl.
AE_decrypt(Schlüssel, Nonce, Chiffretext, Tag) => Nachricht
TCP
Ein AEAD-verschlüsselter TCP-Stream beginnt mit einem zufällig generierten Salt, um den Unterschlüssel pro Sitzung abzuleiten, gefolgt von einer beliebigen Anzahl verschlüsselter Chunks. Jeder Chunk hat die folgende Struktur:
[Länge der verschlüsselten Nutzlast][Längen-Tag][verschlüsselte Nutzlast][Tag der Nutzlast]
Die Nutzlastlänge ist eine 2-Byte-Big-Endian-Ganzzahl ohne Vorzeichen, die auf 0x3FFF begrenzt ist. Die höheren zwei Bits sind reserviert und müssen auf Null gesetzt werden. Die Nutzlast ist daher auf 16*1024 – 1 Byte begrenzt.
Die erste AEAD-Verschlüsselungs-/Entschlüsselungsoperation verwendet eine zählende Nonce, die bei 0 beginnt. Nach jeder Verschlüsselungs-/Entschlüsselungsoperation wird die Nonce um eins inkrementiert, als ob sie eine vorzeichenlose Little-Endian-Ganzzahl wäre. Beachten Sie, dass jeder TCP-Block zwei AEAD-Verschlüsselungs-/Entschlüsselungsoperationen umfasst: eine für die Länge der Nutzlast und eine für die Nutzlast. Daher erhöht jeder Chunk die Nonce zweimal.
TCP
Ein AEAD-verschlüsselter TCP-Stream beginnt mit einem zufällig generierten Salt, um den Unterschlüssel pro Sitzung abzuleiten, gefolgt von einer beliebigen Anzahl verschlüsselter Chunks. Jeder Chunk hat die folgende Struktur:
[Länge der verschlüsselten Nutzlast][Längen-Tag][verschlüsselte Nutzlast][Tag der Nutzlast]
Die Nutzlastlänge ist eine 2-Byte-Big-Endian-Ganzzahl ohne Vorzeichen, die auf 0x3FFF begrenzt ist. Die höheren zwei Bits sind reserviert und müssen auf Null gesetzt werden. Die Nutzlast ist daher auf 16*1024 – 1 Byte begrenzt.
Die erste AEAD-Verschlüsselungs-/Entschlüsselungsoperation verwendet eine zählende Nonce, die bei 0 beginnt. Nach jeder Verschlüsselungs-/Entschlüsselungsoperation wird die Nonce um eins inkrementiert, als ob sie eine vorzeichenlose Little-Endian-Ganzzahl wäre. Beachten Sie, dass jeder TCP-Block zwei AEAD-Verschlüsselungs-/Entschlüsselungsoperationen umfasst: eine für die Länge der Nutzlast und eine für die Nutzlast. Daher erhöht jeder Chunk die Nonce zweimal.