Документация 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: одну для длины полезной нагрузки и одну для полезной нагрузки. Поэтому каждый фрагмент увеличивает одноразовый номер в два раза.