הצפנה מאומתת

סכמת הצפנה מאומתת (באנגלית: Authenticated Encryption) או בקיצור AE, היא סכמת הצפנה של צופן סימטרי, שמטרתה לספק במקביל לסודיות שלמות ואימות המידע המוצפן. 
באופן כללי יצירת סכימות הצפנה מאומתת היא משימה קשה יותר מיצירת סכמה שמקיימת את דרישה הבסיסית של סודיות בלבד. אחת הדרכים ליצירת סכימת הצפנה מאומתת היא בעזרת הרכבה של שתי סכמות קריפטוגרפיות נפרדות: אלגוריתם הצפנה בטוח לפי מודל התקפת גלוי-נבחר וקוד אימות מסרים לפי מודל התקפת מסר נבחר. תחילה השולח והמקבל צריכים להסכים ביניהם על מפתח הצפנה סודי. המצפין משתמש במפתח הסודי שברשותו כדי להצפין את המידע באמצעות הצופן הסימטרי ולאחר מכן מייצר באמצעות קוד אימות המסרים עם מפתח סודי נפרד (אלא אם כן קיימת דרך בטוחה ליצור ממנו באופן בלתי תלוי מפתח אחר) תג אימות של המסר המוצפן ואת התוצאה שהיא זוג של מסר מוצפן ותג אימות מתאים הוא שולח למקבל. המקבל מצידו משתמש במפתח הסודי שברשותו כדי לפענח את המידע וכן בודק את תג האימות שקיבל באמצעות המפתח הסודי שאיתו השתמש השולח. אם המידע מאומת בהצלחה הוא מקבל אותו כמידע אותנטי שהגיע מהמקור שהוצהר, אחרת הוא דוחה אותו על הסף ומחזיר הודעת שגיאה מתאימה לשולח. מעצם ההגדרה תג האימות מבטיח כי תוקף בעל יכולת חישוב סבירה לא יוכל לזייף מסר מוצפן ותג מתאים בלא ידיעת מפתח ההצפנה הסודי המשותף להם, כך שהמקבל לא יבחין בכך. כלומר שפונקציית האימות של המקבל תחזיר "אמת" כאילו ההודעה התקבלה מהשולח האותנטי.

רקע ומוטיבציה

