תקיפת היפגשות באמצע

בקריפטואנליזה, תקיפת היפגשות באמצע או תקיפת נפגשים באמצע (באנגלית: meet-in-the-middle attack) בקיצור MITM, היא התקפת כוח גס גנרית בשיטת איזון זמן/זיכרון נגד סכמות הצפנה מרובה. התקפה זו היא הסיבה מדוע הצפנת DES כפול עם שני מפתחות שונים אינה משיגה ביטחון כפול כמצופה ולכן משתמשים בגרסת DES משולש כדי להשיג ביטחון כפול. התקפה זו ישימה גם נגד הצפנה יחידה אם מתייחסים לחלקים שונים של הצופן כאילו היו הצפנה מרובה.

==היסטוריה==
בגלל המפתח הקצר של DES שהוא רק 56 סיביות, במקום לפתח צופן חדש, אחת ההצעות לחזק את ביטחון הצופן במחיר מועט הייתה להצפין את המידע פעמיים עם שני מפתחות שונים. לכאורה אם משתמשים בשני מפתחות באורך 56 סיביות אמורים לקבל ביטחון כפול, 112 סיביות. כדי לשבור את הצופן בכוח גס בשיטה הישירה נדרשים לנסות בערך <math>2^{112}</math> מפתחות שזה לא מעשי כלל. ב-1977 הוכיחו ויטפילד דיפי ומרטין הלמן שהביטחון המושג אינו כפול כפי שנדמה בגלל שבתוספת זיכרון יש דרך לשבור את הצופן במאמץ כמעט זהה למאמץ הדרוש לשבירת הצופן עם מפתח אחד. הם הוכיחו שאפשר לפצח את DES כפול בסיבוכיות של <math>2^{57}</math> עם סיבוכיות מקום בסדר גודל של <math>2^{56}</math>. אף על פי שכמות זיכרון כזו אינה מעשית בכל אופן ניתנה הוכחה תאורטית שמראה בבירור שהתוספת בביטחון הצופן בעקבות הוספת מפתח זניחה. בנוסף, קיימות דרכים לצמצום דרישות הזיכרון של ההתקפה כמתואר בהמשך ולכן אפשר למעשה לשלול לגמרי את התועלת שבהצפנה כפולה. ההתקפה שלהם למעשה ישימה נגד כל צופן בלוקים שמשתמשים בו בתצורה של הצפנה כפולה סדרתית וכן אפשר להרחיבה נגד וריאציות של הצפנה מרובה עם שלושה מפתחות הצפנה ויותר. גרסה מתקדמת שלה נקראת התקפת היפגשות באמצע רב-ממדית שהיא קריפטואנליזה חדשה יחסית שנוסתה נגד צפנים כמו KATAN, Hammingbird ו-GOST.

==תיאור כללי==
תיאור התקפת היפגשות באמצע
התקפת היפגשות באמצע היא התקפת כוח גס גנרית שאינה מסתמכת על המבנה הפנימי של הצופן המותקף והיא מאתגרת את ההנחה שאם מצפינים פעמיים משיגים ביטחון כפול. היא פועלת לפי מודל התקפת גלוי-ידוע, ההנחה היא שהמתקיף הצליח להשיג בדרך כלשהי בלוק טקסט גלוי <math>p</math> ובלוק טקסט מוצפן <math>c</math> המתאים לו, דהיינו שהוצפן עם שני מפתחות סודיים באמצעות האלגוריתם אותו הוא מעוניין לשבור ותפקידו לנחש את המפתחות. הרעיון הוא פשוט, תחילה מכינים שתי טבלאות. בראשונה מאחסנים את תוצאות הצפנה של הבלוק הגלוי <math>p</math> עם כל המפתחות האפשריים וממיינים אותה לפי הטקסט המוצפן. בשנייה מאחסנים את תוצאות פענוח הבלוק המוצפן <math>c</math> עם כל המפתחות האפשריים וממיינים לפי הפלט ואז משווים בין שתי הטבלאות ומנסים למצוא התאמה. אם נמצאה התאמה יש סיכוי שהמפתחות המאוחסנים באותן כניסות שבהן קיימת ההתאמה הם המפתחות הסודיים שאיתם השתמש המצפין. צריך לזכור שיכול להיות מצב שבו אף על פי שיש התאמה המפתחות אינם אילו שהשתמש בהם המצפין (כי קיימים מפתחות רבים שאם מצפינים איתם את הבלוק האמור מתקבל פלט זהה). אם משווים את התוצאה עם זוגות נוספים של קלט/פלט רוב הסיכויים שהמפתחות שיתאימו בכולם יהיו המפתחות בהם השתמש המצפין. המאמץ הדרוש בשלב השני לניחוש המפתחות אינו עולה על המאמץ הדרוש לנחש מפתח אחד כי החיפוש בטבלה הממויינת עם טלבאות גיבוב רגילות אינו דורש מאמץ משמעותי ואפשר להתייחס אליו כאילו היה בסיבוכיות <math>O(1)</math>. אך זאת במחיר כמובן של תוספת טבלה המכילה את כל ההצפנות האפשריות של הבלוק הגלוי <math>p</math>. עבור בלוק באורך <math>n</math> הזיכרון הדרוש הוא <math>2^n</math>.

