לדלג לתוכן

FEAL

מתוך ויקיפדיה, האנציקלופדיה החופשית

בקריפטוגרפיה,FEAL(ראשי תיבות שלFast data Encipherment ALgorithm,בעברית:אלגוריתם הצפנת נתונים מהיר) כולל משפחה שלצפני בלוקיםבמבנה פייסטלשהראשון שבהם הוצע כאלטרנטיבה לצופןDESוהוא מהיר ממנו בתוכנה. הגרסה הראשונה פותחה ב-1987 על ידי אקירו שימיזו ושוי מיאגוטשי מתאגיד הטלגרף והטלפון של יפן(NTT)[1].ב-1994 התקבל הצופן לתקן בין-לאומיISO/IEC9979 וב-1999 נבחר לתקןATMוכן נכלל בתקן יפני לכרטיסים חכמיםב-1998. בשלקריפטואנליזהשמעידה על חולשות הצופן אינו בשימוש כיום. NTT ממליצים להשתמש בצופן מדור חדש כמוקמליה.

קיימות מספר גרסאות של FEAL כולן במבנה פייסטל עם אותה פונקציית סבב פנימית אך עם מספר סבבים שונה או עם מפתח גדול יותר. הצופן מקבל בלוקקלטבאורך 64 סיביות ומחזיר בלוק מוצפן באורך 64 סיביות. הגרסה הראשונה שכיום נקראת FEAL-4 משתמשת במפתח הצפנה באורך 64 סיביות וכוללת ארבעה סבבים של הפונקציה הפנימית. FEAL-8 מכיל שמונה סבבים עם אותו מפתח ואילו FEAL-NX מכילה מספר דינאמי של סבבים בהתאם לצורך כך ש-.(המספר המומלץ הוא) ואילו "X" מתייחס לאופציה של מפתח באורך 128 סיביות שנוספה בגרסה המאוחרת יותר.

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

בתחילה התגלו בעיות בגרסה הראשונה של הצופן על ידי דן בואר ושון מרפי שגילו התקפות קריפוטאנליטיות הדורשות כמות מועטה שלטקסטים גלויים נבחריםכדי לפצח את הצופן בקלות[2][3].ההתקפות שלהם מכילות אלמנטים דומים להתקפה הדיפרנציאלית שהתגלתה מאוחר יותר. ב-1998 ניסו מפתחי הצופן לפתור את הבעיה על ידי העלאת מספר הסבבים וכך נוצר FEAL-8 הכולל שמונה סבבים במקום ארבעה.

ב-1991 פרסמואלי ביהםועדי שמיראת ההתקפה הדיפרנציאלית שלהם על FEAL-8[4].אחריהם פורסמו עוד כמה התקפות מסוג זה שמצליחות לפצח את הצופן עם כמות יחסית קטנה של טקסטים גלויים נבחרים. בתגובה פותח FEAL-NX אך הסתבר שההתקפה הדיפרנציאלית של שמיר וביהם הייתה ישימה גם נגד הגרסה הזו שהיא החזקה ביותר שפותחה, ההתקפה שלהם יעילה מכוח גסכל עוד.

ב-1991 גילו טארדי וגילברט התקפה חדשה נגד גרסאות צופן FEAL שמסוגלת לפצח אותו בסיבוכיות טובה מכוח גס[5].למשל FEAL-8 ניתן בשיטה זו לשבירה עםטקסטים גלויים נבחרים. מאוחר יותר פרסם מיצורו מצואי את ההתקפה הליניארית שמבוססת על רעיון זה המסוגלת לשבור את צופן FEAL-4 בתוך כחמש דקות עם שישה טקסטים גלויים ידועים. ב-1994 פורסמה התקפה ליניארית נגד FEAL-8 עםטקסטים גלויים נבחרים[6].למעשה בעקבות התקפות אילו נסתם הגולל על FEAL והוא אינו בשימוש כיום כלל. NTT ממליצים להשתמש בקמליה במקומו.

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

פירוט מהלכי הצופן

[עריכת קוד מקור|עריכה]
תיאור סכמתי של צופן FEAL

להלן תיאור צופן FEAL-NX כאשר.הוא מקבל מפתח באורך 64 או 128 סיביות לפי בחירת המשתמש ופועל על בלוק גלוי באורך 8 בתים. באופן כללי האלגוריתם מבצע שלושה מהלכים:

  1. קדם עיבודשנקרא גםהלבנה.
  2. פונקציה איטרטיבית
  3. חישוב מסיים

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

כלומר מחברים ב-XOR עם ארבעה תת-מפתחות מתאימים. כל תת-מפתח באורך 16 סיביות לכן כל מחצית מהבלוק מחוברת עם שני תת-מפתחות ואז

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

בשלב האיטרציה, הקלטמשלב ההכנה עובר עיבוד עם הפונקציהבסך הכולפעמים:

