Dokumentasi Shadowsocks
pandhu arah
AeAD
AeAD singkatan saka Authenticated Encryption with Associated Data. Cipher AEAD bebarengan nyedhiyakake rahasia, integritas, lan keaslian. Padha duwe kinerja banget lan efisiensi daya ing hardware modern. Pangguna kudu nggunakake cipher AEAD yen bisa.
Cipher AEAD ing ngisor iki dianjurake. Implementasi Shadowsocks sing tundhuk kudu ndhukung AEAD_CHACHA20_POLY1305. Implementasi kanggo piranti kanthi akselerasi AES hardware uga kudu ngetrapake AEAD_AES_128_GCM lan AEAD_AES_256_GCM.
jeneng | alias | Ukuran Kunci | Ukuran garam | Ukuran Nonce | Ukuran Tag |
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 |
Mangga deleng Registrasi IANA AEAD kanggo skema jeneng lan spesifikasi.
Derivasi Kunci
Tombol master bisa input langsung saka pangguna utawa digawe saka sandhi.
HKDF_SHA1 punika fungsi sing njupuk kunci rahasia, uyah non-rahasia, senar info, lan mrodhuksi subkey sing cryptographically kuwat sanajan kunci rahasia input banget.
HKDF_SHA1(kunci, uyah, info) => subkey
String info ngiket subkunci sing digawe menyang konteks aplikasi tartamtu. Ing kasus kita, kudu dadi senar "ss-subkey" tanpa tanda kutip.
Kita entuk subkunci saben sesi saka kunci master sing wis dienggo bareng nggunakake HKDF_SHA1. Garam kudu unik sajrone urip kunci master sing wis dienggo bareng.
Enkripsi / Dekripsi sing Diotentikasi
AE_encrypt minangka fungsi sing njupuk kunci rahasia, nonce non-rahasia, pesen, lan ngasilake ciphertext lan tag otentikasi. Nonce kudu unik kanggo kunci sing diwenehake ing saben invocation.
AE_encrypt(key, nonce, message) => (ciphertext, tag)
AE_decrypt minangka fungsi sing njupuk kunci rahasia, nonce non-rahasia, ciphertext, tag otentikasi, lan ngasilake pesen asli. Yen salah sawijining input dirusak, dekripsi bakal gagal.
AE_decrypt(key, nonce, ciphertext, tag) => pesen
TCP
Aliran TCP sing dienkripsi AEAD diwiwiti kanthi uyah sing diasilake kanthi acak kanggo nurunake subkunci saben sesi, diikuti karo potongan sing dienkripsi. Saben potongan nduweni struktur ing ngisor iki:
[panjang muatan terenkripsi][tag panjang][beban terenkripsi][tag muatan]
Dawane muatan yaiku 2-byte big-endian integer unsigned capped ing 0x3FFF. Rong bit sing luwih dhuwur disimpen lan kudu disetel menyang nol. Payload mula diwatesi dadi 16 * 1024 - 1 bita.
Operasi enkripsi / dekripsi AEAD pisanan nggunakake nonce pancacahan wiwit saka 0. Sawise saben operasi enkripsi / dekripsi, nonce ditambahake siji kaya-kaya minangka integer endian cilik sing ora ditandatangani. Elinga yen saben potongan TCP kalebu rong operasi enkripsi / dekripsi AEAD: siji kanggo dawa muatan, lan siji kanggo muatan. Mulane saben potongan mundhak kaping pindho.
TCP
Aliran TCP sing dienkripsi AEAD diwiwiti kanthi uyah sing diasilake kanthi acak kanggo nurunake subkunci saben sesi, diikuti karo potongan sing dienkripsi. Saben potongan nduweni struktur ing ngisor iki:
[panjang muatan terenkripsi][tag panjang][beban terenkripsi][tag muatan]
Dawane muatan yaiku 2-byte big-endian integer unsigned capped ing 0x3FFF. Rong bit sing luwih dhuwur disimpen lan kudu disetel menyang nol. Payload mula diwatesi dadi 16 * 1024 - 1 bita.
Operasi enkripsi / dekripsi AEAD pisanan nggunakake nonce pancacahan wiwit saka 0. Sawise saben operasi enkripsi / dekripsi, nonce ditambahake siji kaya-kaya minangka integer endian cilik sing ora ditandatangani. Elinga yen saben potongan TCP kalebu rong operasi enkripsi / dekripsi AEAD: siji kanggo dawa muatan, lan siji kanggo muatan. Mulane saben potongan mundhak kaping pindho.