Документація 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: одну для довжини корисного навантаження та одну для корисного навантаження. Таким чином, кожен фрагмент збільшує одноразовий номер удвічі.

Почніть свою 5-денну безкоштовну пробну версію