הצורך בהצפנה מאומתת עולה באופן טבעי לאור העובדה שמעצם ההגדרה צופן סימטרי אינו מבטיח שלמות ואותנטיות. תמיד קיים חשש שתוקף זדוני יצליח ליירט מסר מוצפן, לשנותו או להחליפו באחר ולהעבירו ליעדו מבלי שלמקבל תהיה דרך להבחין בכך. בשל כך פותחו שיטות לאימות שנועדו להבטיח את שלמות המסר באמצעים קריפטוגרפיים. בעבר בשל ההפרדה בין שני היעדים, סודיות לעומת שלמות ובהיעדר תקן כלשהו נטו מפתחי מערכות אבטחה לפתור בעיה זו בשיטות אד הוק. דרך אחת היא להוסיף יתירות מכוונת כמו ריפוד המסר במספר אקראי לפני ההצפנה, דרך אחרת היא שילוב קוד אימות מסרים יחד עם הצפנה (באופן שלא הוכח כבטוח מבחינה קריפטוגרפית). התקפות אינטרנט ניצלו פרצות אלו. הניסיון מלמד ששילוב הצפנה עם אימות מורכב ומועד לשגיאות. שגיאה נפוצה אחת היא הניסיון להבטיח אימות בשיטות לא קריפטוגרפיות כמו שימוש בפונקציית גיבוב ללא מפתח או בקוד תיקון שגיאות. פרוטוקול SSH גרסה 1.5 השתמש ב-CRC-32 לאימות במבנה CBC עובדה שנוצלה לשבירת הפרוטוקול. טעות אחרת היא להשתמש במפתח הצפנה יחיד הן להצפנה והן לאימות שאינו מומלץ ואף עלול להוות פרצת אבטחה במקרים מסוימים. בשל בעיות תאימות עם מערכות קיימות יש עדיפות לשימוש במפתח אחד. בפועל מערכות הצפנה בטוחות משתמשות בטכניקה לגזירת מפתחות הצפנה נוספים ממפתח המאסטר באמצעות KDF בטוח. גם במקרה שהמרכיבים כשלעצמם בטוחים יכול להיות שהמערכת כמכלול לא תהיה בטוחה.
הפרדיגמה הבסיסית כדי לספק סודיות ושלמות באופן בטוח היא, לקחת צופן סימטרי בטוח המספק סודיות בלבד ולשלבו במצב הפעלה CBC או מצב מונה עם אלגוריתם אימות מסרים בטוח המספק אימות בלבד. עם מפתח סודי נפרד או עם מפתח שנגזר באופן בטוח מהמפתח הראשון. מפתח האימות ומפתח ההצפנה חייבים להיות שונים ובלתי תלויים סטטיסטית, כלומר לא ניתן לנחש מפתח אחד בהינתן השני. אפשר להישתמש בשני מפתחות סודיים האחד לצורך הצפנה והשני לצורך אימות. אך לשיטה זו מספר חסרונות; יעילות נמוכה, אחסון מספר רב של מפתחות סודיים וכן בעיית תאימות עם מערכות קיימות. דרך אחרת היא להפיק את מפתח האימות מתוך מפתח ההצפנה בדרך בטוחה כמו באמצעות פונקציה אקראית 'אוניברסלית'.
שיטות השילוב של הצפנה עם אימות מתחלקות לשני סוגים עקריים; הרכבה גנרית, שבה הם נעשים בנפרד ללא קשר הדוק ביניהם, הרעיון נמצא בשימוש מעשי נרחב בסכמות רבות בין היתר HMAC, UMAC או CBC-MAC. השיטות האחרות מנסות לשלב בין ההצפנה והאימות באופן יותר הדוק כדי להבטיח סודיות ואימות גבוהים ביותר האפשריים במחיר הנמוך ביותר מהיבט של יעילות. קיימות מספר שיטות כאלו, ביניהן אפשר למנות את: OCB, CCM, EAX, GCM שהוצעו ונבחנו על ידי מומחים ואושרו בתקן איזו ובארגוני תקינה נוספים. וכן IACBC, XCBC, Helix, CWC.

היסטוריה

רעיון הצפנה מאומתת הועלה לראשונה על ידי בלייר ורוגווי ב-1995 והורחב לאחר מכן על ידי אחרים. המושג מבוסס על רעיון אימות מסרים שהועלה לראשונה על ידי ווגמן וקרטר, הם הציעו לנצל צופן בלוקים כדי להשיג אימות במקום סודיות. מטרת קוד אימות מסרים היא להבטיח שלמות טקסט-קריא (המסומן INT-PTXT קיצור של integrity of plaintext) או שלמות טקסט-מוצפן (שנקרא INT-CTXT קיצור של integrity of ciphertext), באופן כזה שבהינתן מסר ומפתח סודי, המקבל יוכל להבחין בכל שינוי במסר בהסתברות מאוד גבוהה. בשונה מרעיון הבטחת סודיות בצופן סימטרי, כאן בהגדרה המסר יכול להשאר גלוי ואין דרישה לסודיות. לצורך השוואה בין שתי הדרישות; סודיות מול אימות, מקובל שההגדרה האחרונה מקבילה לרעיון החלש של הבטחת סודיות שנקרא IND-CPA כלומר עמידות בפני התקפת גלוי-נבחר, הקיצור IND מתייחס לאי-יכולת הבחנה (indistinguishability). את הבטחת השלמות דהיינו שהמסר המוצפן 'לא ניתן לזיוף' (unforgeable) תחת התקפת מסר-נבחר (CMA) אפשר להגדיר בשני אופנים, ההגדרה החלשה מסומנת WUF-CMA (קיצור של weakly unforgeable) שבה בהינתן מסר ותג מתאים, יהיה קשה מבחינה חישובית למצוא מסר אחר שהתג יהיה תקף עבורו, גם אם התוקף יכול לבקש מהאורקל שיכין עבורו תגים המתאימים למספר מסרים לפי בחירתו, עם אותו מפתח אימות או מפתחות אחרים]. או בהגדרה החזקה יותר הנקראת SUF-CMA כאשר SUF פירושו strongly unforgeable, שבה באותה סיטואציה יהיה קשה מבחינה חישובית ליריב למצוא כל זוג 'מסר+תג' כך שהתג יהיה תקף עבור המסר (גם אם המסר אינו בעל משמעות או שייכות כלשהי, כל עוד התג לא יוצר במקור מאותו מסר). הוכח שכל פונקציה פסאודו-רנדומלית בטוחה יכולה להיות MAC בהגדרה החזקה.