התקפת היפגשות באמצע מנסה למצוא את המפתחות משני הצדדים, מהצד של הטקסט הגלוי ומהצד של הטקסט המוצפן והפתרון נמצא אי שם באמצע (ומכאן שמה). כלומר מנסים לנחש תוצאה של הרכבה של מספר פונקציות אקראיות על ידי מיפוי לפנים ומיפוי לאחור ומנסים למצוא ערך אמצעי שמקיים את שני המיפויים או שני האגפים. כי אם <math>f_1</math> ו-<math>f_2</math> הן שתי פונקציות פסאודו-אקראיות הפיכות כלשהן, בהינתן <math>y=f_1(f_2(x))</math> חייבים להיות ערכים המקיימים <math>f_1(x) = M = f^{-1}_2(y)</math>.

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

==תיאור האלגוריתם==
הצפנה כפולה היא תצורה שבה מצפינים את הקלט פעמיים עם מפתחות שונים בזה אחר זה. כלומר בהינתן הבלוק <math>p</math> מצפינים על ידי:
:<math>c=E_{k_2}(E_{k_1}(p))</math> 
ולפענוח מבצעים:
:<math>p=E^{-1}_{k_1}(E^{-1}_{k_2}(c))</math>
כאן צופן הבלוקים במצב הצפנה מסומן ב-<math>E</math> ובמצב פענוח ב-<math>E^{-1}</math> עם המפתחות <math>k_1,k_2</math> כאשר <math>k_1\ne k_2</math>. המתקיף מנסה לצמצם את טווח החיפוש בטכניקת היפגשות באמצע בדרך הבאה:
#עבור כל מפתח <math>k_1\in\{0,1\}^n</math> מחשב את <math>z=E_{k_1}(p)</math> ומאחסן בטבלה <math>L_1</math> את כל הזוגות <math>(z, k_1)</math>.
#עבור כל מפתח <math>k_2\in\{0,1\}^n</math> מחשב את <math>z=E_{k_2}^{-1}(c)</math> ומאחסן את הזוגות <math>(z, k_2)</math> בטבלה <math>L_2</math>.
#ממיין את כניסות הטבלאות <math>L_1</math> ו-<math>L_2</math> לפי הערך הראשון <math>z</math>. 
#מכין רשימה <math>S</math> המכילה את כל ההתאמות בין שתי הטבלאות. אם נתונה כניסה כלשהי בטבלה <math>L_1</math> עם הערכים <math>z_1,k_1'</math> וכניסה אחרת בטבלה <math>L_2</math> עם הערכים <math>z_2,k_2'</math>, אז התאמה היא מצב בו מתקיים <math>z_1=z_2</math>.
#מחזיר את הרשימה <math>S</math>.
הרשימה <math>S</math> מכילה למעשה את כל זוגות המפתחות <math>(k_1,k_2)</math> האפשריים המקיימים <math>c=E_{k_2}(E_{k_1}(p))</math>. זה נכון משום שהערכים ברשימה <math>S</math> מקיימים:
:<math>E_{k_1}(p)=E_{k_2}^{-1}(c)</math>.
והשוויון האמור מתקיים רק אם <math>c=E_{k_2}(E_{k_1}(p))</math>.
אם אורך הבלוק של הצופן המותקף הוא באורך זהה. למשל אם המפתח והבלוק באורך <math>n</math> אז הסיכויים לנחש את המפתחות הם <math>2^{-n}</math>, כך שמספר האלמנטים ברשימה <math>S</math> צפוי להיות בערך <math>2^{2n}/2^n=2^n</math>. אמנם התוצאה הזו גבוהה, אך בהינתן זוג נוסף של קלט/פלט כלומר <math>p',c'</math> אחרים המקיימים את המשוואה של ההצפנה הכפולה עם אותם מפתחות, אז אם מנסים את כל האלמנטים ברשימה אפשר למצוא את זוג המפתחות הנכונים בהסתברות מאוד גבוהה. ככל שמנסים יותר זוגות ההסתברות עולה.

