Dokumentasi Shadowsocks
navigation
AeAD
AeAD bermaksud Penyulitan Disahkan dengan Data Berkaitan. Sifir AEAD secara serentak memberikan kerahsiaan, integriti dan ketulenan. Mereka mempunyai prestasi cemerlang dan kecekapan kuasa pada perkakasan moden. Pengguna harus menggunakan sifir AEAD apabila boleh.
Sifir AEAD berikut disyorkan. Pelaksanaan Shadowsocks yang mematuhi mesti menyokong AEAD_CHACHA20_POLY1305. Pelaksanaan untuk peranti dengan pecutan AES perkakasan juga harus melaksanakan AEAD_AES_128_GCM dan AEAD_AES_256_GCM.
Nama | Alias | Saiz Kunci | Saiz Garam | Saiz Nonce | Saiz 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 |
Sila rujuk kepada Pendaftaran IANA AEAD untuk skema penamaan dan spesifikasi.
Terbitan Utama
Kunci induk boleh dimasukkan terus daripada pengguna atau dijana daripada kata laluan.
HKDF_SHA1 ialah fungsi yang mengambil kunci rahsia, garam bukan rahsia, rentetan maklumat dan menghasilkan subkunci yang kuat dari segi kriptografi walaupun kunci rahsia input lemah.
HKDF_SHA1(kunci, garam, maklumat) => subkunci
Rentetan maklumat mengikat subkunci yang dijana kepada konteks aplikasi tertentu. Dalam kes kami, ia mestilah rentetan "ss-subkey" tanpa petikan.
Kami memperoleh subkunci setiap sesi daripada kunci induk prakongsi menggunakan HKDF_SHA1. Garam mestilah unik sepanjang hayat kunci induk prakongsi.
Penyulitan/Penyahsulitan Disulitkan
AE_encrypt ialah fungsi yang mengambil kunci rahsia, nonce bukan rahsia, mesej, dan menghasilkan teks sifir dan teg pengesahan. Nonce mestilah unik untuk kunci yang diberikan dalam setiap seruan.
AE_encrypt(kunci, nonce, mesej) => (sifirteks, tag)
AE_decrypt ialah fungsi yang mengambil kunci rahsia, nonce bukan rahsia, teks sifir, teg pengesahan dan menghasilkan mesej asal. Jika mana-mana input diganggu, penyahsulitan akan gagal.
AE_decrypt(key, nonce, ciphertext, tag) => mesej
TCP
Strim TCP yang disulitkan AEAD bermula dengan garam yang dijana secara rawak untuk memperoleh subkunci setiap sesi, diikuti dengan sebarang bilangan ketulan yang disulitkan. Setiap ketulan mempunyai struktur berikut:
[panjang muatan disulitkan][teg panjang][muatan disulitkan][teg muatan]
Panjang muatan ialah integer tidak bertanda big-endian 2-bait yang dihadkan pada 0x3FFF. Dua bit yang lebih tinggi dikhaskan dan mesti ditetapkan kepada sifar. Oleh itu muatan adalah terhad kepada 16*1024 – 1 bait.
Operasi penyulitan/nyahsulit AEAD yang pertama menggunakan pengiraan nonce bermula dari 0. Selepas setiap operasi penyulitan/nyahsulit, nonce itu ditambah dengan satu seolah-olah ia adalah integer kecil-endian yang tidak ditandatangani. Ambil perhatian bahawa setiap bahagian TCP melibatkan dua operasi penyulitan/nyahsulit AEAD: satu untuk panjang muatan dan satu untuk muatan. Oleh itu setiap ketul menambah nonce dua kali.
TCP
Strim TCP yang disulitkan AEAD bermula dengan garam yang dijana secara rawak untuk memperoleh subkunci setiap sesi, diikuti dengan sebarang bilangan ketulan yang disulitkan. Setiap ketulan mempunyai struktur berikut:
[panjang muatan disulitkan][teg panjang][muatan disulitkan][teg muatan]
Panjang muatan ialah integer tidak bertanda big-endian 2-bait yang dihadkan pada 0x3FFF. Dua bit yang lebih tinggi dikhaskan dan mesti ditetapkan kepada sifar. Oleh itu muatan adalah terhad kepada 16*1024 – 1 bait.
Operasi penyulitan/nyahsulit AEAD yang pertama menggunakan pengiraan nonce bermula dari 0. Selepas setiap operasi penyulitan/nyahsulit, nonce itu ditambah dengan satu seolah-olah ia adalah integer kecil-endian yang tidak ditandatangani. Ambil perhatian bahawa setiap bahagian TCP melibatkan dua operasi penyulitan/nyahsulit AEAD: satu untuk panjang muatan dan satu untuk muatan. Oleh itu setiap ketul menambah nonce dua kali.