シャドウソックスのドキュメント
ナビゲーション
AEAD
AEAD Authenticated Encryption with Associated Data の略です。 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(キー、ソルト、情報) => サブキー
情報文字列は、生成されたサブキーを特定のアプリケーション コンテキストにバインドします。 この場合、引用符なしの文字列「ss-subkey」である必要があります。
HKDF_SHA1 を使用して、事前共有マスター キーからセッションごとのサブキーを派生させます。 Salt は、事前共有マスター キーの有効期間全体を通じて一意である必要があります。
認証された暗号化/復号化
AE_encrypt は、秘密鍵、非秘密ナンス、メッセージを受け取り、暗号文と認証タグを生成する関数です。 ノンスは、各呼び出しで特定のキーに対して一意である必要があります。
AE_encrypt(キー、ノンス、メッセージ) => (暗号文、タグ)
AE_decrypt は、秘密鍵、非秘密ナンス、暗号文、認証タグを受け取り、元のメッセージを生成する関数です。 入力のいずれかが改ざんされている場合、復号化は失敗します。
AE_decrypt(キー、ノンス、暗号文、タグ) => メッセージ
TCP
AEAD で暗号化された TCP ストリームは、セッションごとのサブキーを導出するためにランダムに生成されたソルトで始まり、その後に任意の数の暗号化されたチャンクが続きます。 各チャンクの構造は次のとおりです。
[暗号化されたペイロードの長さ][長さのタグ][暗号化されたペイロード][ペイロードのタグ]
ペイロードの長さは、2 バイトのビッグエンディアンの符号なし整数で、上限は 0x3FFF です。 上位 16 ビットは予約されており、ゼロに設定する必要があります。 したがって、ペイロードは 1024*1 – XNUMX バイトに制限されます。
最初の AEAD 暗号化/復号化操作では、0 から始まるカウントナンスが使用されます。各暗号化/復号化操作の後、ノンスは、符号なしリトルエンディアン整数であるかのように XNUMX ずつ増加します。 各 TCP チャンクには XNUMX つの AEAD 暗号化/復号化操作が含まれることに注意してください。XNUMX つはペイロード長用で、もう XNUMX つはペイロード用です。 したがって、各チャンクは nonce を XNUMX 回増やします。
TCP
AEAD で暗号化された TCP ストリームは、セッションごとのサブキーを導出するためにランダムに生成されたソルトで始まり、その後に任意の数の暗号化されたチャンクが続きます。 各チャンクの構造は次のとおりです。
[暗号化されたペイロードの長さ][長さのタグ][暗号化されたペイロード][ペイロードのタグ]
ペイロードの長さは、2 バイトのビッグエンディアンの符号なし整数で、上限は 0x3FFF です。 上位 16 ビットは予約されており、ゼロに設定する必要があります。 したがって、ペイロードは 1024*1 – XNUMX バイトに制限されます。
最初の AEAD 暗号化/復号化操作では、0 から始まるカウントナンスが使用されます。各暗号化/復号化操作の後、ノンスは、符号なしリトルエンディアン整数であるかのように XNUMX ずつ増加します。 各 TCP チャンクには XNUMX つの AEAD 暗号化/復号化操作が含まれることに注意してください。XNUMX つはペイロード長用で、もう XNUMX つはペイロード用です。 したがって、各チャンクは nonce を XNUMX 回増やします。