קריפטואנליזה ליניארית

בקריפטואנליזה, קריפטואנליזה לִינֵאָרִית (באנגלית: Linear cryptanalysis) היא צורה כללית של קריפטואנליזה המבוססת על ניתוח קירובים ליניאריים ואפיניים הכוללים שילוב סיביות מקלט פונקציית הצפנה סימטרית, מהפלט שלה וממפתח ההצפנה.

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

==היסטוריה==
הקריפטואנליזה הליניארית מיוחסת למיצורו מצואי, שפרסם אותה לראשונה ב-1992 יחד עם ימאגישי לפיצוח הצופן FEAL וכן נוסתה נגד צופן DES והייתה להתקפה הפומבית הראשונה על הצופן, אך היא דורשת מספר עצום של בלוקים ידועים (<math>2^{43}</math> זוגות במקרה של DES). קריפטואנליזה ליניארית מתאימה במיוחד נגד צופן בלוקים ואף נגד צופן זרם. ההתקפה הליניארית יחד עם הדיפרנציאלית הן שתי ההתקפות הקריפטוגרפיות המפורסמות והמוצלחות ביותר נגד צפני בלוקים מודרניים והביאו לשבירתם המוחלטת של לא מעט צפנים. כיום ההתקפה הליניארית משמשת כאבן בוחן וכלי שימושי לבדיקת ביטחון כל צופן בלוקים מודרני. כיום מצפים מכל צופן שיוכיח עמידות נגד התקפה זו אפילו אם היא תאורטית ביסודה אם היא יעילה מכוח גס באופן ניכר. למרות האמור, למרבה ההפתעה אפילו לאחר שנים של קריפטואנליזה, ההתקפה הליניארית נגד צופן DES התגלתה כלא יעילה במיוחד באופן מעשי. ועד היום DES שרד את שתי ההתקפות המתוארות, הליניארית והדיפרנציאלית כאחד.

==וריאציות==
במשך השנים פותחו מספר וריאציות של הקריפטואנליזה הליניארית ביניהן:
*קריפטואנליזת קירובים ליניאריים מרובים.
*קריפטואנליזת מתאם אפס.
*קריפטואנליזת חציצה (Partitioning).


==תיאור כללי==
הקריפטואנליזה הליניארית מנסה לנצל קיום מופעים בהסתברות גבוהה של משוואות ליניאריות המערבות סיביות מבלוק הקלט, בלוק הפלט (ליתר דיוק מפלט הסבב האחד לפני אחרון של הצופן) ומפתח ההצפנה. הרעיון הבסיסי הוא לבצע קירוב של חלק מפעולת הצופן עם משוואה ליניארית מעל חיבור XOR (חיבור מודולו 2). משוואה ליניארית כזו יכולה להיות למשל:
<center>
:<math>\boldsymbol{X_{i_1}\oplus X_{i_2}\oplus ...\oplus X_{i_u}\oplus Y_{j_1}\oplus Y_{j_2}\oplus ...\oplus Y_{j_v} = 0}</math>
</center>

כאשר <math>X_i</math> מייצג את הסיבית במיקום ה-<math>i</math> של בלוק הקלט <math>X=[X_1,X_2,...,X_n]</math> המכיל <math>n</math> סיביות וכן <math>Y_j </math> מייצג את הסיבית במיקום ה-<math>j</math> של בלוק הפלט <math>Y=[Y_1,Y_2,...,Y_n]</math>. המשוואה המתוארת מחברת תת-קבוצה באורך <math>u</math> סיביות של <math>X</math> עם תת-קבוצה באורך <math>v</math> סיביות של <math>Y</math>. המטרה היא למצוא סיביות קלט/פלט שמקיימות את המשוואה האמורה בהסתברות גבוהה באופן משמעותי או בהסתברות נמוכה באופן משמעותי. באופן כללי אסור שלינאריות כזו תתרחש בצופן, אחרת הוא יהיה חלש מאוד כי היא הוכחה לכך שהצופן מכיל אקראיות ירודה. באופן אידיאלי אם ננסה להזין <math>v+u</math> סיביות קלט/פלט שונות במשוואה המתוארת ההסתברות שהמשוואה תתקיים צריכה להיות <math>1/2</math>. ככל שהסטייה או הנטאי בתוצאות גדולה מחצי כך קל יותר למנתח הצופן לשבור אותו. ההטיה בהקשר זה נקראת הטיה ליניארית הסתברותית אותה מסמנים ב-<math>p_L</math>. ככל ששיעור ההטיה ההסתברותית <math>|p_L-1/2|</math> גדלה משמעותית כך קל יותר ליישם את ההתקפה הליניארית על הצופן.