כאשר.הפונקציהמתוארת להלן והפלט הוא התוצאה מהסבב האחרון.

בשלב הסיום, מחליפים בין החצאים של הפלט האחרוןואז מחשבים את:

ולסיום מחברים עם חלקים מתאימים מהמפתח:

הטקסט המוצפן הוא.

אלגוריתם הפענוח

[עריכת קוד מקור|עריכה]

תהליך הפענוח דומה, הקלטמעובד תחילה על ידי:

ואז

לאחר מכן מבצעיםפעמים:

כדי לקבל את הטקסט המקורי תחילה מבצעים:

לסיום מחשבים את:

שימו לב שמחברים ארבעה תת-מפתחות כי תת-מפתח הוא באורך 16 סיביות ולכן נדרשים ארבעה כדי לחבר עםשהוא באורך 64 סיביות (8 בתים).

תהליך הכנת המפתח

[עריכת קוד מקור|עריכה]
#define ROTL(x, n) (byte)(((byte)(x) << (n)) | ((byte)(x) >> (8-(n))))
#define S0(x, y) (byte)(ROTL(((byte)((x) + (y) )), 2))
#define S1(x, y) (byte)(ROTL(((byte)((x) + (y) + 1)), 2))

voidFEAL_Fk(byte*a,byte*b)
{
a[1]^=a[0],a[2]^=a[3];
bytet;
t=a[2]^b[0],a[1]=S1(a[1],t);
t=a[1]^b[1],a[2]=S0(a[2],t);

t=a[1]^b[2],a[0]=S0(a[0],t);
t=a[2]^b[3],a[3]=S1(a[3],t);
}
voidFEAL_F(byte*a,byte*b,byte*e)
{
a[1]=(b[0]^b[1]^e[0]);
a[2]=(b[2]^b[3]^e[1]);

a[1]=S1(a[1],a[2]);
a[2]=S0(a[1],a[2]);

a[0]=S0(b[0],a[1]);
a[3]=S1(b[3],a[2]);
}
קודC++‎של הפונקציות הפנימיותו-

מהמפתח הסודי המסופק על ידי המשתמש מכיניםתת-מפתחותמסומניםכל אחד באורך 16 סיביות (שני בתים), כאשרמהם משמשים לצורך הפונקציה הפנימית, מפתח אחד לכל סבב ואילו 8 הנוספים משמשים לפעולת ההלבנה (חיבור ב-XOR), ארבעה מהם לפני האיטרציה של הפונקציה הפנימית וארבעה לאחריה. תחילה המפתח מחולק לשני חצאיםבאורך 64 סיביות כל אחד.

את החצי הימנימחלקים לשני חצאיםומכינים סדרה של משתנים מקומיים בהתאם למספר הסבביםבהם מציבים עבור:

כאשר,
כאשר,
כאשר

נמוך מ-ו-כאשרזוגי.

את החצי השמאלימחלקים לשני חצאיםומכינים משתנה מקומי ריק.אתכאשרעדמכינים עםעדכדלהלן:

,
,
,

הוא משתנה מקומי המחולק לארבעה בתים.

פונקציות עזר

[עריכת קוד מקור|עריכה]
תיאור הפונקציה הפנימית

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

.

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

תיאור הפונקציה f בתהליך הכנת המפתח

הפונקציותו-מוגדרות כדלהלן:

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

voidFEAL_keygen(byte*k,byte*e,uintr)
{
bytea[4],b[4],d[4],kr1[4],kr2[4],t,s[4];

for(uinti=0;i<4;i++){
a[i]=k[i],b[i]=k[i+4];
kr1[i]=k[i+8],kr2[i]=k[i+12];
d[i]=0;
}

for(uinti=0;i<r+8;i+=2){
for(uintj=0;j<4;j++){
s[j]=b[j];
if((i/2)%3==0){
s[j]^=(kr1[j]^kr2[j]);
}
elseif((i/2)%3==1){
s[j]^=kr1[j];
}
else{
s[j]^=kr2[j];
}
s[j]^=d[j];
d[j]=a[j];/* for next steps */
}
FEAL_Fk(a,s);

for(uintj=0;j<4;j++){
e[2*i+j]=a[j];
}

for(uintj=0;j<4;j++){
t=a[j];
a[j]=b[j],b[j]=t;
}
}
}

voidFEAL_encrypt(byte*p,uintr,byte*e,byte*c)
{
bytea[4],b[4],t,s[4];

for(uintj=0;j<4;j++){
a[j]=p[j]^e[2*r+j];
b[j]=p[j+4]^e[2*r+j+4]^a[j];
}

for(uinti=0;i<r;i++){
FEAL_F(s,b,e+2*i);

for(uintj=0;j<4;j++){
a[j]^=s[j];
}

for(uintj=0;j<4;j++){
t=a[j];
a[j]=b[j],b[j]=t;
}
}

for(uintj=0;j<4;j++){
a[j]^=b[j];
}

for(uintj=0;j<4;j++){
c[j]=(b[j]^e[2*r+j+8]);
c[j+4]=(a[j]^e[2*r+j+12]);
}
}


