Дакументацыя Shadowsocks
рух
AEAD
AEAD расшыфроўваецца як аўтэнтыфікаванае шыфраванне са звязанымі дадзенымі. Шыфры 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 - гэта функцыя, якая прымае сакрэтны ключ, несакрэтны nonce, зашыфраваны тэкст, тэг аўтэнтыфікацыі і стварае арыгінальнае паведамленне. Калі што-небудзь з уводу будзе падроблена, расшыфроўка не атрымаецца.
AE_decrypt(key, nonce, ciphertext, tag) => паведамленне
TCP
TCP-паток, зашыфраваны AEAD, пачынаецца з выпадкова згенераванай солі для атрымання падключа для кожнага сеансу, за якім варта любая колькасць зашыфраваных фрагментаў. Кожны чанк мае наступную структуру:
[даўжыня зашыфраванай карыснай нагрузкі][тэг даўжыні][зашыфраваная карысная нагрузка][тэг карыснай нагрузкі]
Даўжыня карыснай нагрузкі - гэта 2-байтавае цэлае без знака ў парадку байтавання, абмежаванае 0x3FFF. Два старэйшыя біты зарэзерваваны і павінны быць усталяваны ў нуль. Таму карысная нагрузка абмежаваная 16*1024 – 1 байтам.
Першая аперацыя шыфравання/дэшыфравання AEAD выкарыстоўвае nonce для падліку, пачынаючы з 0. Пасля кожнай аперацыі шыфравання/дэшыфравання nonce павялічваецца на адзінку, як калі б гэта было цэлае лік без знака з пачаткам маленькага байта. Звярніце ўвагу, што кожны фрагмент TCP уключае дзве аперацыі шыфравання/дэшыфравання AEAD: адну для даўжыні карыснай нагрузкі і другую для карыснай нагрузкі. Такім чынам, кожны чанк павялічвае nonce удвая.
TCP
TCP-паток, зашыфраваны AEAD, пачынаецца з выпадкова згенераванай солі для атрымання падключа для кожнага сеансу, за якім варта любая колькасць зашыфраваных фрагментаў. Кожны чанк мае наступную структуру:
[даўжыня зашыфраванай карыснай нагрузкі][тэг даўжыні][зашыфраваная карысная нагрузка][тэг карыснай нагрузкі]
Даўжыня карыснай нагрузкі - гэта 2-байтавае цэлае без знака ў парадку байтавання, абмежаванае 0x3FFF. Два старэйшыя біты зарэзерваваны і павінны быць усталяваны ў нуль. Таму карысная нагрузка абмежаваная 16*1024 – 1 байтам.
Першая аперацыя шыфравання/дэшыфравання AEAD выкарыстоўвае nonce для падліку, пачынаючы з 0. Пасля кожнай аперацыі шыфравання/дэшыфравання nonce павялічваецца на адзінку, як калі б гэта было цэлае лік без знака з пачаткам маленькага байта. Звярніце ўвагу, што кожны фрагмент TCP уключае дзве аперацыі шыфравання/дэшыфравання AEAD: адну для даўжыні карыснай нагрузкі і другую для карыснай нагрузкі. Такім чынам, кожны чанк павялічвае nonce удвая.