התקפת קורלציה

בקריפטואנליזה, התקפת קורלציה (correlation attack) היא התקפה קריפטוגרפית נגד צופן זרם שהוצעה לראשונה על ידי תומאס זיגנתאלר (Thomas Siegenthaler) ב-1985. היא המתאימה לכל צופן שהמחולל הפנימי שלו מורכב מאוגרי זיזה ממושבים (LFSR). זוהי התקפת כוח גס סטטיסטית בסגנון הפרד ומשול המתמקדת בשחזור המצב הראשוני (initial state) של האוגרים. ההתקפה בדרך כלל מתבצעת לפי מודל התקפת גלוי-ידוע, אם קיים בידי התוקף מידע מוקדם לגבי חלק מסיביות זרם המפתח. אך אפשרית גם אם לא קיים כל מידע מוקדם, בתנאי שקיימת יתירות כלשהי במסר הגלוי שהוצפן.

ההתקפה המקורית כפי שהוצגה על ידי זיגנתאלר ישימה בעיקר כנגד צופן זרם בסגנון 'מחולל משולב' הפועל באופן כזה שהסיבית הבאה של זרם המפתח היא תוצאה של פונקציית שילוב (combining function) המקבלת כקלט מספר סיביות מתוך פוזיציות מסוימות של <math>n</math> אוגרי LFSR שאורכיהם שונים <math>L_1,L_2,...,L_n</math> בהתאמה, משלבת אותן באופן לא ליניארי כלשהו ומחזירה סיבית אחת. אם מצליחה, ההתקפה מאפשרת שחזור מלא של שלב האתחול של המחולל בסיבוכיות של <math>\textstyle \sum_{i=1}^n(2^{L_i}-1)</math> ניסיונות בניגוד לסיבוכיות <math>\textstyle \prod_{i=1}^n(2^{L_i}-1)</math> הצפויה בחיפוש ממצה.

באופן כללי התקפת קורלציה אפשרית ברגע שמוצאים מתאם כלשהו בין זרם המפתח <math>s</math> והרצף <math>u</math> של אוטומט סופי שהמצב ההתחלתי שלו תלוי בחלק מסיביות זרם המפתח. את סיביות המפתח אפשר לחשוף על ידי שחזור המצב ההתחלתי של <math>u</math>, כל עוד אפשר לזהות 'תלות סטטיסטית' אשר יכולה לשמש סימן שהרצף עשוי להיות חלק מפלט המחולל. חיפוש ממצה בר ביצוע על ידי שבוחרים שוב ושוב רצפים אפשריים כלשהם ובודקים אם מידת הקורלציה בין הרצף <math>u</math> לבין <math>s</math> גבוהה מערך סף מסוים שהוא פונקציה של טווח השגיאה האפשרי. אם נמצא רצף מתאים אפשר לשחזר את המצב ההתחלתי של המחולל ומכאן לשחזר כל קטע מזרם המפתח. בהתאמות קלות ההתקפה ישימה כנגד סוגים רבים של צופן זרם כמו צופן זרם שבנוי בסגנון 'מסנן' (filter generator).

==רמת מתאם==
התקפת קורלציה מנצלת את העובדה שקיימת תלות סטטיסטית כלשהי בין זרם המפתח הנוצר מהמחולל לבין פלט אוגר יחיד כלשהו הכלול במחולל. ברמה של סיביות תלות כזו מתרחשת רק אם יש מתאם בין פלט פונקציית השילוב <math>f</math> של המחולל לאחד מהקלטים <math>x_i</math> שלה, שהוא פלט אחד האוגרים. כלומר עבור כל <math>x_i</math> ההסתברות
<math display="block">p_i=\Pr[f(x_1,...,x_n)\ne x_i]\ne 1/2</math> 