voidFEAL_decrypt(byte*c,uintr,byte*e,byte*p)
{
bytea[4],b[4],t,s[4];

for(uintj=0;j<4;j++){
a[j]=c[j]^e[2*r+j+8];
b[j]=c[j+4]^e[2*r+j+12]^a[j];
}

for(uinti=0;i<r;i++){
FEAL_F(s,b,e+2*(r-1-i));

for(uintj=0;j<4;j++){
a[j]^=s[j];
}

for(uintj=0;j<4;j++){
t=a[j];
a[j]=b[j],b[j]=t;
}
}

for(uintj=0;j<4;j++){
a[j]^=b[j];
}

for(uintj=0;j<4;j++){
p[j]=(b[j]^e[2*r+j]);
p[j+4]=(a[j]^e[2*r+j+4]);
}
}

קריפטואנליזה דיפרנציאלית של FEAL-4

[עריכת קוד מקור|עריכה]

קריפטואנליזה דיפרנציאלית פועלת לפי מודלהתקפת גלוי-נבחר[7],כלומר המתקיף רשאי לבחור זוגות של טקסטים גלויים וטקסטים מוצפנים המתאימים להם שהוצפנו עם מפתח שאינו ידוע לו ותפקידו הוא לגלות את המפתח הסודי ששימש להצפנתם. המתקיף בוחר את הטקסטים באופן כזה שהדיפרנציאל (ההפרש) שלהם עונה על "מאפיין" מסוים המתאים לצורך ההתקפה. כאן הדיפרנציאל הוא מעל פעולת XOR ולכן הדברים נעשים פשוטים יותר כי בגלל התכונה הידועה שאם מבצעים XOR בין שני טקסטים מוצפנים שהוצפנו עם אותו קטע מהמפתח למעשה מבטלים את השפעת המפתח כאילו לא היה קיים (ראופנקס חד-פעמי). במקרה של FEAL-4 התגלתה עובדה מעניינת: נתונה הפונקציה הפנימית של הצופן,עבור כל זוג טקסטיםו-אם(בבסיס הקסדצימלי) אז מתקיים.למרבה ההפתעה זהו דיפרנציאל בעלהסתברותשל 1 שלא קשה לחשב והוא משמש לשבירת הצופן.

FEAL-4 זהה לתיאור FEAL-XN למעט העובדה שהפונקציה הפנימית מבוצעת רק 4 פעמים ותהליך הכנת מפתח שונה. אפשר להציג את הצופן בכמה דרכים, אולם לצורך הקריפטואנליזה הדיפרנציאלית שלו הוא מוצג כאן בדרך קצת שונה מהקודמת (קל להוכיח ששתיהן למעשה שקולות). המפתח מחולק לשישה תת-מפתחות באורך 32 סיביות כל אחד (במקום 12 תת-מפתחות באורך 16 סיביות בתיאור המקורי). אפשר להתעלם מתהליך הכנת המפתח כולו כי ההתקפה מתמקדת בשחזור תת-המפתחות ואם מצליחים לנחש אותם אז אפשר לשחזר את המפתח הסודי בקלות. פונקציית הסבב הפנימיתמקבלת ארבעה בתיםומחזירה ארבעה בתים,היא עושה שימוש בפונקציותו-המתוארות לעיל והיא נראית כך:

תיאור ההתקפה הדיפרנציאלית על צופן FEAL-4

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

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

.

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

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

הערות שוליים

[עריכת קוד מקור|עריכה]
  1. ^Introduction to FEAL,NTT 1990
  2. ^Cryptanalysis of F.E.A.L.Bert den Boer, Spnnger-Verlag Berlin Heidelberg 1988
  3. ^THE CRYPTANALYSIS OF FEAL WITH TWENTY CHOSEN PLAINTEXTS,Sean Murphy, January 1990
  4. ^Differential Cryptanalysis of Feal and N-Hash,Eli Biham, Adi Shamir, Spnnger-Verlag Berlin Heidelberg 1991
  5. ^A Known Plaintext Attack of FEAL-4 and FEAL-6,Anne Tardy-Corfdir, Henri Gilbert, May 2001
  6. ^A New Method for Known Plaintext Attack of FEAL Cipher,Mitsuru Matsui, Atsuhiro Yamagishi, May 2001
  7. ^Applied Cryptanalysis: Breaking Ciphers in the Real World,Mark Stamp, Richard M. Low, Apr 2007, Wiley-IEEE Press