Документація Shadowsocks
навігація
AEAD
AEAD означає Authenticated Encryption with Associated Data. Шифри AEAD одночасно забезпечують конфіденційність, цілісність і автентичність. Вони мають відмінну продуктивність і енергоефективність на сучасному обладнанні. Користувачі повинні використовувати шифри AEAD, коли це можливо.
Рекомендуються такі шифри AEAD. Сумісні реалізації Shadowsocks повинні підтримувати AEAD_CHACHA20_POLY1305. Реалізації для пристроїв з апаратним прискоренням AES також мають реалізовувати AEAD_AES_128_GCM і AEAD_AES_256_GCM.
ІМ'Я | кличка | Розмір ключа | Розмір солі | Nonce Size | Розмір тегу |
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(key, nonce, message) => (зашифрований текст, тег)
AE_decrypt — це функція, яка приймає секретний ключ, несекретний номер, зашифрований текст, тег автентифікації та створює оригінальне повідомлення. Якщо будь-який із введених даних підроблено, дешифрування не вдасться.
AE_decrypt(key, nonce, ciphertext, tag) => повідомлення
TCP
Потік TCP, зашифрований AEAD, починається з випадково згенерованої солі для отримання підключа кожного сеансу, за яким слідує будь-яка кількість зашифрованих фрагментів. Кожна частина має таку структуру:
[довжина зашифрованого корисного навантаження][тег довжини][зашифрований корисне навантаження][тег корисного навантаження]
Довжина корисного навантаження — це 2-байтове ціле число без знаку в порядку старшого в порядку 0x3FFF. Старші два біти зарезервовані і повинні бути встановлені на нуль. Тому корисне навантаження обмежене 16*1024 – 1 байтом.
Перша операція шифрування/дешифрування AEAD використовує одноразовий номер підрахунку, починаючи з 0. Після кожної операції шифрування/дешифрування одноразовий номер збільшується на одиницю, як якщо б це було ціле число без знаку. Зауважте, що кожна послідовність TCP передбачає дві операції шифрування/дешифрування AEAD: одну для довжини корисного навантаження та одну для корисного навантаження. Таким чином, кожен фрагмент збільшує одноразовий номер удвічі.
TCP
Потік TCP, зашифрований AEAD, починається з випадково згенерованої солі для отримання підключа кожного сеансу, за яким слідує будь-яка кількість зашифрованих фрагментів. Кожна частина має таку структуру:
[довжина зашифрованого корисного навантаження][тег довжини][зашифрований корисне навантаження][тег корисного навантаження]
Довжина корисного навантаження — це 2-байтове ціле число без знаку в порядку старшого в порядку 0x3FFF. Старші два біти зарезервовані і повинні бути встановлені на нуль. Тому корисне навантаження обмежене 16*1024 – 1 байтом.
Перша операція шифрування/дешифрування AEAD використовує одноразовий номер підрахунку, починаючи з 0. Після кожної операції шифрування/дешифрування одноразовий номер збільшується на одиницю, як якщо б це було ціле число без знаку. Зауважте, що кожна послідовність TCP передбачає дві операції шифрування/дешифрування AEAD: одну для довжини корисного навантаження та одну для корисного навантаження. Таким чином, кожен фрагмент збільшує одноразовий номер удвічі.