Shadowsocksi dokumentatsioon
NAVIGATSIOON
AEAD
AEAD tähistab Authenticated Encryption with Associated Data. AEAD-šifrid tagavad samaaegselt konfidentsiaalsuse, terviklikkuse ja autentsuse. Neil on tänapäevasel riistvaral suurepärane jõudlus ja energiatõhusus. Kasutajad peaksid võimalusel kasutama AEAD-šifreid.
Soovitatavad on järgmised AEAD-šifrid. Ühilduvad Shadowsocksi juurutused peavad toetama AEAD_CHACHA20_POLY1305. Riistvaralise AES-kiirendusega seadmete rakendused peaksid rakendama ka AEAD_AES_128_GCM ja AEAD_AES_256_GCM.
Nimi | Teise nimega | Klahvi suurus | Soola suurus | Nonce suurus | Sildi suurus |
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 |
Palun viita IANA AEAD register nimetamisskeemi ja spetsifikatsiooni jaoks.
Võtme tuletamine
Peavõtme saab sisestada otse kasutajalt või genereerida paroolist.
HKDF_SHA1 on funktsioon, mis võtab salajase võtme, mittesalajast soola, infostringi ja loob alamvõtme, mis on krüptograafiliselt tugev isegi siis, kui sisendi salajane võti on nõrk.
HKDF_SHA1(võti, sool, teave) => alamvõti
Infostring seob loodud alamvõtme konkreetse rakenduse kontekstiga. Meie puhul peab see olema string "ss-subkey" ilma jutumärkideta.
Tuletame seansipõhise alamvõtme eeljagatud peavõtmest, kasutades HKDF_SHA1. Sool peab olema ainulaadne kogu eeljagatud peavõtme kasutusaja jooksul.
Autentitud krüptimine/dekrüpteerimine
AE_encrypt on funktsioon, mis võtab salajase võtme, mittesalajase mittesalaja, sõnumi ning loob šifriteksti ja autentimissildi. Nonce peab iga väljakutsumise korral antud võtme jaoks olema kordumatu.
AE_encrypt(võti, nonce, sõnum) => (šifreeritud tekst, silt)
AE_decrypt on funktsioon, mis võtab salajase võtme, mittesalajast nonce'i, šifriteksti, autentimissildi ja loob algse sõnumi. Kui mõnda sisendit rikutakse, siis dekrüpteerimine ebaõnnestub.
AE_decrypt(võti, nonce, šifreeritud tekst, silt) => sõnum
TCP
AEAD-krüptitud TCP-voog algab juhuslikult genereeritud soolaga, et tuletada seansi alamvõti, millele järgneb suvaline arv krüptitud tükke. Igal tükil on järgmine struktuur:
[krüpteeritud kasuliku koorma pikkus][pikkuse silt][krüpteeritud kasulik koormus][kasuliku koormuse silt]
Kasuliku koormuse pikkus on 2-baidine märgita täisarv, mille ülempiir on 0x3FFF. Kaks kõrgemat bitti on reserveeritud ja need tuleb nullida. Kasulik koormus on seetõttu piiratud 16 * 1024 - 1 baidiga.
Esimene AEAD krüptimise/dekrüptimise toiming kasutab loenduslikku nonce'i, mis algab 0-st. Pärast iga krüptimise/dekrüpteerimise toimingut suurendatakse nonce'i ühe võrra, nagu oleks tegemist märgita väikese lõpuga täisarvuga. Pange tähele, et iga TCP tükk hõlmab kahte AEAD krüptimise/dekrüpteerimise toimingut: ühte kasuliku koormuse pikkuse ja teist kasuliku koormuse jaoks. Seetõttu suurendab iga tükk nonce'i kaks korda.
TCP
AEAD-krüptitud TCP-voog algab juhuslikult genereeritud soolaga, et tuletada seansi alamvõti, millele järgneb suvaline arv krüptitud tükke. Igal tükil on järgmine struktuur:
[krüpteeritud kasuliku koorma pikkus][pikkuse silt][krüpteeritud kasulik koormus][kasuliku koormuse silt]
Kasuliku koormuse pikkus on 2-baidine märgita täisarv, mille ülempiir on 0x3FFF. Kaks kõrgemat bitti on reserveeritud ja need tuleb nullida. Kasulik koormus on seetõttu piiratud 16 * 1024 - 1 baidiga.
Esimene AEAD krüptimise/dekrüptimise toiming kasutab loenduslikku nonce'i, mis algab 0-st. Pärast iga krüptimise/dekrüpteerimise toimingut suurendatakse nonce'i ühe võrra, nagu oleks tegemist märgita väikese lõpuga täisarvuga. Pange tähele, et iga TCP tükk hõlmab kahte AEAD krüptimise/dekrüpteerimise toimingut: ühte kasuliku koormuse pikkuse ja teist kasuliku koormuse jaoks. Seetõttu suurendab iga tükk nonce'i kaks korda.