ישנן מגוון דרכים לביצוע הקריפטואנליזה הליניארית. לצורך התיאור כאן נתייחס למה שמיצורו מצואי מכנה במאמר שלו אלגוריתם 1. למרות שבמשוואה הליניארית לעיל לא מופיעות סיביות ממפתח ההצפנה המותקף, האגף הימני במשוואה "0" כולל באופן עקיף סיביות מהמפתח שמיקומן ידוע אך לא ערכן. אם סכום הסיביות מהמפתח המשתתפות במשוואה הוא אפס, ההטיה תהיה עם סימן (פלוס או מינוס) זהה אילו המשוואה כללה סיביות מהמפתח (אם ההסתברות <math>p_L</math> התקבלה). אם <math>p_L=1</math> פירושו של דבר שהמשוואה המתוארת מייצגת את התנהגות הצופן בשלמות ולכן הצופן כנראה מכיל פגם חמור. אם <math>p_L=0</math> פירושו של דבר שהמשוואה המתוארת מייצגת פונקציה אפינית של הצופן, שגם זו אינדיקציה לתקלה חמורה. במקרה של XOR פונקציה אפינית היא בעצם המשלים של הפונקציה הליניארית, כך שבשני המקרים הצופן יהיה חשוף להתקפה ליניארית.

===דוגמה לקריפטואנליזה ליניארית===
לצורך המחשת הקריפטואנליזה הליניארית, נניח שנתון צופן בלוקים פשוט המורכב מרשת החלפה-תמורה. הוא מקבל בלוק קלט באורך 16 סיבות (שני בתים), מעבד את הבלוק על ידי חזרה ארבע פעמים על פונקציה פנימית הכוללת בדומה ל-AES, שלוש שכבות; החלפה, תמורה וערבוב מפתח, כמתואר בתרשים משמאל. למרות שהצופן פשוט והוא מובא כאן להמחשה בלבד, ההתקפה הליניארית על צופן זה מספקת תובנה די טובה לגבי פעולתה נגד צפנים מודרניים מורכבים יותר.

לצורך הדיון נניח ששלב ההחלפה בצופן הצעצוע האמור כולל ארבע תיבות החלפה המקבלות 4 סיביות ומחזירות 4 סיביות. כל תיבת החלפה אפשר ליישם באמצעות טבלה פשוטה המכילה 16 ערכים באורך 4 סיביות כל אחד. הערך המוחזר הוא בעצם תוכן הכניסה שהקלט מייצג את מספרה. ברוב הצפנים קיימות מספר טבלאות, לצורך הפשטות נניח שקיימת רק תיבה אחת כזו שבה משתמשים ארבע פעמים בכל סבב. להלן הטבלה הלקוחה מצופן DES בייצוג הקסדצימלי:
<center>
{| class="wikitable"
|-
| קלט || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F
|-
| פלט || E || 4 || D || 1 || 2 || F || B || 8 || 3 || A || 6 || C || 5 || 9 || 0 || 7
|}
</center>
לצורך שלב הטרנספוזיציה (תמורה) נתונה הטבלה הבאה. פעולת הטרנספוזיציה ניתנת לתיאור באופן הבא: הפלט בפוזיציה ה-<math>i</math> של תיבת ההחלפה <math>j</math> מנותב לכניסה ה-<math>j</math> של תיבת ההחלפה ה-<math>i</math> (בסבב הבא). ראוי לציין שאין טעם בטרנספוזיציה בסבב האחרון של הצופן כי היא ניתנת להפיכה בקלות.
<center>
{| class="wikitable"
|-
| קלט || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F
|-
| פלט || 0 || 4 || 8 || C || 1 || 5 || 9 || C || 2 || 6 || A || D || 3 || 7 || B || F
|}
</center>
שכבת חיבור המפתח מבצעת חיבור XOR של כל סיביות הפלט עם חלק מהמפתח הסודי הנקרא תת-מפתח. חיבור המפתח בסיום הסבב האחרון מבטיח שלא יהיה אפשרי להתעלם מהסבב האחרון כשמנתחים את הצופן. לצורך הפשטות נניח שתת-המפתחות עבור ארבעת הסבבים הוכנו בנפרד זה מזה. פענוח הוא פשוט חזרה לאחור צעד אחרי צעד במבנה זהה להצפנה, רק יש צורך לוודא שתיבות ההחלפה הן פונקציה חד-חד-ערכית ועל ועל כן הן הפיכות וכן צריך להשתמש במפתחות בסדר הפוך.
שמאל

=== עקרון הערמה===
מציאת משוואה ליניארית של הצופן מסתמכת על צירוף משוואות ליניאריות של חלקים שונים של הצופן למשוואה ליניארית אחת. החלק הקשה הוא למצוא ולצרף משוואות ליניאריות מתאימות. לצורך ההדגמה נתייחס לצופן הצעצוע המתואר לעיל. אם נתונים שני משתנים מקריים <math>X_1</math> ו-<math>X_2</math>, אז <math>X_1\oplus X_2=0</math> הוא ביטוי ליניארי השקול ל-<math>X_1=X_2</math>. אם <math>X_1\oplus X_2=1</math> זהו ביטוי אפיני השקול ל-<math>X_1\ne X_2</math>. נניח שההתפלגות הסטטיסטית נתונה על ידי:
:<math>\Pr[X_1=i]=
\begin{cases}
p_1, & i=0 \\
1-p_1, & i=1
\end{cases}</math>
וכן
:<math>\Pr[X_2=i]=
\begin{cases}
p_2, & i=0 \\
1-p_2, & i=1
\end{cases}</math>

