مستندات Shadowsocks
جهت یابی
AEAD
AEAD مخفف رمزگذاری تأیید شده با داده های مرتبط است. رمزهای AEAD به طور همزمان محرمانه، یکپارچگی و اصالت را ارائه می دهند. آنها دارای عملکرد عالی و بهره وری انرژی در سخت افزار مدرن هستند. کاربران باید در صورت امکان از رمزهای AEAD استفاده کنند.
رمزهای AEAD زیر توصیه می شود. پیاده سازی های سازگار Shadowsocks باید از AEAD_CHACHA20_POLY1305 پشتیبانی کنند. پیاده سازی برای دستگاه های با شتاب AES سخت افزاری باید AEAD_AES_128_GCM و AEAD_AES_256_GCM را نیز پیاده سازی کند.
نام | نام مستعار | اندازه کلید | اندازه نمک | بدون اندازه | اندازه تگ |
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 (کلید، nonce، پیام) => (متن رمز، برچسب)
AE_decrypt تابعی است که یک کلید مخفی، غیر مخفی، متن رمزی، یک تگ احراز هویت را می گیرد و یک پیام اصلی تولید می کند. اگر هر یک از ورودی ها دستکاری شود، رمزگشایی ناموفق خواهد بود.
AE_decrypt (کلید، nonce، متن رمز شده، برچسب) => پیام
TCP
یک جریان TCP رمزگذاری شده AEAD با یک نمک تولید شده به طور تصادفی برای استخراج کلید فرعی در هر جلسه شروع می شود و به دنبال آن تعداد تکه های رمزگذاری شده وجود دارد. هر قطعه دارای ساختار زیر است:
[طول محموله رمزگذاری شده [برچسب طول]] محموله رمزگذاری شده [برچسب بار]
طول بار یک عدد صحیح بدون علامت 2 بایتی است که روی 0x3FFF محدود شده است. دو بیت بالاتر رزرو شده و باید روی صفر تنظیم شود. بنابراین حجم بار به 16*1024 – 1 بایت محدود می شود.
اولین عملیات رمزگذاری/رمزگشایی AEAD از یک نون شمارشی استفاده میکند که از 0 شروع میشود. پس از هر عملیات رمزگذاری/رمزگشایی، nonce یک عدد افزایش مییابد، انگار که یک عدد صحیح اندین کوچک بدون علامت باشد. توجه داشته باشید که هر قطعه TCP شامل دو عملیات رمزگذاری/رمزگشایی AEAD است: یکی برای طول بار و دیگری برای بار. بنابراین هر تکه نونس را دو برابر افزایش می دهد.
TCP
یک جریان TCP رمزگذاری شده AEAD با یک نمک تولید شده به طور تصادفی برای استخراج کلید فرعی در هر جلسه شروع می شود و به دنبال آن تعداد تکه های رمزگذاری شده وجود دارد. هر قطعه دارای ساختار زیر است:
[طول محموله رمزگذاری شده [برچسب طول]] محموله رمزگذاری شده [برچسب بار]
طول بار یک عدد صحیح بدون علامت 2 بایتی است که روی 0x3FFF محدود شده است. دو بیت بالاتر رزرو شده و باید روی صفر تنظیم شود. بنابراین حجم بار به 16*1024 – 1 بایت محدود می شود.
اولین عملیات رمزگذاری/رمزگشایی AEAD از یک نون شمارشی استفاده میکند که از 0 شروع میشود. پس از هر عملیات رمزگذاری/رمزگشایی، nonce یک عدد افزایش مییابد، انگار که یک عدد صحیح اندین کوچک بدون علامت باشد. توجه داشته باشید که هر قطعه TCP شامل دو عملیات رمزگذاری/رمزگشایی AEAD است: یکی برای طول بار و دیگری برای بار. بنابراین هر تکه نونس را دو برابر افزایش می دهد.