סיבוכיות ההתקפה המתוארת היא <math>O(2^n)</math>. הכנה ומיון של שתי הטבלאות <math>L_1</math> ו-<math>L_2</math> מתבצעת בזמן של בערך <math>2^n</math>. אם הטבלאות ממויינות כל ההתאמות ביניהן ניתנות לאיתור בזמן של <math>O(|S|+|L_1|+|L_2|)=O(2^n)</math>. ניחוש המפתחות אם משתמשים בשני זוגות קלט/פלט מתבצעת בזמן של <math>O(|S|)=2^n</math>, כך שסיבוכיות הזמן של ההתקפה האמורה היא <math>O(2^n)</math>.

===שיפורים===
אבן וגלודרייך הציעו שיפור של האלגוריתם. אפשר להגביל את דרישות הזיכרון ל-<math>w</math>, מחלקים את הטווח <math>L_1</math> לתת-קבוצות בגודל <math>w</math>. עבור כל תת-קבוצה מחשבים ומאחסנים את הזוג <math>(E_{k_1}(p),k_1)</math> ועבור כל <math>k_2</math> מחשבים את <math>E_{k_2}^{-1}(c)</math> ומחפשים בטבלה <math>L_1</math> התאמה. זמן הריצה הצפוי במקרה זה הוא <math>\textstyle \frac{1}{2}(\frac{n_1}{w})(w + n_2) \approx \frac{n_1n_2}{2w}</math> פעולות הצפנה.

מייקל ויינר ופול ואן-אורשוט הציעו שיפור נוסף על ידי שימוש באלגוריתם חיפוש התנגשויות מקבילי וצמצום דרישות הזיכרון באופן ניכר. לפי הרעיון שלהם התקפה נגד DES בשיטת היפגשות באמצע נחשבת מעשית מבחינת היקף המשאבים הדרושים לה.

==התקפת היפגשות באמצע רב-ממדית==
תיאור התקפת היפגשות באמצע רב-ממדית
אפשר להרחיב את ההתקפה הקלאסית של דיפי והלמן לממדים נוספים. בהינתן מספר זוגות תואמים של בלוק גלוי <math>p</math> ובלוק מוצפן <math>c</math> כך שמתקיים <math>c=E_k(p)</math> ונניח שהצופן <math>E</math> ניתן לפירוק לשני צפנים עוקבים <math>E_f(k_f,\cdot)</math> ו-<math>E_b(k_b,\cdot)</math> כך שמתקיים <math>c=E_b(k_b,E_f(k_f,p))</math>. מתייחסים למנגנון הפנימי של הצופן כאילו היה הצפנה מרובה ומנסים לנחש את ערכי הביניים באמצעות שתי התקפות היפגשות באמצע. המפתחות <math>k_f</math> ו-<math>k_b</math> הם תת-מפתחות של <math>E_f</math> ו-<math>E_b</math> בהתאמה. (כאן <math>f</math> ו-<math>b</math> הם קיצור של קדימה ואחורה). לצורך הפשטות ההתקפה המתוארת כאן אינה יעילה אלא נועדה לצורך ההסבר.