אם שני המשתנים המקריים בלתי תלויים אפשר לשלב את שניהם ביחד:
:<math>\Pr[X_1=i,X_2=j]=
\begin{cases}
p_1p_2, & i=0,j=0 \\
p_1(1-p_2), & i=0,j=1 \\
(1-p_1)p_2, & i=1,j=0 \\
(1-p_1)(1-p_2), & i=1,j=1
\end{cases}</math>

וכן אפשר להוכיח ש-
{| dir="ltr"
|-
|
:<math>\Pr[X_1\oplus X_2=0]\ =\Pr[X_1=X_2]</math>
:<math>\, \, \, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\Pr[X_1=0,X_2=0]+\Pr[X_1=1,X_2=1]</math>
:<math>\, \, \, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =p_1p_2+(1-p_1)(1-p_2)</math>.
|}

דרך אחרת להציג זאת, יהיו <math>p_1=1/2+\varepsilon_1</math> וכן <math>p_2=1/2+\varepsilon_2</math> כאשר <math>\varepsilon_1</math> ו-<math>\varepsilon_2</math> הן שיעור ההטיה ההסתברותיות מחצי כך שמתקיים <math>1/2\le\varepsilon_1</math> וכן <math>\varepsilon_2\le +1/2</math>. מזה נובע ש-<math>\Pr[X_1\oplus X_2=0]=1/2+2\varepsilon_1\varepsilon_2</math>. ההטיה של <math>X_1\oplus X_2=0</math> היא <math>\varepsilon_{1,2}=2\varepsilon_1\varepsilon_2</math>. אפשר להרחיב את האמור ליותר משתנים מקריים <math>X_1</math> עד <math>X_n</math> עם ההסתברויות <math>p_1=1/2+\varepsilon_1</math> עד <math>p_n=1/2+\varepsilon_n</math>. ההסתברות ש-<math>X_1\oplus X_2\oplus ...\oplus X_n=0</math> תתקיים ניתנת לחישוב באמצעות למת הערמה (Piling-Up Lemma) של מיצורו מצואי, בהנחה שכל המשתנים בלתי תלויים:

נתונים <math>n</math> משתנים מקריים בלתי תלויים: <math>X_1,X_2,...,X_n</math> מתקיים
<center>
:<math>\Pr[X_1\oplus X_2\oplus ...\oplus X_n=0]=1/2+2^{n-1}\prod_{i=1}^n\varepsilon_i</math>.
</center>
או לחלופין
<center>
:<math>\varepsilon_{1,2,...,n}=2^{n-1}\prod_{i=1}^n\varepsilon_i</math>
</center>

כאשר <math>\varepsilon_{1,2,...,n}</math> מייצג את ההטיה של <math>X_1\oplus X_2\oplus ...\oplus X_n=0</math>. יש לשים לב שאם <math>p_i=0</math> או <math>p_i=1</math> אז <math>\Pr[X_1\oplus X_2\oplus ...\oplus X_n=0]=0</math> או 1 בהתאם. אם רק <math>p_i</math> אחד שווה חצי אז <math>\Pr[X_1\oplus X_2\oplus ...\oplus X_n=0]=1/2</math>.

כאשר מרכיבים משוואה ליניארית של הצופן המשתנים <math>X_i</math> הם בעצם קירוב ליניארי של תיבות ההחלפה. למשל, אם נתונים ארבעה משתנים מקריים <math>X_1,X_2,X_3</math> ו-<math>X_4</math> ויהיו <math>\Pr[X_1\oplus X_2=0]-1/2+\varepsilon_{1,2}</math> וכן <math>\Pr[X_2\oplus X_3=0]=1/2+\varepsilon_{2,3}</math>, הסכום <math>X_1\oplus X_3</math> המתקבל על ידי חיבור <math>X_1\oplus X_2</math> עם <math>X_2\oplus X_3</math> אז מתקיים:
:<math>\Pr[X_1\oplus X_3=0]=\Pr[(X_1\oplus X_2)\oplus (X_2\oplus X_3)=0]</math>.
בדרך זו אפשר לשלב משוואות ליניאריות כדי לקבל משוואה ליניארית חדשה, ואם מניחים שהמשתנים בלתי תלויים אז אפשר להשתמש בלמת הערמה באופן הזה:
:<math>\Pr[X_1\oplus X_3=0]=1/2+2\varepsilon_{1,2}\varepsilon_{2,3}</math>
כתוצאה מכך <math>\varepsilon_{1,3}=2\varepsilon_{1,2}\varepsilon_{2,3}</math>. אפשר לראות שהביטויים <math>X_1\oplus X_2=0</math> וכן <math>X_2\oplus X_3=0</math> מקבילים לקירובים הליניאריים של שתי תיבות ההחלפה בהתאמה ואילו <math>X_1\oplus X_3=0</math> מקביל לקירוב הליניארי של שתיהן יחד. כמובן שבניתוח אמיתי של הצופן מעורבים יותר תיבות החלפה ויותר משתנים מקריים בהתאם.

