Shadowsocks 文檔
導航
AEAD
AEAD 代錶帶有關聯數據的認證加密。 AEAD 密碼同時提供機密性、完整性和真實性。 它們在現代硬件上具有出色的性能和能效。 用戶應盡可能使用 AEAD 密碼。
建議使用以下 AEAD 密碼。 兼容的 Shadowsocks 實現必須支持 AEAD_CHACHA20_POLY1305。 具有硬件 AES 加速的設備的實現也應該實現 AEAD_AES_128_GCM 和 AEAD_AES_256_GCM。
姓名 | 別名 | 密鑰大小 | 鹽量 | 隨機數大小 | 標籤大小 |
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 |
請參閱 IANA AEAD 註冊表 用於命名方案和規範。
密鑰派生
主密鑰可以直接從用戶輸入或從密碼生成。
HKDF_SHA1 是一個函數,它接受一個秘密密鑰、一個非秘密鹽、一個信息字符串,並生成一個密碼強度很高的子密鑰,即使輸入的秘密密鑰很弱也是如此。
HKDF_SHA1(key, salt, info) => 子鍵
信息字符串將生成的子項綁定到特定的應用程序上下文。 在我們的例子中,它必須是不帶引號的字符串“ss-subkey”。
我們使用 HKDF_SHA1 從預共享主密鑰派生每個會話子密鑰。 在預共享主密鑰的整個生命週期中,Salt 必須是唯一的。
認證加密/解密
AE_encrypt 是一個函數,它接受一個秘密密鑰、一個非秘密隨機數、一條消息,並生成密文和一個身份驗證標籤。 對於每次調用中的給定密鑰,Nonce 必須是唯一的。
AE_encrypt(key, nonce, message) => (密文, 標籤)
AE_decrypt 是一個函數,它採用密鑰、非秘密隨機數、密文、身份驗證標籤,並生成原始消息。 如果任何輸入被篡改,解密將失敗。
AE_decrypt(key, nonce, ciphertext, tag) => 消息
TCP
AEAD 加密的 TCP 流以隨機生成的鹽開始,以派生每個會話的子密鑰,然後是任意數量的加密塊。 每個塊具有以下結構:
[加密負載長度][長度標籤][加密負載][負載標籤]
有效載荷長度是一個 2 字節的大端無符號整數,上限為 0x3FFF。 高兩位保留,必須設置為零。 因此,有效負載限制為 16*1024 – 1 個字節。
第一個 AEAD 加密/解密操作使用從 0 開始的計數隨機數。在每次加密/解密操作之後,隨機數都會遞增 XNUMX,就好像它是一個無符號小端整數一樣。 請注意,每個 TCP 塊涉及兩個 AEAD 加密/解密操作:一個用於有效負載長度,一個用於有效負載。 因此,每個塊將 nonce 增加兩次。
TCP
AEAD 加密的 TCP 流以隨機生成的鹽開始,以派生每個會話的子密鑰,然後是任意數量的加密塊。 每個塊具有以下結構:
[加密負載長度][長度標籤][加密負載][負載標籤]
有效載荷長度是一個 2 字節的大端無符號整數,上限為 0x3FFF。 高兩位保留,必須設置為零。 因此,有效負載限制為 16*1024 – 1 個字節。
第一個 AEAD 加密/解密操作使用從 0 開始的計數隨機數。在每次加密/解密操作之後,隨機數都會遞增 XNUMX,就好像它是一個無符號小端整數一樣。 請注意,每個 TCP 塊涉及兩個 AEAD 加密/解密操作:一個用於有效負載長度,一個用於有效負載。 因此,每個塊將 nonce 增加兩次。