תיעוד של 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 חייב להיות ייחודי עבור מפתח נתון בכל הזמנה.

AE_encrypt(key, nonce, message) => (טקסט צופן, תג)

 

AE_decrypt היא פונקציה שלוקחת מפתח סודי, nonce nonce, טקסט צופן, תג אימות ומייצרת הודעה מקורית. אם מחבל באחד מהקלטים, הפענוח ייכשל.

AE_decrypt(מפתח, nonce, ciphertext, tag) => הודעה

TCP

זרם TCP מוצפן AEAD מתחיל במלח שנוצר באקראי כדי להפיק את מפתח המשנה לכל הפעלה, ואחריו כל מספר של נתחים מוצפנים. לכל נתח יש את המבנה הבא:

[אורך מטען מוצפן][תג אורך][מטען מוצפן][תג מטען]

 

אורך המטען הוא מספר שלם ללא סימן גדול של 2 בתים בגודל 0x3FFF. שני הביטים הגבוהים יותר שמורים ויש להגדיר אותם לאפס. לכן המטען מוגבל ל-16*1024 - 1 בתים.

פעולת ההצפנה/פענוחה הראשונה של AEAD משתמשת ב-nonce ספירה שמתחילה מ-0. לאחר כל פעולת הצפנה/פענוח, ה-nonce גדל באחד כאילו היה מספר שלם-אנדיאן קטן ללא סימן. שימו לב שכל נתח TCP כולל שתי פעולות הצפנה/פענוח של AEAD: אחת עבור אורך המטען, ואחת עבור המטען. לכן כל נתח מגדיל את הנון פעמיים.

TCP

זרם TCP מוצפן AEAD מתחיל במלח שנוצר באקראי כדי להפיק את מפתח המשנה לכל הפעלה, ואחריו כל מספר של נתחים מוצפנים. לכל נתח יש את המבנה הבא:

[אורך מטען מוצפן][תג אורך][מטען מוצפן][תג מטען]

 

אורך המטען הוא מספר שלם ללא סימן גדול של 2 בתים בגודל 0x3FFF. שני הביטים הגבוהים יותר שמורים ויש להגדיר אותם לאפס. לכן המטען מוגבל ל-16*1024 - 1 בתים.

פעולת ההצפנה/פענוחה הראשונה של AEAD משתמשת ב-nonce ספירה שמתחילה מ-0. לאחר כל פעולת הצפנה/פענוח, ה-nonce גדל באחד כאילו היה מספר שלם-אנדיאן קטן ללא סימן. שימו לב שכל נתח TCP כולל שתי פעולות הצפנה/פענוח של AEAD: אחת עבור אורך המטען, ואחת עבור המטען. לכן כל נתח מגדיל את הנון פעמיים.

התחל את תקופת הניסיון בחינם למשך 5 ימים