===תיבות ההחלפה===
במרבית הצפנים כמו DES ו-AES, כל הפעולות למעט תיבות ההחלפה הן פעולות ליניאריות ולכן מספיק לייצג את פעולות תיבות ההחלפה כמשוואה ליניארית כדי לפצח את הצופן. בהינתן תיבת החלפה כמו בדוגמה לעיל, המקבלת 4 סיביות <math>X=[X_1X_2X_3X_4]</math> ומחזירה ארבע סיביות <math>Y=[Y_1Y_2Y_3Y_4]</math>. קל יותר לגלות קירובים ליניאריים על ידי חישוב ההטיה של כל תיבה בנפרד. למשל אם לוקחים את הביטוי <math>X_2\oplus X_3\oplus Y_1\oplus Y_3\oplus Y_4=0</math> או לחלופין <math>X_2\oplus X_3=Y_1\oplus Y_3\oplus Y_4</math>, מנסים את כל 16 האפשרויות של <math>X</math> ובודקים את התוצאות <math>Y</math> המתקבלות מתיבת ההחלפה, מגלים שב-12 מתוך 16 המקרים המשוואה האמורה מתקיימת, כלומר בהסתברות של <math>12/16-1/2=1/4</math>. דוגמה אחרת, עם הביטוי <math>X_1\oplus X_4=Y_2</math> מתקבלת הטיה של אפס וכן עם המשוואה <math>X_3\oplus X_4=Y_1\oplus Y_4</math> ההסתברות היא <math>2/16-1/2=-3/8</math> שזהו קירוב אפיני (בגלל סימן המינוס). היות שההתקפה הליניארית מסתמכת על שיעור ההטיה אין חשיבות לסימן וההתקפה תצליח במידה שווה במקרה של קירוב ליניארי או אפיני (מלמעלה או מלמטה). את כל 16 האפשרויות של הצירופים הליניאריים של כל המשוואות האפשריות, אפשר לסכם בטבלה. על בסיס טבלה הזו מגלים את כל הקירובים הליניאריים/אפיניים של תיבת ההחלפה ומסכמים אותם בטבלה אחרת הנקראת טבלת קירוב ליניארי, לדוגמה כך נראית הטבלה עבור תיבת ההחלפה שנבחרה לצורך הדוגמה:

{| class="wikitable"
|-
! !! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8 !! 9 !! A !! B !! C !! D !! E !! F
|-
| 0 || +8 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0
|-
| 1 || 0 || 0 || -2 || -2 || 0 || 0 || -2 || +6 || +2 || +2 || 0 || 0 || +2 || +2 || 0 || 0
|-
| 2 || 0 || 0 || -2 || -2 || 0 || 0 || -2 || -2 || 0 || 0 || +2 || +2 || 0 || 0 || -6 || +2
|-
| 3 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || +2 || -6 || -2 || -2 || +2 || +2 || -2 || -2
|-
| 4 || 0 || +2 || 0 || -2 || -2 || -4 || -2 || 0 || 0 || -2 || 0 || +2 || +2 || -4 || +2 || 0
|-
| 5 || 0 || -2 || -2 || 0 || -2 || 0 || +4 || +2 || -2 || 0 || -4 || +2 || 0 || -2 || -2 || 0
|-
| 6 || 0 || +2 || -2 || +4 || +2 || 0 || 0 || +2 || 0 || -2 || +2 || +4 || -2 || 0 || 0 || -2
|-
| 7 || 0 || -2 || 0 || +2 || +2 || -4 || +2 || 0 || -2 || 0 || +2 || 0 || +4 || +2 || 0 || +2
|-
| 8 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || -2 || +2 || +2 || -2 || +2 || -2 || -2 || -6
|-
| 9 || 0 || 0 || -2 || -2 || 0 || 0 || -2 || -2 || -4 || 0 || -2 || +2 || 0 || +4 || +2 || -2
|-
| A || 0 || +4 || -2 || +2 || -4 || 0 || +2 || -2 || +2 || +2 || 0 || 0 || +2 || +2 || 0 || 0
|-
| B || 0 || +4 || 0 || -4 || +4 || 0 || +4 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0
|-
| C || 0 || -2 || +4 || -2 || -2 || 0 || +2 || 0 || +2 || 0 || +2 || +4 || 0 || +2 || 0 || -2
|-
| D || 0 || +2 || +2 || 0 || -2 || +4 || 0 || +2 || -4 || -2 || +2 || 0 || +2 || 0 || 0 || +2
|-
| E || 0 || +2 || +2 || 0 || -2 || -4 || 0 || +2 || -2 || 0 || 0 || -2 || -4 || +2 || -2 || 0
|-
| F || 0 || -2 || -4 || -2 || -2 || 0 || +2 || 0 || 0 || -2 || +4 || -2 || -2 || 0 || +2 || 0
|}