===התקפת היפגשות באמצע דו-ממדית===
נניח שמנסים לנחש תחילה מצב ביניים פנימי של הצופן המסומן ב-<math>g</math> באמצעות שתי התקפות MITM על תת-הצפנים שאורך הבלוק שלהם מתחלק ב-<math>g</math>. היא נקראת התקפת נפגש באמצע דו-ממדית המסומנת בקיצור 2D-MITM. מניחים שהצופן מורכב משני שלבים, בשלב הראשון הבלוק מוצפן עם זוג תת-המפתחות <math>k_{f_1},k_{f_2}</math> הנגזרים מהמפתח הראשי ובשלב השני הבלוק מוצפן שוב עם תת-המפתחות <math>k_{b_1},k_{b_2}</math> שגם הם נגזרים מהמפתח הראשי. למען הפשטות נניח שתת-המפתחות האמורים אינם חופפים. כלומר אינם משתפים ביניהם סיביות זהות של מפתח המאסטר <math>k</math>. ההתקפה מתנהלת כדלהלן.

#מחשבים את <math>v_1=E_{f_1}(k_{f_1},p)</math> עבור כל מפתח אפשרי <math>k_{f_1}</math> ומאחסנים בטבלה <math>T_1</math> הממויינת לפי <math>v_1</math>.
#מחשבים את <math>v_2'=E_{b_2}^{-1}(k_{b_2},c)</math> עבור כל מפתח אפשרי <math>k_{b_2}</math> ומאחסנים בטבלה <math>T_2'</math> הממויינת לפי <math>v_2'</math>.
#עבור כל ניחוש אפשרי של ערך הביניים <math>g</math> מבצעים:
##(א) <math>v_1'=E_{b_1}^{-1}(k_{b_1},g)</math> עבור כל מפתח אפשרי <math>k_{b_1}</math> ומאחסנים בטבלה <math>T_1'</math> הממויינת לפי <math>v_1'</math>.
##(ב) מחשבים את <math>v_2=E_{f_2}(k_{f_2},g)</math> עבור כל <math>k_{f_2}</math> אפשרי ומאחסנים בטבלה <math>T_2</math> הממויינת לפי <math>v_2</math>.
##(ג) כל הזוגות התואמים <math>(k_{f_1},k_{b_1})</math> עבור <math>v_1=v_1'</math> יחד עם כל הזוגות התואמים <math>(k_{f_2},k_{b_2})</math> עבור <math>v_2=v_2'</math> מהווים יחדיו מועמדים למפתח ששימש להצפנה הכוללת. כדי להגביר את הסיכויים למצוא את המפתחות הנכונים מתוך הרשימה בודקים זוגות נוספים של טקסט גלוי/טקסט מוצפן בכוח גס ישיר על הרשימה. אם מפתח אחד עבר את כל הבדיקות זהו המפתח הנכון בהסתברות גבוהה.

היות שאין צורך לחשב מחדש את <math>E_{f_1}</math> ו-<math>E_{b_2}^{-1}</math> עבור מצבים פנימיים שונים <math>g</math> סיבוכיות הזמן הכוללת של ההתקפה היא:
:<math>2^{|k_{f_1}|}+2^{|k_{b_2}|}+2^{|g|}\cdot (2^{|k_{b_1}|}+ 2^{|k_{f_2}|})</math>
עבור כל מצב ביניים <math>g</math> שמנחשים, שלב התקפת MITM הראשונה במעבר מ-<math>p</math> ל-<math>g</math> מצמצם את טווח המפתח ל-<math>2^{|k|-|v_1|}</math> ושלב ההתקפה MITM השנייה במעבר מ-<math>g</math> ל-<math>c</math> מצמצם עוד את טווח החיפוש של המפתח ל-<math>2^{|k|-|v_1|-v_2|}</math> לכן בסך הכול מספר סיביות טווח החיפוש מצטמצם ל-<math>2^{|g|}\cdot(2^{|k|-|v_1|-|v_2|}) = 2^{|k|+|g|-|v_1|-|v_2|}</math>. בהנחה ש-<math>g</math> שווה באורכו ל-<math>n</math> מתקבלת סיבוכיות של <math>2^{|k|-n}</math>. הסיבוכיות הכוללת של שלב הכוח גס קרובה לזו. סיבוכיות הזיכרון של ההתקפה היא <math>2^{|k_{f_1}|}+2^{|k_{b_1}|}+2^{|k_{f_2}|}+2^{|k_{b_2}|}</math> כי צריך לאחסן את כל ארבע הטבלאות בזיכרון. במקרה הכללי תת-המפתחות אינם נפרדים לגמרי אלא בדרך כלל חולקים ביניהם סיביות זהות ממפתח המאסטר כך שההתקפה המתוארת אינה ישימה ישירות. יש כמה דרכים לפתור את הבעיה, אפשר להתייחס לכל סיבית של תת-מפתח כאל משתנה נפרד או לבצע טרנספורמציה ליניארית לפני שמחפשים התאמה בין תת-מפתחות.

