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 增加兩次。

開始您的 5 天免費試用