כל כניסה בטבלה מייצגת בבסיס הקסדצימלי, את מספר הפעמים שנמצאה התאמה בין המשוואה הליניארית של קלט תיבת ההחלפה לבין סכום סיביות הפלט שלה פחות 8. לכן אם מחלקים את הערך בכניסה כלשהי ב-16 מתקבלת ההטיה ההסתברותית של הצירוף הליניארי המתאים. הערך של אינדקס כל כניסה מגדיר את המשתנים המקריים הנכללים במשוואה בצורה של צירוף ליניארי מהצורה <math>a_1\cdot X_1\oplus a_2\cdot X_2\oplus a_3\cdot X_3\oplus a_4\cdot X_4</math> כאשר <math>a_i\in\{0,1\}</math> והסימן <math>\cdot</math> מייצגת פעולת AND. לכן הערך בבסיס הקסדצימלי הוא <math>a_1a_2a_3a_4</math> כאשר <math>a_1</math> הוא הסיבית המשמעותית ביותר. מזה אפשר לראות שההטיה של המשוואה הליניארית <math>X_3\oplus X_4=Y_1\oplus Y_4</math> (בשורה הרביעית בעמודה העשירית) היא <math>-6/16=-3/8</math> וההסתברות שהמשוואה הליניארית תתקיים היא <math>1/2-3/8=1/8</math>. מהתבוננות בטבלה אפשר לשים לב שההסתברות שכל סכום של סיביות פלט שווה לערך שאין בו סיביות מהקלט הוא בדיוק חצי, זאת בגלל שתיבת ההחלפה היא פונקציה חד ערכית ועל וכל צירוף ליניארי מחייב שיהיה מספר שווה של סיביות אפס ואחד. באותה מידה ההסתברות של כל צירוף ליניארי שאין בו סיביות פלט היא בדיוק <math>+1/2 </math>(בטבלה היא <math>+8</math>), לכן השורה העליונה בטבלה כולה מאופסת למעט בכניסה השמאלית ביותר וכן לגבי העמודה הראשונה.

===קירוב ליניארי של כל הצופן===
בהינתן הקירובים הלנאריים של כל תיבות ההחלפה של הצופן, קיים מספיק מידע כדי לחשב את הקירוב הליניארי של הצופן בשלמותו. את זה אפשר לבצע על ידי צירוף מספר קירובים מתאימים מתיבות ההחלפה. עם מידע זה אפשר לחלץ סיביות מהמפתח הסודי ששימש בסבב האחרון של הצופן. לדוגמה, בתרשים משמאל מתואר קירוב לנארי של צופן הצעצוע להמחשה בתיבות <math>S_{12}, S_{22}, S_{32}</math> ו-<math>S_{34}</math> כאשר הספרה הראשונה באינדקס התיבה מציינת את מספר הסבב ואילו השנייה את מספר התיבה (שזה התיבה השנייה בסבב הראשון, השנייה בסבב השני והתיבות השנייה והרביעית בסבב השלישי). יש לשים לב שהקירוב האמור אינו כולל את כל הצופן אלא רק שלושה סבבים ממנו, זה כל מה שדרוש להתקפה. לאחר בחינה של התרשים וטבלת הקירובים, מתקבלים הקירובים הבאים:
:<math>S_{12}: X_1\oplus X_3\oplus X_4 = Y_2</math> בהסתברות <math>12/16</math> והטיה <math>+1/4</math>
:<math>S_{22}: X_2 = Y_2\oplus Y_4</math> בהסתברות <math>4/16</math> והטיה <math>-1/4</math>
:<math>S_{32}: X_2 = Y_2\oplus Y_4</math> בהסתברות <math> 4/16</math> והטיה <math>-1/4</math>
<math>:S_{34}: X_2 = Y_2\oplus Y_4</math> בהסתברות <math>4/16</math> והטיה <math>-1/4</math>