===התקפת נפגש באמצע רב-ממדית===
אפשר לנסות לנחש מצבי ביניים נוספים של הצופן ולחלק את הצופן למקטעים קטנים יותר. התקפת היפגשות באמצע רב ממדית הנקראת MD-MITM או <math>(i+1)\text{D-MITM}</math> היא הכללה של הטכניקה המתוארת. הצעדים הדרושים באופן כללי להתקפה הכללית הם:
# בונים טבלה <math>T_1</math> עבור המפתחות <math>k_{f_1}</math> על ידי חישוב <math>v_1=E_{f_1}(k_{f_1},p)</math>.
# בונים טבלה <math>T_{i+1}'</math> עבור <math>k_{b_{i+1}}</math> על ידי חישוב <math>v_{i+1}'=E_{b_{i+1}}^{-1}(k_{b_{i+1}},c)</math>.
# עבור כל ניחוש של <math>g_1</math> מבצעים:
## בונים טבלה <math>T_1'</math> על ידי <math>v_1'=E_{b_1}^{-1}(k_{b_1},g_1)</math> שבה מחפשים התאמות עם <math>T_1</math>.
## בונים טבלה <math>T_2</math> על ידי <math>v_2=E_{f_2}(k_{f_2},g_1)</math>.
## עבור כל ניחוש של <math>g_2</math> מבצעים:
### בונים טבלה <math>T_2'</math> המכילה את <math>v_2'=E_{b_2}^{-1}(k_{b_2},g_2)</math> להתאמה עם הטבלה <math>T_2</math>.
### עבור כל <math>g_i</math> מבצעים:
#### בונים טבלה <math>T_i'</math> המכילה את <math>v_i'=E_{b_i}^{-1}(k_{b_i},g_i)</math> להתאמה עם <math>T_i</math>.
#### מחשבים את <math>v_{i+1}=E_{f_{i+1}}(k_{f_{i+1}}, g_i)</math> ובונים טבלה <math>T_{i+1}</math> להתאמה עם הטבלה <math>T_{i+1}'</math>.
#### מבצעים בדיקה בכוח גס על כל שילוב אפשרי של הזוגות <math>(T_1,T_1'),(T_2,T_2'),\cdots,(T_{i+1},T_{i+1}')</math> ומחזירים את כל המקרים שבהם מתקיימת התאמה כניחושים אפשריים של המפתח הסודי.

סיבוכיות ההתקפה במקרה הכללי של MD-MITM היא:
:<math>2^{|k_{f_1}|}+2^{|k_{b_{i+1}}|}+2^n\cdot (2^{|k_{b_1}|}+2^{|k_{f_2}|})+2^{2n}\cdot (2^{|k_{b_2}|}+2^{|k_{f_3}|})+\cdots +2^{i\cdot n}\cdot (2^{|k_{b_i}|}+2^{|k_{f_{i+1}}|})</math>

==ראו גם==
* כוח גס
* התקפת איזון זמן/זיכרון
* קריפטואנליזה

==הערות שוליים==

קטגוריה:קריפטוגרפיה
קטגוריה:תקיפות קריפטוגרפיות