עבור <math>1\le i\le n</math> (כל האוגרים הכלולים במחולל). או לחלופין אם זרם המפתח נקרא <math>s</math> אזי אומרים שקיים מתאם בין רצף חלקי באורך <math>t</math> של זרם המפתח המסומן <math>(s_t)_{t\ge0}</math> לבין רצף חלקי <math>(u_t)_{t\ge 0}</math> הנוצר מאחד האוגרים שבמחולל. רמת המתאם בין שני הרצפים <math>s,u</math> נמדדת על ידי פונקציה המחושבת על <math>N</math> סיביות
<math display="block">\sum_{t=0}^{N-1}(-1)^{s_t+u_t\text{ mod }2}</math>
והיא משתנה מקרי ממשי בעל התפלגות בינומית עם תוחלת <math>N(1-2p_i)</math> ושונות <math>4Np_i(1-p_i)</math> (כאשר <math>N</math> גדול). אפשר להשוות את ההתפלגות לרמת המתאם הצפויה בין הרצף <math>s</math> לבין רצף אקראי <math>(r_t)_{t\ge 0}</math> בלתי תלוי. כאשר הרצף הוא אקראי בלתי תלוי ב-<math>s</math> ההתפלגות בינומית עם תוחלת צפויה אפס ועם שונות <math>N</math>. רמת המתאם היא כלי יעיל המאפשר לתוקף להפעיל התקפת כוח גס ישירה בחיפוש אחר המצב הראשוני הנכון של אוגר נתון. ניתן להבחין בין מצב התחלתי נכון למצב התחלתי שגוי, משום שמצפים מערך התחלתי שגוי שיהיה בלתי תלוי סטטיסטית בזרם המפתח, כל תלות סטטיסטית שתמצא תאשש שהמצב ההתחלתי אכן נכון. בפועל ערך כלשהו יתקבל כמצב התחלתי נכון אם רמת המתאם עולה על סף מסוים המחושב בהתבסס על ההסתברות של שתי שגיאות אפשריות, האחת נקראת false alarm והיא מסומנת <math>P_f=2^{L_i}</math> והשנייה נקראת הסתברות לאי-הבחנה <math>P_n=1.3\times 10^{-3}</math>. האורך <math>N</math> שהוא כמות הסיביות המינימלית הדרושה להתקפה, נקבע לפי ההסתברות <math>p_i</math> לעיל והאורכים של האוגרים <math>L_i</math> בהתאמה. ההתקפה דורשת בערך:
<math display="block">N\simeq \left(\frac{\sqrt{\text{ln}(2^{L_i-1})}+3\sqrt{2p_i(1-p_i)}}{\sqrt{2}(p_i-0.5)}\right)^2</math>
סיביות מפתח. כך שבממוצע מתבצעים <math>2^{L_i-1}</math> ניסיונות. בכל מקרה ההתקפה אפשרית רק אם ההסתברות <math>p_i</math> שונה מחצי. לסיכום ההתקפה מתוארת בפסאודו קוד הבא:

===פסאודו קוד===
קלט: קטע מזרם המפתח <math>s_0,s_1,...,s_{N-1}</math> באורך <math>N</math> סיביות. כאשר ההסתברות <math>p_i</math> לעיל עבור מחרוזת זו לא שווה לחצי. 

פלט: המחרוזת <math>u_0,u_1,...,u_{L_i-1}</math> המייצגת את המצב ההתחלתי של האוגר <math>i</math>.

#עבור כל מצב התחלתי אפשרי <math>u</math>, מפעילים את המחולל ומייצרים את <math>N</math> הסיביות הבאות של האוגר <math>i</math> ומחשבים את רמת המתאם בין התוצאה לבין מחרוזת הקלט <math>s</math>:
#:<math display="block">\alpha=\sum_{i=0}^{N-1}(-1)^{s_t+u_t\text{ mod }2} </math>
#אם <math>\alpha</math> קרוב לתוחלת <math>N(1-2p_i)</math> המחרוזת <math>u</math> מתקבלת כמצב התחלתי אפשרי, אם לא ממשיכים לנסות עם מחרוזת אחרת.