יהיו <math>U_i</math> ו-<math>V_i</math> בלוק הקלט ובלוק הפלט בהתאמה של תיבות ההחלפה של הצופן בסבב ה-<math>i</math>. וכן <math>U_{ij}</math> ו-<math>V_{ij}</math> הסיבית ה-<math>j</math> של בלוק הקלט או הפלט בהתאמה, בסבב ה-<math>i</math>. באותו אופן <math>K_i</math> מייצג את המפתח המחובר ב-XOR עם בלוק הנתונים בסבב ה-<math>i</math> כאשר <math>K_5</math> הוא המפתח שמחובר לאחר הסבב הרביעי וכן <math>K_{ij}</math> מתייחס לסיבית במיקום ה-<math>j</math> של המפתח ה-<math>i</math>. לכן בשלב הראשון של הצופן מתקבל: <math>U_1=P\oplus K_1</math>. כאשר <math>P</math> הוא בלוק הקלט הגלוי או המסר המיועד להצפנה, באורך 16 סיביות. על בסיס הקירוב הליניארי של הסבב הראשון של הצופן, המשוואה הליניארית הבאה:
{| dir="ltr"
|-
|
:<math>V_{1,6}\ =\ U_{1,5} \oplus U_{1,7} \oplus U_{1,8}</math>
:<math>\ \ \ \ \ \ \ = (P_5 \oplus K_{1,5}) \oplus (P_7 \oplus K_{1,7}) \oplus (P_8 \oplus K_{1,8})</math>
|}
מתקיימת בהסתברות <math>3/4</math>. וכן עבור הסבב השני, הצירוף הבא
:<math>V_{2,6} \oplus V_{2,8} = U_{2,6}</math>
מתקיים בהסתברות <math>1/4</math>. היות שפלט הסבב הראשון הוא בעצם קלט הסבב השני המחובר עם המפתח המתאים, מתקבל <math>U_{2,6}=V_{1,6}\oplus K_{2,6}</math> לכן אפשר לקבל קירוב ליניארי מהצורה:
:<math>V_{2,6} \oplus V_{2,8} = V_{1,6} \oplus K_{2,6}</math>
בהסתברות 1/4. לפי למת הערמה של מצואי, אם משלבים יחד את הצירופים משני הסבבים הראשונים מתקבלת המשוואה:
:<math>V_{2,6} \oplus V_{2,8} \oplus P_5 \oplus P_7 \oplus P_8 \oplus K_{1,5} \oplus K_{1,7} \oplus K_{1,8} \oplus K_{2,6} = 0</math>
שמתקיימת בהסתברות ש/ל <math>1/2+2(3/4-1/2)(1/4-1/2)=3/8</math> עם הטיה <math>-1/8</math>. למרות שהיא מתבססת על ההנחה שהקירובים הליניאריים של כל סבב בלתי תלויים שהיא הנחה לא מדויקת, בפועל היא עובדת היטב. עבור הסבב השלישי אפשר להבחין ש:
:<math>V_{3,6} \oplus V_{3,8} = U_{3,6}</math> בהסתברות <math>1/4</math> וכן
:<math>V_{3,14} \oplus V_{3,16} = U_{3,14}</math> בהסתברות <math>1/4</math>.
היות שמתקיים <math>U_{3,6} = V_{2,6} \oplus K_{3,6}</math> וכן <math>U_{3,14} = V_{2,8} \oplus K_{3,14}</math> מתקבלת המשוואה הבאה:
:<math>V_{3,6} \oplus V_{3,8} \oplus V_{3,14} \oplus V_{3,16} \oplus V_{2,6} \oplus K_{3,6} \oplus V_{2,8} \oplus K_{3,14} = 0</math>
בהסתברות של <math>1/2+2(1/4-1/2)^2=5/8</math> (עם הטיה <math>-1/8</math>). כעת אפשר לשלב את הצירופים מכל הסבבים (לפי עקרון הערמה) ולקבל את:
:<math>V_{3,6} \oplus V_{3,8} \oplus V_{3,14} \oplus V_{3,16} \oplus P_5 \oplus P_7 \oplus P_8 \oplus K_{1,5} \oplus K_{1,7} \oplus K_{1,8} \oplus K_{2,6} \oplus K_{3,6} \oplus K_{3,14} = 0</math>.

אפשר לפשט את המשוואה. היות שבעצם <math>U_{4,6} = V_{3,6} \oplus K_{4,6}, U_{4,8} = V_{3,14} \oplus K_{4,8}, U_{4,14} = V_{3,8} \oplus K_{4,14}</math> וכן <math>U_{4,16} = V_{3,16} \oplus K_{4,16}</math>, אפשר לשכתב את המשוואה האמורה כך:
<center>
:<math>\textstyle U_{4,6} \oplus U_{4,8} \oplus U_{4,14} \oplus U_{4,16} \oplus P_5 \oplus P_7 \oplus P_8 \oplus \sum_K = 0</math>.
</center>
כאשר <math>\textstyle \sum_K</math> כולל את כל סיביות המפתח המשתתפות (שמיקומן ידוע):
<center>
:<math>\textstyle \sum_K = K_{1,5} \oplus K_{1,7} \oplus K_{1,8} \oplus K_{2,6} \oplus K_{3,6} \oplus K_{3,14} \oplus K_{4,6} \oplus K_{4,8} \oplus K_{4,14} \oplus K_{4,16}</math>
</center>
ההסתברות שהמשוואה האחרונה תתקיים היא <math>1/2+2^3(3/4-1/2)(1/4-1/2)^3=15/32</math> עם הטיה -<math>1/32</math> והיא הקירוב הליניארי של הצופן.
היות ש-<math>\textstyle \sum_K</math> קבוע בהתאם למפתח הסודי המשוואה הבאה:
:<math>U_{4,6} \oplus U_{4,8} \oplus U_{4,14} \oplus U_{4,16} \oplus P_5 \oplus P_7 \oplus P_8 = 0</math>
חייבת להתקיים בהסתברות של <math>15/32</math> או <math>(1-15/32)=17/32</math> שתלוי בערכו של <math>\textstyle \sum_K</math> (אפס או אחד בהתאמה). כעת בידינו הקירוב הליניארי הכולל של שלושת הסבבים הראשונים של הצופן בהסתברות של <math>1/32</math>.