הצפנה מאומתת עם מידע נלווה

רוגווי הרחיב את המושג הצפנה מאומתת להגדרה של הצפנה מאומתת עם מידע נלווה (Authenticated Encryption with Associated Data בקיצור AEAD). במודל זה המידע מחולק לשני חלקים טקסט-גלוי המיועד להצפנה וכותר (header) שמגיע יחד איתו. השלמות במקרה זה מחויבת לגבי כל חלקי המידע אך הסודיות לא, כי הכותר משודר במצב גלוי. בעיה זו של הבטחת שלמות המידע הנלווה מתעורר בעיקר בפרוטוקול העברת מפתח והיא נקראת גם אריזת מפתח הצפנה. כלומר מציאת מנגנון בטוח להעברת המפתח והמידע הנלווה אליו בצורה בטוחה ומאומתת לצד השני. וכן שהחלק הגלוי במידע לא יסכן את סודיות הפרוטוקול או שלמותו. אפשר להשיג זאת על ידי שילוב המידע הנלווה בתהליך האימות. דרך אחרת להשגת אימות או הבטחת שלימות היא "הצפנה עם יתירות". כלומר ניסיון להשיג אימות על ידי קידוד המידע בדרך כלשהי כמו ריפוד במספר אקראי לפני ההצפנה. הרעיון הוא שאם מרפדים את המסר היטב לפני ההצפנה אפשר להשיג אימות בחינם. דוגמה טובה היא שיטת הריפוד OAEP. על כל פנים מתוך הטבלה עולה שהשיטה שאומצה בפרוטוקול SSH פחות בטוחה מהאחרות.

עמידה בפני שימוש לא ראוי וכיבוד ייחודיות

בסכמות הצפנה המבוססות על וקטור אתחול או Nonce חובה שוקטור האתחול יהיה ייחודי וחד פעמי. כלומר אין להשתמש בו שוב עם אותו מפתח להצפנת מסרים אחרים כיוון שקיים חשש שאם יימצא בלוק מידע שחוזר על עצמו הרי שהצפנה שלו תחת ווקטור אתחול קבוע עם אותו מפתח סודי עלול לייצר בלוק מוצפן זהה, מסיבה זו יש להבטיח שוקטור האתחול או המפתח, לפחות אחד מהם יהיה שונה. מגבלה זו היא באחריות המשתמש ומסתבר שקיימים היבטים מעשיים שמקשים על כיבודה בפועל. מפתחי מערכות נטו בעבר להתעלם ממנה מה שהוביל למערכות פגומות שניתן לפרוץ בקלות. הדוגמה הטובה ביותר היא פריצת פלייסטיישן 3 שנקראת Jailbreak. מסיבה זו פותחו מספר מצבי הפעלה שמביאים בחשבון עובדה זו. אם מבלי משים או במכוון המשתמש סיפק וקטור אתחול זהה, המערכת תהיה בטוחה (במגבלות מסוימות) ולא תהיה פרוצה לחלוטין, מערכת כזו נקראת Nonce Respecting או Misuse-resistance והיא תכונה חשובה בהצפנה מאומתת.