Документация Shadowsocks

АЕАД

АЕАД расшифровывается как 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. Соль должна быть уникальной на протяжении всего срока действия общего мастер-ключа.

Аутентифицированное шифрование/дешифрование

AE_encrypt — это функция, которая принимает секретный ключ, несекретный одноразовый номер, сообщение и создает зашифрованный текст и тег аутентификации. Nonce должен быть уникальным для данного ключа в каждом вызове.

AE_encrypt (ключ, одноразовый номер, сообщение) => (зашифрованный текст, тег)

 

AE_decrypt — это функция, которая принимает секретный ключ, несекретный одноразовый номер, зашифрованный текст, тег аутентификации и создает исходное сообщение. Если какой-либо из входных данных будет подделан, расшифровка завершится неудачно.

AE_decrypt (ключ, одноразовый номер, зашифрованный текст, тег) => сообщение

TCP

Поток TCP, зашифрованный AEAD, начинается со случайно сгенерированной соли для получения подключа для сеанса, за которым следует любое количество зашифрованных фрагментов. Каждый фрагмент имеет следующую структуру:

[длина зашифрованной полезной нагрузки][тег длины][зашифрованная полезная нагрузка][тег полезной нагрузки]

 

Длина полезной нагрузки — это 2-байтовое целое число без знака с обратным порядком байтов, ограниченное 0x3FFF. Старшие два бита зарезервированы и должны быть установлены в ноль. Поэтому полезная нагрузка ограничена 16*1024 – 1 байт.

Первая операция шифрования/дешифрования AEAD использует подсчитываемый одноразовый номер, начинающийся с 0. После каждой операции шифрования/дешифрования одноразовый номер увеличивается на единицу, как если бы это было целое число с прямым порядком байтов без знака. Обратите внимание, что каждый фрагмент TCP включает две операции шифрования/дешифрования AEAD: одну для длины полезной нагрузки и одну для полезной нагрузки. Поэтому каждый фрагмент увеличивает одноразовый номер в два раза.

TCP

Поток TCP, зашифрованный AEAD, начинается со случайно сгенерированной соли для получения подключа для сеанса, за которым следует любое количество зашифрованных фрагментов. Каждый фрагмент имеет следующую структуру:

[длина зашифрованной полезной нагрузки][тег длины][зашифрованная полезная нагрузка][тег полезной нагрузки]

 

Длина полезной нагрузки — это 2-байтовое целое число без знака с обратным порядком байтов, ограниченное 0x3FFF. Старшие два бита зарезервированы и должны быть установлены в ноль. Поэтому полезная нагрузка ограничена 16*1024 – 1 байт.

Первая операция шифрования/дешифрования AEAD использует подсчитываемый одноразовый номер, начинающийся с 0. После каждой операции шифрования/дешифрования одноразовый номер увеличивается на единицу, как если бы это было целое число с прямым порядком байтов без знака. Обратите внимание, что каждый фрагмент TCP включает две операции шифрования/дешифрования AEAD: одну для длины полезной нагрузки и одну для полезной нагрузки. Поэтому каждый фрагмент увеличивает одноразовый номер в два раза.

Начните 5-дневную бесплатную пробную версию