Dokumentasi Shadowsocks
Navigasi
AEAD
AEAD singkatan dari Authenticated Encryption with Associated Data. Cipher AEAD secara bersamaan memberikan kerahasiaan, integritas, dan keaslian. Mereka memiliki kinerja luar biasa dan efisiensi daya pada perangkat keras modern. Pengguna harus menggunakan cipher AEAD jika memungkinkan.
Cipher AEAD berikut direkomendasikan. Implementasi Shadowsocks yang sesuai harus mendukung AEAD_CHACHA20_POLY1305. Implementasi untuk perangkat dengan akselerasi hardware AES juga harus mengimplementasikan AEAD_AES_128_GCM dan AEAD_AES_256_GCM.
Nama | 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 |
Silakan lihat Registri IANA AEAD untuk skema penamaan dan spesifikasi.
Derivasi Kunci
Kunci master dapat dimasukkan langsung dari pengguna atau dihasilkan dari kata sandi.
HKDF_SHA1 adalah fungsi yang mengambil kunci rahasia, garam non-rahasia, string info, dan menghasilkan subkunci yang kuat secara kriptografik meskipun kunci rahasia yang dimasukkan lemah.
HKDF_SHA1(kunci, garam, info) => subkunci
String info mengikat subkunci yang dihasilkan ke konteks aplikasi tertentu. Dalam kasus kami, itu harus berupa string "ss-subkey" tanpa tanda kutip.
Kami memperoleh subkunci per sesi dari kunci master yang dibagikan sebelumnya menggunakan HKDF_SHA1. Salt harus unik sepanjang masa pakai kunci master yang dibagikan sebelumnya.
Enkripsi/Dekripsi Terautentikasi
AE_encrypt adalah fungsi yang mengambil kunci rahasia, non-rahasia, pesan, dan menghasilkan ciphertext dan tag otentikasi. Nonce harus unik untuk kunci tertentu di setiap pemanggilan.
AE_encrypt(kunci, nonce, pesan) => (ciphertext, tag)
AE_decrypt adalah fungsi yang mengambil kunci rahasia, non-rahasia nonce, ciphertext, tag otentikasi, dan menghasilkan pesan asli. Jika salah satu input dirusak, dekripsi akan gagal.
AE_decrypt(key, nonce, ciphertext, tag) => pesan
TCP
Aliran TCP terenkripsi AEAD dimulai dengan garam yang dibuat secara acak untuk mendapatkan subkunci per sesi, diikuti oleh sejumlah potongan terenkripsi. Setiap potongan memiliki struktur berikut:
[panjang muatan terenkripsi][label panjang][muatan terenkripsi][tag muatan]
Panjang payload adalah 2-byte big-endian unsigned integer yang dibatasi pada 0x3FFF. Dua bit yang lebih tinggi dicadangkan dan harus disetel ke nol. Oleh karena itu, payload dibatasi hingga 16*1024 – 1 byte.
Operasi enkripsi/dekripsi AEAD pertama menggunakan nonce penghitungan mulai dari 0. Setelah setiap operasi enkripsi/dekripsi, nonce bertambah satu seolah-olah itu adalah bilangan bulat little-endian yang tidak ditandatangani. Perhatikan bahwa setiap potongan TCP melibatkan dua operasi enkripsi/dekripsi AEAD: satu untuk panjang payload, dan satu untuk payload. Oleh karena itu setiap potongan meningkatkan nonce dua kali.
TCP
Aliran TCP terenkripsi AEAD dimulai dengan garam yang dibuat secara acak untuk mendapatkan subkunci per sesi, diikuti oleh sejumlah potongan terenkripsi. Setiap potongan memiliki struktur berikut:
[panjang muatan terenkripsi][label panjang][muatan terenkripsi][tag muatan]
Panjang payload adalah 2-byte big-endian unsigned integer yang dibatasi pada 0x3FFF. Dua bit yang lebih tinggi dicadangkan dan harus disetel ke nol. Oleh karena itu, payload dibatasi hingga 16*1024 – 1 byte.
Operasi enkripsi/dekripsi AEAD pertama menggunakan nonce penghitungan mulai dari 0. Setelah setiap operasi enkripsi/dekripsi, nonce bertambah satu seolah-olah itu adalah bilangan bulat little-endian yang tidak ditandatangani. Perhatikan bahwa setiap potongan TCP melibatkan dua operasi enkripsi/dekripsi AEAD: satu untuk panjang payload, dan satu untuk payload. Oleh karena itu setiap potongan meningkatkan nonce dua kali.