מה קורה בפועל כשמצפינים בית מידע - Modes of Operation¶
הפוסט על הצפנה סימטרית ואסימטרית עצר בנקודה חשובה - AES הוא אלגוריתם ההצפנה הסימטרי המוביל כיום. אבל "מצפינים עם AES" זו לא כל הסיפור. AES, כמו רוב הצפנים הבלוקיים (block ciphers), מצפין בכל פעם רק חתיכה קבועה של מידע, בדרך כלל 16 בייטים. השאלה המעניינת באמת היא מה קורה כשיש לכם קובץ שלם, הרבה יותר גדול מ-16 בייטים - וזו בדיוק השאלה שעונים עליה מצבי הפעלה, modes of operation.
הבעיה - מה עושים עם קובץ ארוך מבלוק אחד¶
צופן בלוקי כמו AES יודע להצפין ולפענח בדיוק בלוק אחד בגודל קבוע. אם הקובץ שלכם גדול מבלוק אחד, וזה כמעט תמיד המצב, צריך שיטה שקובעת איך מטפלים ברצף של הרבה בלוקים. הבחירה בשיטה הזאת היא לא פרט טכני שולי - היא ההבדל בין הצפנה בטוחה לבין הצפנה ששבורה לחלוטין, גם כשמשתמשים באותו אלגוריתם AES המדויק.
ECB - הגישה הנאיבית שנראית הגיונית ופשוט שבורה¶
הגישה הכי פשוטה שאפשר לחשוב עליה נקראת ECB, Electronic Codebook - פשוט מצפינים כל בלוק בנפרד, עם אותו מפתח, בלי שום קשר בין בלוק לבלוק. הבעיה היא שאם שני בלוקים בטקסט המקורי זהים, גם שני הבלוקים המוצפנים שלהם יהיו זהים. זה נשמע כמו פרט קטן, אבל התוצאה מזעזעת בפועל - אם מצפינים תמונה עם ECB, עדיין אפשר לראות בבירור את קווי המתאר של התמונה המקורית בתוך הגרסה "המוצפנת", כי אזורים חוזרים בתמונה מייצרים בלוקים מוצפנים זהים. ECB נחשב כיום שגוי לשימוש כמעט בכל הקשר.
CBC - שרשור בלוקים עם IV¶
הפתרון הראשון לבעיה הזאת נקרא CBC, Cipher Block Chaining. הרעיון - לפני שמצפינים כל בלוק, מבצעים עליו פעולת XOR עם תוצאת הבלוק המוצפן הקודם. כך, אפילו שני בלוקים זהים בטקסט המקורי ייצאו שונים לגמרי בפלט המוצפן, כי כל אחד "מושפע" ממה שקדם לו. הבלוק הראשון, שאין לפניו בלוק קודם, מקבל ערך אקראי מיוחד שנקרא IV, וקטור אתחול (Initialization Vector), שצריך להיות שונה בכל פעם שמצפינים מחדש, גם עם אותו מפתח בדיוק - אחרת חוזרים לאותה בעיה של דפוסים חוזרים.
הבעיה שגם CBC לא פותרת - שלמות המידע¶
הצפנה טובה לא רק מסתירה מידע, היא גם צריכה להבטיח שאף אחד לא שינה אותו בדרך בלי שתדעו. CBC לבדו לא נותן שום ערובה כזאת - תוקף יכול לשנות בייטים בהודעה המוצפנת, ובלי בדיקה נוספת, הצד שמפענח פשוט יקבל תוכן משובש בלי אזהרה, או במקרים גרועים יותר, שינוי חכם שמייצר תוצאה בעלת משמעות שהתוקף בחר.
AES-GCM - הפתרון המודרני שגם מצפין וגם מאמת¶
הגישה שהתעשייה עברה אליה כיום נקראת AES-GCM, שמשלבת שני דברים בפעולה אחת - הצפנה, וגם קוד אימות הודעה (authentication tag) שמצורף לסוף המידע המוצפן. כשמפענחים, בודקים קודם את קוד האימות. אם הוא לא תואם, ברור מיד שמישהו שינה את המידע בדרך, והמערכת דוחה את הפענוח לגמרי, במקום להחזיר תוכן משובש בלי התראה. הצירוף הזה של הצפנה ואימות ביחד נקרא הצפנה מאומתת (authenticated encryption), וזה בדיוק מה ש-TLS משתמש בו כיום כברירת מחדל, במקום CBC הישן.
למה זה חשוב להבין¶
מפתחים ששומעים "אנחנו משתמשים ב-AES" מרגישים לרוב שהם סיימו לחשוב על הצפנה. אבל AES זה רק הבלוק הבודד - הבחירה במצב ההפעלה סביבו קובעת אם המערכת שלכם בטוחה באמת או רק נראית בטוחה. זו בדיוק הסיבה שספריות קריפטוגרפיה מודרניות דוחפות מפתחים להשתמש ב-AES-GCM כברירת מחדל, ולא לבחור מצב ידנית בלי להבין את ההשלכות.
הבנה מעמיקה כזאת של הצפנה בפועל, לא רק ההגדרות התיאורטיות, היא בדיוק מה שאנחנו בונים בקורס הרשתות שלנו.
קורס הרשתות המלא נמצא כאן, חינם ובעברית, כולל הסבר מעמיק על הצפנה בפועל.
יש לכם שאלה על איזה מצב הצפנה מתאים לפרויקט שלכם? שאלו בדיסקורד.
לסיכום¶
הצפנה סימטרית טובה לא נגמרת בבחירת אלגוריתם כמו AES - מצב ההפעלה שסביבו הוא זה שקובע אם ההצפנה באמת בטוחה. ECB שבור ומגלה דפוסים, CBC פותר את זה עם שרשור ו-IV אבל לא מגן על שלמות המידע, ו-AES-GCM המודרני משלב הצפנה ואימות יחד, וזו בדיוק הסיבה שהוא הבחירה הנכונה כיום.