==חסינות מתאם==
כדי למנוע התקפת קורלציה צריך לבחור פונקציית שילוב עם תכונה שנקראת 'חסינת-מתאם' (correlation immunity) מ'סדר ראשון' (להלן), כלומר שאין מתאם כלשהו בין פלט הפונקציה לאף אחד מהקלטים שלה. כך שהמפתח בלתי תלוי סטטיסטית בפלט של אוגר כלשהו מהאוגרים הכלולים במחולל וכן כל קלט יכול להיות אפשרי במידה שווה. באופן כללי יותר, התקפת קורלציה סימולטנית על <math>k</math> אוגרים מתוך <math>n</math> צריכה לבדוק את רמת המתאם בין זרם המפתח <math>s</math> לבין הרצף <math>u</math> שהוא קומבינציה של <math>k</math> האוגרים באמצעות פונקציה בוליאנית <math>g</math> של <math>k</math> משתנים. היות שמתקיים
<math display="block">\Pr[s_t\ne u_t]=\Pr[f(x_1,...,x_n)\ne g(x_{i_1},...,x_{i_k})]=p_g</math> 
כאשר <math>f</math> מייצגת את כל האוגרים ואילו <math>g</math> את <math>k</math> האוגרים הנבדקים לעומתם. ההתקפה יכולה להצליח רק אם <math>p_g\ne 1/2</math>. מספר האוגרים המינימלי הדרוש כדי שהתקפה סימולטנית כזו תיתכן היא <math>m+1</math> כאשר <math>m</math> הוא הסדר הגבוה ביותר של חסינות המתאם של הפונקציה הבוליאנית. פונקציה בוליאנית של <math>m+1</math> משתנים המספקת את הקירוב הטוב ביותר של <math>f</math> היא פונקציה אפינית <math>\textstyle\sum_{j=1}^{m+1}x_{i_j}+\epsilon</math>. התקפת קורלציה היעילה ביותר היא כזו שמוצאת קורלציה בין <math>s</math> לבין המחרוזת <math>u</math> אותה מחשבים על ידי חיבור הפלט של תת-קבוצה <math>i</math> של אוגרים <math>i_1,i_2,...,i_{m+1}</math> והיא מתאימה להסתברות:
<math display="block">\Pr[s_t\ne u_t]=\frac{1}{2}-\frac{1}{2^{n+1}}|\hat f(t)|</math>
כאשר <math>n</math> הוא מספר המשתנים של פונקציית השילוב, <math>t</math> הוא וקטור של <math>n</math> סיביות שמרכיב ה-<math>i</math> שלו הוא '1' רק אם <math>i\in \{i_1,i_2,...,i_{m+1}\}</math> והפונקציה <math>\hat f</math> מייצגת טרנספורמציית וואלש של <math>f</math> (נקראת גם התמרת פורייה בדידה) אותה מחשבים על ידי <math>\textstyle\sum_{x\in f}(-1)^{f(x)\oplus x\cdot u}</math>. המסקנה שכדי להעלות את סיבוכיות התקפת הקורלציה רצוי שפונקציית השילוב של המחולל תהיה מסדר גבוה של 'חסינות-מתאם' וכן אי-ליניאריות גבוהה. או במילים אחרות שהפונקציה <math>\hat f</math> תהיה נמוכה מעל כל הווקטורים <math>t</math> עם משקל בינארי נמוך.

===סדר חסינות===
סדר <math>m</math> של חסינות מתאם פירושו 'מקסימום קורלציה' בין פלט פונקציה בוליאנית <math>f</math> עם <math>n</math> משתנים לבין תת-קבוצה שלה <math>i</math> של <math>m</math> משתנים. מקסימום קורלציה מחושבת על ידי <math>\textstyle C_f(i)=2^{-n}\text{max}_{g\in\mathcal{F}_i}\sum_{x\in F_2^n}(-1)^{f(x)\oplus g(x)}</math> כאשר <math>\mathcal{F}_i</math> היא פונקציה בוליאנית של <math>n</math> המשתנים <math>x_j</math> כאשר <math>j\in i</math>. הסימן <math>F_2^n</math> פירושו קבוצת כל הווקטורים הבינאריים <math>(x_1,...,x_n)</math> באורך <math>n</math> מעל השדה <math>F_2</math>.

==לקריאה נוספת==
<div class="mw-content-ltr">
* Bruce Schneier. Applied Cryptography: Protocols, Algorithms and Source Code in C, Second Edition. John Wiley & Sons, Inc. 1996. . Page 382 of section 16.4: Stream Ciphers Using LFSRs.
</div>
* [http://www.springer.com/computer/security+and+cryptology/book/978-1-4419-5905-8 אנציקלופדיה לקריפטוגרפיה ואבטחת מידע]

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

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