הצפנה מאומתת

סכמת הצפנה מאומתת (באנגלית: 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 בהגדרה החזקה. רעיון הצפנה מאומתת 'גנרית' הוא הרכבה של הצפנה סימטרית כקופסה שחורה עם מנגנון אימות. כלומר קיימת הפרדה בין האימות להצפנה כך שניתן יהיה להחליף את הצופן הסימטרי או את אלגוריתם האימות בכל שלב. בהגדרה יש להבטיח שהרכבה כזו בטוחה כנגד התקפת גלוי-נבחר שבה התוקף אינו יכול הבחין בהבדל בין הצפנה של טקסט גלוי כלשהו לפי בחירתו לבין טקסט אקראי. מסמנים זאת IND-CPA שהיא הגדרה חלשה יותר לעומת IND-CCA (קיצור של אי-יכולת הבחנה תחת התקפת מוצפן-נבחר). באופן כללי מרבית האלגוריתמים המודרניים עומדים לפחות בהגדרה החלשה. אימות אפשר להשיג באמצעות אלגוריתם קוד אימות מסרים בטוח. במקרה כזה ההצפנה המאומתת מושגת בשני שלבים, ריצת הצפנה וריצת אימות. נניח שפונקציית ההצפנה של הצופן הסימטרי נקראת Enc {\displaystyle {\text{Enc}}} והפענוח Dec {\displaystyle {\text{Dec}}} , פונקציית יצירת תג האימות Mac {\displaystyle {\text{Mac}}} , פונקציית בדיקת התג Verify {\displaystyle {\text{Verify}}} . יהי k = ( k 1 , k 2 ) {\displaystyle k=(k_{1},k_{2})} מפתח סודי המשותף לשולח והמקבל, כאשר k 1 {\displaystyle k_{1}} משמש להצפנה ו- k 2 {\displaystyle k_{2}} לאימות. קיימות שלוש דרכים נפוצות לשילוב הצפנה עם אימות: הצפנה ואימות: בשיטה זו ההצפנה והאימות מבוצעים בנפרד. בהינתן טקסט גלוי m {\displaystyle m} השולח מכין את c {\displaystyle c} ו- t {\displaystyle t} כדלהלן: c ← Enc k 1 ( m ) , t ← Enc k 2 ( m ) {\displaystyle c\leftarrow {\text{Enc}}_{k_{1}}(m),t\leftarrow {\text{Enc}}_{k_{2}}(m)} c {\displaystyle c} הוא הטקסט המוצפן ו- t {\displaystyle t} הוא תג האימות אותם הוא מעביר למקבל. המקבל מצידו מפענח: m = dec k 1 ( c ) {\displaystyle m={\text{dec}}_{k_{1}}(c)} ומוודא שהתג t {\displaystyle t} תקף, אם לא מתקבל Verify k 2 ( m , t ) = 1 {\displaystyle {\text{Verify}}_{k_{2}}(m,t)=1} הוא דוחה את המסר ומחזיר הודעת שגיאה. פרוטוקול SSH אימץ גרסה דומה לזו. אימות ואז הצפנה: בשיטה זו תחילה מייצרים תג אימות ואז מצפינים את המסר יחד עם תג האימות ושולחים רק את c {\displaystyle c} : t ← Mac k 2 ( m ) , c ← Enc k 1 ( m   ‖   t ) {\displaystyle t\leftarrow {\text{Mac}}_{k_{2}}(m),c\leftarrow {\text{Enc}}_{k_{1}}(m\ \|\ t)} כאשר הסימן ‖ {\displaystyle \|} מייצג שרשור מחרוזות. כאן תג האימות אינו נשלח בגלוי אלא הוא מוצפן יחד עם המסר. המקבל מצידו תחילה מפענח את המסר ומקבל את m {\displaystyle m} ואת t {\displaystyle t} . ואז בודק אם מתקבל Verify k 2 ( m , t ) = 1 {\displaystyle {\text{Verify}}_{k_{2}}(m,t)=1} . אחרת הוא דוחה את המסר כולו ומחזיר הודעת שגיאה. פרוטוקול SSL משתמש בווריאציה כזו. הצפנה ואז אימות: בשיטה זו המסר תחילה מוצפן ואז מכינים מהטקסט המוצפן c {\displaystyle c} תג אימות t {\displaystyle t} ושולחים את שניהם: c ← Enc k 1 ( m ) , t ← Mac k 2 ( c ) {\displaystyle c\leftarrow {\text{Enc}}_{k_{1}}(m),t\leftarrow {\text{Mac}}_{k_{2}}(c)} . המקבל מאמת תחילה את t {\displaystyle t} על c {\displaystyle c} לפני שהוא מפענח ורק אם האימות עבר בהצלחה הוא מפענח את c {\displaystyle c} ומקבל את m {\displaystyle m} . פרוטוקול IPSec תומך בגרסה כזו. כל אחת מהשיטות מניבה ביטחון שונה בהתאם למודלים של ביטחון שונים. כאשר השיטה הראשונה הצפנה ואימות נפרדים, היא החלשה ביותר ואילו השיטה האחרונה אימות אחרי הצפנה, היא החזקה ביותר. הנחת הבסיס היא שהצופן הסימטרי בטוח לפחות כנגד התקפת גלוי-נבחר בקיצור (CPA) ואלגוריתם האימות אינו ניתן לזיוף לפחות תחת CMA - התקפת מסר-נבחר. הטבלה הבאה פורסמה ב-2007 על ידי Mihir Bellare מאוניברסיטת קליפורניה בסן דייגו שנחשב לאחד מהוגי הרעיון ו-Chanathip Namprempre באוניברסיטת תאמאסאט בתאילנד והיא מציגה את הקשר בין הגדרות הבטחת סודיות והבטחת אימות בהתאם למודלים שונים של ביטחון. בשתי הטבלאות הבאות "כן" מתייחס לכך שהמבנה הוכח כבטוח תחת ההנחות המתוארות. ו"לא" פירושו שקיים מבנה כזה שאינו עונה על כל הגדרות הביטחון - במקרים מסוימים (לא בכל המקרים). שתי הטבלאות מציגות את תוצאות רמת הביטחון של שלושת המבנים המתוארים תחת מודלים שונים מהכבד אל הקל. הטבלה העליונה מניחה שקוד אימות המסרים בטוח תחת ההגדרה המקלה של 'אי-זיוף' ואילו הטבלה התחתונה מתייחסת למקרה שבו קוד האימות עמיד כנגד ההתקפה האמורה בהגדרה החזקה שלה. המושג NM-CPA מתייחס לאי-חשילות שהיא הגדרה חזקה יותר של ביטחון סמנטי. הרכבה גנרית של הצפנה מאומתת סובלת מכמה חסרונות; יעילות נמוכה, התנפחות לא רצויה של הצופן וסיכון בטיחותי שנובע מהחשש שלמרות שכל אחד מהמרכיבים בטוח, השילוב ביניהם עלול להחדיר חולשות או פרצות בלתי ידועות. ההעדפה היא לפתח מערכת ייעודית המקפלת בתוכה הצפנה עם אימות, עם ביטחון מוכח ובעדיפות לריצה אחת מסיבות של יעילות. מסיבות של תאימות ויעילות רצוי שהאלגוריתם יקבל מפתח הצפנה יחיד, למרות שפנימית האלגוריתם עושה שימוש במפתח אימות נפרד הנגזר מהמפתח הראשי. נושא נוסף שנשקל הוא זכויות יוצרים, ארגוני תקינה ויצרנים נמנעים באופן גורף משימוש באלגוריתמים המעוגנים בפטנטים ובזכויות יוצרים. רוגווי הרחיב את המושג הצפנה מאומתת להגדרה של הצפנה מאומתת עם מידע נלווה (Authenticated Encryption with Associated Data בקיצור AEAD). במודל זה המידע מחולק לשני חלקים טקסט-גלוי המיועד להצפנה וכותר (header) שמגיע יחד איתו. השלמות במקרה זה מחויבת לגבי כל חלקי המידע אך הסודיות לא, כי הכותר משודר במצב גלוי. בעיה זו של הבטחת שלמות המידע הנלווה מתעורר בעיקר בפרוטוקול העברת מפתח והיא נקראת גם אריזת מפתח הצפנה. כלומר מציאת מנגנון בטוח להעברת המפתח והמידע הנלווה אליו בצורה בטוחה ומאומתת לצד השני. וכן שהחלק הגלוי במידע לא יסכן את סודיות הפרוטוקול או שלמותו. אפשר להשיג זאת על ידי שילוב המידע הנלווה בתהליך האימות. דרך אחרת להשגת אימות או הבטחת שלימות היא "הצפנה עם יתירות". כלומר ניסיון להשיג אימות על ידי קידוד המידע בדרך כלשהי כמו ריפוד במספר אקראי לפני ההצפנה. הרעיון הוא שאם מרפדים את המסר היטב לפני ההצפנה אפשר להשיג אימות בחינם. דוגמה טובה היא שיטת הריפוד OAEP. על כל פנים מתוך הטבלה עולה שהשיטה שאומצה בפרוטוקול SSH פחות בטוחה מהאחרות. בסכמות הצפנה המבוססות על וקטור אתחול או Nonce חובה שוקטור האתחול יהיה ייחודי וחד פעמי. כלומר אין להשתמש בו שוב עם אותו מפתח להצפנת מסרים אחרים כיוון שקיים חשש שאם יימצא בלוק מידע שחוזר על עצמו הרי שהצפנה שלו תחת ווקטור אתחול קבוע עם אותו מפתח סודי עלול לייצר בלוק מוצפן זהה, מסיבה זו יש להבטיח שוקטור האתחול או המפתח, לפחות אחד מהם יהיה שונה. מגבלה זו היא באחריות המשתמש ומסתבר שקיימים היבטים מעשיים שמקשים על כיבודה בפועל. מפתחי מערכות נטו בעבר להתעלם ממנה מה שהוביל למערכות פגומות שניתן לפרוץ בקלות. הדוגמה הטובה ביותר היא פריצת פלייסטיישן 3 שנקראת Jailbreak. מסיבה זו פותחו מספר מצבי הפעלה שמביאים בחשבון עובדה זו. אם מבלי משים או במכוון המשתמש סיפק וקטור אתחול זהה, המערכת תהיה בטוחה (במגבלות מסוימות) ולא תהיה פרוצה לחלוטין, מערכת כזו נקראת Nonce Respecting או Misuse-resistance והיא תכונה חשובה בהצפנה מאומתת. הגדרה קונקרטית של ביטחון סמנטי של הצפנה מאומתת היא על ידי מה שקרוי 'משחק' ו"יתרון" של "יריב" כאשר המושג "בטוח" אינו מוגדר פורמלית בהקשר זה, אלא פירושו שהיתרון של יריב מוגבל במקום ובזמן "זניח" בהתאם לפרמטר כלשהו שנתון לדיון. בצפנים סימטריים כמו AES למשל לא קיימת הגדרה פורמלית. באופן כללי בהקשר של ביטחון סמנטי של צופן סימטרי או אסימטרי המשחק מנוהל בצורה כזו שהיריב מגיש בפני האורקל או מציב האתגר, שאילתות עם זוגות מסרים M 0 , M 1 {\displaystyle M_{0},M_{1}} באורך שווה ומקבל בחזרה הצפנה של אחד מהמסרים באופן אקראי M b {\displaystyle M_{b}} ( b {\displaystyle b} הוא תוצאה של הטלת מטבע חדשה בכל שאילתא) ועליו לנחש בעזרת הטקסט המוצפן שקיבל בכל שאילתא, איזה מביניהם הוצפן כלומר: b {\displaystyle b} שווה "0" או "1" (אמת או שקר). היריב יחשב כמנצח אם יצליח בהסתברות גבוהה מחצי באחוז מסוים "שאינו זניח" לנחש נכונה בכל הניסויים שביצע. בניסוח פורמלי ההגדרה תחת מודל CCA או CPA היא: Adv S E ind-cpa ( A ) = 2 ⋅ Pr [ IND-CPA S E A ⇒ 1 ] − 1 {\displaystyle {\mbox{Adv}}_{SE}^{\mbox{ind-cpa}}(A)=2\cdot \Pr[{\mbox{IND-CPA}}_{SE}^{A}\Rightarrow 1]-1} או Adv S E ind-cca ( A ) = 2 ⋅ Pr [ IND-CCA S E A ⇒ 1 ] − 1 {\displaystyle {\mbox{Adv}}_{SE}^{\mbox{ind-cca}}(A)=2\cdot \Pr[{\mbox{IND-CCA}}_{SE}^{A}\Rightarrow 1]-1} בהקשר של הצפנה מאומתת את רעיון השלמות או האימות אפשר להגדיר בדרך דומה: Adv S E int-ptxt ( A ) = Pr [ INT-PTXT S E A ⇒ 1 ] {\displaystyle {\mbox{Adv}}_{SE}^{\mbox{int-ptxt}}(A)=\Pr[{\mbox{INT-PTXT}}_{SE}^{A}\Rightarrow 1]} וכן Adv S E int-ctxt ( A ) = Pr [ INT-CTXT S E A ⇒ 1 ] {\displaystyle {\mbox{Adv}}_{SE}^{\mbox{int-ctxt}}(A)=\Pr[{\mbox{INT-CTXT}}_{SE}^{A}\Rightarrow 1]} הרעיון של 'אי-זיוף' מוגדר באופן דומה: Adv M A wuf-cma ( F ) = Pr [ WUF-CMA M A F ⇒ 1 ] {\displaystyle {\mbox{Adv}}_{MA}^{\mbox{wuf-cma}}(F)=\Pr[{\mbox{WUF-CMA}}_{MA}^{F}\Rightarrow 1]} וכן Adv M A suf-cma ( F ) = Pr [ SUF-CMA M A F ⇒ 1 ] {\displaystyle {\mbox{Adv}}_{MA}^{\mbox{suf-cma}}(F)=\Pr[{\mbox{SUF-CMA}}_{MA}^{F}\Rightarrow 1]} קודי אימות מסרים תיקניים כמו אילו המתוארים לעיל כמו HMAC ,PMAC או UMAC ודומיהם מוגדרים בטוחים SUF-CMA שהיא ההגדרה המחמירה שכוללת גם את WUF-CMA. כמו כן ההגדרה של INT-PTXT חלשה מ-INT-CTXT. להלן רשימה נבחרת של אלגוריתמים להצפנה מאומתת המבוססת על צופן בלוקים וצופן בלוקים בר-התאמה, עם מידע נלווה או ללא מידע נלווה. כמה מהן סכמות מתקדמות בעלות מאפיינים נוספים כמו המאפיין של "הצפנה מאומתת דטרמיניסטית עם עמידות שימוש לא ראוי", שפירושה שסכמת ההצפנה תספק ביטחון סביר (במידת האפשר) גם אם השתמשו באותו וקטור אתחול פעמיים, ולא תקרוס לחלוטין. קטגוריה מתקדמת נוספת היא "עמידות מעבר לגבול יום-הולדת", דהיינו שסכימת ההצפנה מספקת ביטחון אף מעבר לדרישה המינימלית הנובעת מפרדוקס יום ההולדת שהיא פקטור של מחצית מאורך המפתח. מצב הפעלה של צופן בלוקים קוד אימות מסרים Bellare, M.; Namprempre, C. (2000), T. Okamoto (ed.), "Authenticated Encryption: Relations among notions and analysis of the generic composition paradigm", Extended abstract in Advances in Cryptology: Asiacrypt 2000 Proceedings, Lecture Notes in Computer Science, Springer-Verlag, 1976: 531, doi:10.1007/3-540-44448-3_41, ISBN 978-3-540-41404-9 תיאור מתקפה על הריפוד, דיגיטל וויספר, גיליון 55, גיליון נובמבר, 31-אוקטובר-2014, המאמר השלישי, מאת שחר קורוט (Hutch). כולל הפניה למבוא למתקפת Padding Oracle בגיליון 16 ssh insertion attack Weak CRC allows packet injection into SSH sessions encrypted with block ciphers The Software Performance of Authenticated-Encryption Modes