===ניחוש סיביות מפתח===
לאחר שהתגלה הקירוב הליניארי הכולל של <math>R-1</math> מתוך <math>R</math> הסבבים של הצופן, עם הטיה הסתברותית משמעותית, עוברים לשלב ניחוש סיביות תת-המפתח האחרון על ידי חישוב לאחור. ביתר פירוט, תחילה מנסים את כל האפשרויות של המפתח האחרון (<math>K_5</math> במקרה זה) ומחברים אותם ב-XOR עם הבלוק המוצפן, ואז מבצעים פענוח חלקי (העברה בתיבות ההחלפה של הסבב האחרון) של הבלוק שהתקבל. פעולה זו מתבצעת עבור כל זוגות הבלוקים גלויים/מוצפנים שנמצאים בידי המתקיף. שומרים מונה שמקודם בכל פעם שהתקבל ערך המקיים את הצירוף הליניארי של התיבות מהסבב האחרון (יש לזכור שהבלוק הגלוי ידוע). כל ניחוש סיביות מפתח שהמונה שלו גבוה או נמוך ממחצית מזוגות הקלט/פלט שבידי המתקיף בשיעור משמעותי הדבר נחשב לניחוש מוצלח. ניחוש לא נכון אמור לתת תוצאה אקראית ולכן המשוואה האמורה תתקיים בהסתברות קרובה לחצי.

בצופן הצעצוע המובא להמחשה, הצירוף הליניארי האחרון משפיע על הפלט לתיבות <math>S_{42}</math> ו-<math>S_{44}</math> של הסבב האחרון. כיוון שכל תיבה מכילה 4 סיביות בסך הכול 8 זה אומר שעבור כל זוג קלט/פלט מנסים את כל 256 צירופי סיביות של המפתח <math>K_5</math> במקטעים <math>[K_{5,5}...K_{5,8},K_{5,13}...K_{5,16}]</math> (יתר סיביות המפתח אינן משפיעות כי שתי תיבות אילו היו התיבות הפעילות היחידות בסבב זה). עבור כל ניחוש מפתח חלקי כזה, מקדמים מונה כלשהו אם המשוואה האחרונה התקיימה. הזוגות שלהם המונה הגבוה ביותר (שלילי או חיובי) מרמזות על ניחוש מוצלח בהסתברות גבוהה. המשוואה האחרונה (הצירוף הליניארי של הצופן) משפיעה על התוצאה בהתאם למפתח. אם ערכן של סיביות המפתח בפוזיציות הללו הוא <math>\textstyle\sum_K=0</math> אז המשואה תתקיים בהסתברות גבוהה מחצי ואילו אם <math>\textstyle\sum_K=1</math> המשוואה תתקיים בהסתברות נמוכה מחצי. את צופן הצעצוע המתואר אפשר לתקוף עם 10,000 זוגות קלט/פלט ידועים, ולפי תיאור ההתקפה עד כה, התגלה ניחוש מוצלח של סיביות תת-המפתח <math>[K_{5,5}...K_{5,8}]=[0010]</math> וכן <math>[K_{5,13}...K_{5,16}]=[0100]</math>. ואכן המונה עבור סיביות אילו <math>[2,4]</math> בבסיס הקסדצימלי כצפוי היה גבוה משמעותית מ-5,000. הטבלה הבאה מכילה להמחשה, אוסף חלקי מתוך 256 האפשרויות. ערכים אילו מייצגים את שיעור ההטיה לפי החשבון האמור, "הטיה = מונה פחות חצי לחלק למספר הזוגות". כאשר המונה מתייחס לניחוש מסוים של 8 סיביות מהמפתח. אפשר לראות שההטיה הגבוהה ביותר מופיעה כאשר הניחוש הוא 2,4.

