Документация на Shadowsocks
навигация
НАЧАЛО
НАЧАЛО означава Удостоверено шифроване със свързани данни. AEAD шифрите осигуряват едновременно поверителност, цялост и автентичност. Те имат отлична производителност и енергийна ефективност на модерен хардуер. Потребителите трябва да използват AEAD шифри, когато е възможно.
Препоръчват се следните AEAD шифри. Съвместимите реализации на Shadowsocks трябва да поддържат AEAD_CHACHA20_POLY1305. Реализациите за устройства с хардуерно AES ускорение също трябва да прилагат AEAD_AES_128_GCM и AEAD_AES_256_GCM.
Име | Псевдоним | Размер на ключ | Размер на солта | Nonce Размер | Размер на маркера |
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, съобщение и произвежда шифрован текст и таг за удостоверяване. Nonce трябва да бъде уникален за даден ключ при всяко извикване.
AE_encrypt(key, nonce, message) => (шифрован текст, етикет)
AE_decrypt е функция, която взема таен ключ, non-sekret nonce, шифрован текст, таг за удостоверяване и създава оригинално съобщение. Ако някой от въведените данни бъде манипулиран, декриптирането ще бъде неуспешно.
AE_decrypt(key, nonce, ciphertext, tag) => съобщение
TCP
AEAD криптиран TCP поток започва с произволно генерирана сол за извличане на подключа за сесия, последван от произволен брой криптирани парчета. Всяка част има следната структура:
[дължина на шифрован полезен товар][етикет за дължина][шифрован полезен товар][етикет на полезен товар]
Дължината на полезния товар е 2-байтово цяло число без знак с начален край на порядъка, ограничено до 0x3FFF. По-високите два бита са запазени и трябва да бъдат зададени на нула. Следователно полезният товар е ограничен до 16*1024 – 1 байта.
Първата операция за шифроване/декриптиране на AEAD използва еднократно число за отчитане, започващо от 0. След всяка операция за шифроване/декриптиране, еднократното число се увеличава с единица, сякаш е цяло число без знак с малък ред. Обърнете внимание, че всяка TCP част включва две AEAD операции за криптиране/декриптиране: една за дължината на полезния товар и една за полезния товар. Следователно всяка част увеличава nonce два пъти.
TCP
AEAD криптиран TCP поток започва с произволно генерирана сол за извличане на подключа за сесия, последван от произволен брой криптирани парчета. Всяка част има следната структура:
[дължина на шифрован полезен товар][етикет за дължина][шифрован полезен товар][етикет на полезен товар]
Дължината на полезния товар е 2-байтово цяло число без знак с начален край на порядъка, ограничено до 0x3FFF. По-високите два бита са запазени и трябва да бъдат зададени на нула. Следователно полезният товар е ограничен до 16*1024 – 1 байта.
Първата операция за шифроване/декриптиране на AEAD използва еднократно число за отчитане, започващо от 0. След всяка операция за шифроване/декриптиране, еднократното число се увеличава с единица, сякаш е цяло число без знак с малък ред. Обърнете внимание, че всяка TCP част включва две AEAD операции за криптиране/декриптиране: една за дължината на полезния товар и една за полезния товар. Следователно всяка част увеличава nonce два пъти.