{| class="wikitable"
|-
! קטע תת-המפתח !! הטיה !! קטע תת-המפתח !! הטיה
|-
! <math>[K_{5,5}...K_{5,8}, K_{5,13}...K_{5,16}]</math> !! !! <math>[K_{5,5}...K_{5,8}, K_{5,13}...K_{5,16}]</math> !!
|-
| 1C || 0.0031 || 2A || 0.0044
|-
| 1D || 0.0078 || 2B || 0.0186
|-
| 1E || 0.0071 || 2C || 0.0094
|-
| 1F || 0.0170 || 2D || 0.0053
|-
| 20 || 0.0025 || 2E || 0.0062
|-
| 21 || 0.0220 || 2F || 0.0133
|-
| 22 || 0.0211 || 30 || 0.0027
|-
| 23 || 0.0064 || 31 || 0.0050
|-
| 24 || bgcolor="silver" | 0.0336 || 32 || 0.0075
|-
| 25 || 0.0106 || 33 || 0.0162
|-
| 26 || 0.0096 || 34 || 0.0218
|-
| 27 || 0.0074 || 35 || 0.0052
|-
| 28 || 0.0224 || 36 || 0.0056
|-
| 29 || 0.0054 || 37 || 0.0048
|}
הערך <math>0.0336</math> בשורה 9 בטבלה שהתגלה במהלך הניסוי, קרוב מאוד לערך הצפוי של <math>1/32=0.03125</math>. למרות שניחוש נכון תמיד יהיה בעל הטיה גבוהה ביותר, בכל זאת קיימים ערכים של ניחושים לא נכונים שמכילים הטיה גבוהה. מה שמעיד על כך שההשוואה של ניחושים נכונים אינה בדיוק השוואה של נתונים אקראיים מול משוואה ליניארית שאז ההטיה אמורה להיות אפס במצב אידיאלי. העובדה שזה לא קורה נובעת מכמה סיבות ביניהן מאפייני תיבות ההחלפה המשפיעות על הפענוח החלקי, אי דיוקים הנובעים מההנחה השגויה שהצירופים של תיבות ההחלפה בלתי תלויים זה בזה וכן מההשפעה של מה שקרוי "פרישה ליניארית" או "מעטפת ליניארית" ראה קבוצה פורשת.

===סיבוכיות ההתקפה===
ההסתברות שמשוואה ליניארית תתקיים תלויה בהטיה ההסתברותית של תיבות ההחלפה הפעילות ובמספרן (התיבות הפעילות הן אילו שהקו עובר דרכן בתרשים). באופן כללי ככל שההטיה גבוהה יותר בתיבות ההחלפה כך היא תהיה גבוהה יותר בצופן כולו. כמו כן ככל שפחות תיבות החלפה פעילות כך שיעור ההטיה יהיה גבוה יותר. יהי <math>\varepsilon</math> ההטיה מחצי של ההסתברות שמשוואה ליניארית עבור כל הצופן תתקיים. מיצורו מצואי הראה שמספר זוגות הקלט/פלט הנדרש לצורך הקרפיטואנליזה הליניארית פרופורציונלי ל-<math>\varepsilon^{-2}</math> ואם <math>N_L</math> מייצג את מספר הבלוקים הקריאים הדרוש אז אפשר להעריכו על ידי <math>N_L\approx 1/\varepsilon^{2}</math>.

למרות שסיבוכיות ההתקפה נמדדת גם בזמן וגם בזיכרון, בקריפטואנליזה ליניארית מתייחסים בעיקר לכמות הזיכרון. כלומר מניחים שאם יש באפשרותנו להשיג <math>N_L</math> טקסטים אז ההתקפה בת ביצוע. לאור האמור הדרכים להתגונן מפני הקריפטואנליזה הליניארית הן מיטוב תיבות ההחלפה, כלומר צמצום ההטיה הליניארית שלהם וכן בניית הצופן באופן שיהיו יותר תיבות החלפה פעילות. צופן AES הוא דוגמה מצוינת לגישה זו. אמנם צריך לשים לב שההוכחה כביכול שצופן עמיד מפני קריפטואנליזה ליניארית מסתמכת על אי קיומם של קירובים ליניאריים בהסתברות גבוהה, חישוב ההסתברות של משוואות ליניאריות מתבסס על ההנחה שהתיבות בלתי תלויות וההטיה שלהם בלתי תלויה כך שאפשרי ליישם את עקרון הערמה של מצואי וכן על ההנחה שקירוב ליניארי יחיד מספיק כדי לחשב את הביטוי הליניארי הטוב ביותר בין סיביות הקלט וסיביות הפלט. במציאות הקירובים הליניאריים של תיבות ההחלפה אינם בלתי תלויים מה שעלול להשפיע על חישוב ההסתברות של ההטיה הכללית של הצופן. וכן מופעים של קירובים ליניאריים עם אותן סיביות קלט ופלט אך עם תיבות החלפה פעילות אחרות ניתנים לצירוף כך שתתקבל הסתברות ליניארית גבוהה יותר מהצפוי עם סט אחד של תיבות החלפה פעילות. תופעה זו נקראת מעטפת ליניארית או פרישה ליניארית. והיא משליכה על כך שגם אם נראה כאילו הצופן אינו מכיל הטיה הסתברותית גבוהה שילוב של מספר מופעים של קירובים ליניאריים יכול להוביל להטיה גבוהה. בכל אופן הגישה הבסיסית המתוארת כאן נוטה לעבוד היטב נגד מספר צפנים מודרניים, זאת משום שההשערה שהקירובים הליניאריים של תיבות ההחלפה בלתי תלויים סבירה למדי וכן אם מופעים של קירובים ליניאריים של קבוצת תיבות החלפה פעילות מניבים הטיה הסתברותית גבוהה הם נוטים להעלים את המעטפת הליניארית.

==ראו גם==
* קריפטואנליזה
* קריפטואנליזה דיפרנציאלית

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

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