MISTY (צופן)

MISTY היא משפחה של צפני בלוקים שפותחו על ידי מיצורו מצואי (Mitsuru Matsui) ועמיתיו מתאגיד מיצובישי יפן. הגרסה הראשונה MISTY פותחה ב-1996 והוצעה לפרויקט NESSIE האירופאי ונכללה בשנת 2003 ברשימה המומלצת של הפרויקט. גרסה אחרת של הצופן הנקראת KASUMI פותחה ב-1999 במיוחד עבור תקן 3GPP לתקשורת סלולרית מסוג GSM, GPRS והדור השלישי UMTS להגנה על פרטיות ואימות שיחה סלולרית. MISTY הוא צופן בלוקים בסגנון רשת פייסטל רקורסיבית המותאם במיוחד לחומרה. הקלט שלו הוא בלוק טקסט קריא באורך 64 סיביות ומפתח סודי באורך 128 סיביות והפלט הוא טקסט מוצפן באורך 64 סיביות. מספר הסבבים בהגדרה יכול להשתנות, אך מקובל בדרך כלל שמונה סבבים. הבסיס התאורטי של הצופן נשען על נוסחה מתמטית המאפשרת הוכחת עמידות נגד קריפטואנליזה דיפרנציאלית וליניארית. ברמה העליונה הצופן כולל שמונה סבבים של פונקציה אי-ליניארית בולאנית שהיא עצמה מורכבת מ"סולם" דמוי רשת פייסטל בשלושה סבבים של פונקציה פנימית אחרת (כמתואר בתרשימים). באותו סגנון הפונקציה הפנימית בתורה מורכבת גם היא ממספר סבבים של החלפה תוך שימוש בשתי תיבות החלפה S7 ו-S9 המורכבות מטבלה של 7 × 7 {\displaystyle 7\times 7} סיביות וטבלה של 9 × 9 {\displaystyle 9\times 9} סיביות בהתאמה. שם הצופן יכול להתפרש כראשי התיבות "Mitsubishi Improved Security TechnologY" או האותיות הראשונות של שמות צוות הפיתוח Matsui Mitsuru, Ichikawa Tetsuya, Sorimachi Toru, Tokita Toshio, Yamagishi Atsuhiro. בתחילה פותחו הגרסאות MISTY1 ו-MISTY2 שההבדל ביניהן הוא בעיקר ש-MISTY2 מאפשרת הפעלה מקבילית של הפונקציה הפנימית בעוד ש-MISTY1 איננה מקבילית. ב-2005 פותחה הגרסה KASUMI שהיא חלק מ-A5/3, תקן תקשורת מאובטחת לרשתות סלולריות מהדור השלישי שמחליף את האלגוריתמים A5/1 ו-A5/2. ב-1998 פורסם צופן E2 שהיה מועמד ל-AES ובשנת 2000 פותח על בסיס דומה צופן קמליה שנחשב לבטוח ברמה של AES ונכלל בתקנים רבים וב-SSL. ערכי תיבות ההחלפה שונים בגרסאות השונות. המפתח הסודי לאחר הרחבה מעורבב עם הקלט בשלבים שונים של הצופן. ב-MISTY1, KASUMI וקמליה קיימת פונקציה נוספת שתפקידה להוסיף טרנספורמציה ליניארית תלוית מפתח. שכבות הפונקציה הליניארית מפרידות כל זוג סבבים של הצופן, למשל ב-KASUMI הפונקציה הליניארית נוספת לפני הפונקציה הפנימית בסבב אי-זוגי ואחריה בסבב זוגי. הבדל נוסף קיים בפונקציית הרחבת המפתח, כאשר ב-MISTY1 ו-MISTY2 היא כוללת טרנספורמציה אי-ליניארית. לעומת זאת מסיבות של יעילות ב-KASUMI פונקציית הרחבת המפתח ליניארית לחלוטין, מה שמהווה נקודת תורפה. כל הגרסאות של הצופן רשומות כפטנט על ידי NTT ומיצובישי אלקטרוניקה, חלקן הותרו לשימוש תחת רישיונות FreeBSD או לשימוש אקדמי/שלא למטרות רווח. לפי הצהרת מיצואי, הצופן הוכח בטוח נגד התקפה דיפרנציאלית/ליניארית וכן נגד התקפות מודרניות נוספות. בשמונה סבבים הסיבוכיות הדיפרנציאלית והליניארית שלו הן בסדר גודל של 2 − 140 {\displaystyle 2^{-140}} בהשוואה ל-DES שהן 2 − 62 {\displaystyle 2^{-62}} ו- 2 − 46 {\displaystyle 2^{-46}} בהתאמה. MISTY1 נחקר במשך שנים רבות מאז הוצע לראשונה ולא נמצאו בו פגמים רציניים. ההתקפה הטובה יותר הידועה היא "התקפה אינטגרלית" של קנודסן ווגנר מ-2002 נגד גרסה מצומצמת של הצופן בחמשה סבבים, בסיבוכיות של 2 48 {\displaystyle 2^{48}} ובסיבוכיות מקום של 2 34 {\displaystyle 2^{34}} . אותה התקפה נגד MISTY2 בשישה סבבים אפשרית בסיבוכיות של 2 71 {\displaystyle 2^{71}} ומקום בסדר גודל של 2 34 {\displaystyle 2^{34}} . נגד KASUMI התגלו מספר התקפות, חלקן תאורטיות כלומר בסיבוכיות טובה מכוח גס ( 2 100 {\displaystyle 2^{100}} עם 2 28 {\displaystyle 2^{28}} ) וחלקן מעשיות כמו התקפת Related-key של אור דונקלמן, נתן קלר ועדי שמיר משנת 2010 שהיא בסיבוכיות של 2 32 {\displaystyle 2^{32}} ומקום בסדר גודל של 2 30 {\displaystyle 2^{30}} עם 4 מפתחות קשורים. ראוי לציין שההתקפה האחרונה אינה ישימה נגד MISTY1, כמו כן היא מסתמכת על כמות נכבדה של טקסט מוצפן בשילוב עם מפתחות קשורים, לכן ייתכן שהיא אינה אפשרית נגד יישום A5/3 בגרסה הנוכחית, אך יש להביא בחשבון את האיום. על כל פנים ההתקפה מוכיחה שהשינויים שנעשו על ידי המפתחים במעבר מ-MISTY ל-KASUMI כדי לשפר ביצועים בחומרה למעשה החלישו את ביטחון הצופן משמעותית. מסיבה זו הוחלט על מעבר לצופן חזק יותר SNOW 3G. בפיתוח הצופן הושם דגש בעיקר על יישום יעיל, במיוחד בחומרה. הפעולות הנפוצות בצופן בלוקים מתחלקות לארבע קטגוריות עיקריות; פעולות אריתמטיות, פעולות הזזה (Shift), פעולות לוגיות (כמו XOR) וטבלאות החלפה (S-box). מתוכן שתי הפעולות האחרונות עדיפות מהיבט של חומרה ולכן נבחרו. האסטרטגיה הבסיסית בפיתוח הצופן הייתה בנייה מלמטה למעלה, מהמרכיבים הקטנים לגדולים בצורה רקורסיבית, כך שיהיה קל להעריך את ביטחון ההצפנה במונחים של הסתברות דיפרנציאלית/ליניארית. כמו ברשת פייסטל טיפוסית, הקלט P {\displaystyle P} באורך 64 סיביות מחולק לשני חצאים בגודל 32 סיביות כל אחד, והפונקציה הפנימית מופעלת על המחצית האחת והפלט שלה משמש כמפתח הצפנה להצפנת המחצית השנייה, תוך שימוש בפעולות XOR ועם שתי תת-שגרות F O {\displaystyle FO} ו- F L {\displaystyle FL} . פלט הצופן C {\displaystyle C} הוא באורך 64 סיביות. בפונקציה F O {\displaystyle FO} מחלקים את הקלט שוב לשני חצאים באורך 16 סיביות, כל אחד מהווה קלט לפונקציה קטנה יותר הנקראת F I {\displaystyle FI} המשתמשת בתיבות ההחלפה (להלן), היות ש-16 סיביות הן ערן גדול מדי, מחלקים שוב את הקלט הפעם לשני חלקים לא שווים, 9 סיביות ו-7 סיביות בהתאמה אותם מחליפים לפי תיבות ההחלפה בהתאמה. הסיבה לחלוקה לא מאוזנת זו נובעת מהעובדה שתיבות החלפה המייצגות פונקציה חד-חד-ערכית ועל אי-ליניארית, טובות יותר באורך אי זוגי מהיבט של קריפטואנליזה דיפרנציאלית/ליניארית, אולם מאידך חסרונן הוא בהפחתה ביעילות יישום הן בחומרה והן בתוכנה. לפי בדיקות שנעשו על מחשב פנטיום מהירות ההצפנה הייתה 20Mbps בקירוב, על חומרה המהירויות הן 450Mbps בקירוב. מבנה MISTY2 מאפשר הפעלה מקבילית ולכן מהיר פי שניים בהצפנה, אך לא בפענוח כי הפונקציה ההופכית לא ניתנת להפעלה מקבילית, מסיבה זו MISTY2 עדיף ליישום במצבי הפעלה OFB או CFB הפועלים כצופן זרם בהם נדרשת רק פונקציית ההצפנה. תיבות ההחלפה הן למעשה חזקות מעל שדה סופי. התיבות חושבו כך שההסתברות הדיפרנציאלית/ליניארית הממוצעת תהיה מינימלית וכן שיהיו ממעלה גבוהה ככל האפשר ושיהיה להן עיכוב מינימלי בביצוע בחומרה. החיפוש התמקד בפונקציות ליניאריות מהצורה S i ( x ) = A ∘ x α   ( i = 7 , 9 ) {\displaystyle S_{i}(x)=A\circ x^{\alpha }\ (i=7,9)} . הטבלה S7 כוללת אוסף של 7 פונקציות ממעלה 10 מהצורה A ∘ x α {\displaystyle A\circ x^{\alpha }} מעל השדה G F ( 2 7 ) {\displaystyle GF(2^{7})} בבסיס פולינומי, כאשר GCD ( 2 7 − 1 , α ) = 1 {\displaystyle {\text{GCD}}(2^{7}-1,\alpha )=1} . באותה דרך הטבלה S9 כוללת אוסף של 9 פונקציות ממעלה לכל היותר 13 מעל השדה G F ( 2 9 ) {\displaystyle GF(2^{9})} . אפשר להפעיל את ההחלפה ישירות באמצעות הפונקציות האמורות ללא שימוש בזיכרון (כאשר החומרה מוגבלת משאבים) או שאפשר להמירן לטבלאות חיפוש אם הזיכרון זמין. להלן הטבלאות S7 ו-S9: בהינתן המפתח הסודי המסופק על ידי המשתמש באורך 128 סיביות, מרחיבים אותו ל-256 סיביות באמצעות הזזה מעגלית וחיבור XOR עם פונקציה ליניארית. השימוש בו הוא באופן שכל סבב מושפע מכל סיביות המפתח ומחלק גדול של המפתח המורחב. ההגבלה ל-256 סיביות נובעת בשל הצורך בהתחשבות בחומרה מוגבלת משאבים כמו כרטיס חכם. הרחבת המפתח נעשית באופן הבא: For  i = 0  to  7  do:  {\displaystyle {\text{For }}i=0{\text{ to }}7{\text{ do: }}} E K [ i ] = K [ i ⋅ 2 ] ⋅ 256 + K [ i ⋅ 2 + 1 ] {\displaystyle EK[i]=K[i\cdot 2]\cdot 256+K[i\cdot 2+1]} For  i = 0  to  7  do:  {\displaystyle {\text{For }}i=0{\text{ to }}7{\text{ do: }}} E K [ i + 8 ] = F I ( E K [ i ] , E K [ ( i + 1 )  mod  8 ] {\displaystyle EK[i+8]=\mathbf {FI} (EK[i],EK[(i+1){\text{ mod }}8]} E K [ i + 16 ] = E K [ i + 8 ] ∧ 0x1FF {\displaystyle EK[i+16]=EK[i+8]\land {\text{0x1FF}}} E K [ i + 24 ] = E K [ i + 8 ] ≫ 9 {\displaystyle EK[i+24]=EK[i+8]\gg 9} הפונקציה FO מקבלת שני פרמטרים, קלט באורך 32 סיביות FO_IN ואינדקס k {\displaystyle k} לחלק המתאים במפתח המורחב EK ומחזירה את FO_OUT כדלהלן: F O ( F O _ I N , k ) {\displaystyle \mathbf {FO} (\mathbf {FO\_IN} ,\mathbf {k} )} t 0 = F O _ I N ≫ 16 {\displaystyle t_{0}=FO\_IN\gg 16} t 1 = F O _ I N ∧ 0xFFFF {\displaystyle t_{1}=FO\_IN\land {\text{0xFFFF}}} t 0 = t 0 ⊕ E K [ k ] {\displaystyle t_{0}=t_{0}\oplus EK[k]} t 0 = F I ( t 0 , E K [ ( k + 5 )  mod  8 + 8 ] ) {\displaystyle t_{0}=\mathbf {FI} (t_{0},EK[(k+5){\text{ mod }}8+8])} t 0 = t 0 ⊕ t 1 {\displaystyle t_{0}=t_{0}\oplus t_{1}} t 1 = t 1 ⊕ E K [ ( k + 2 )  mod  8 ] {\displaystyle t_{1}=t_{1}\oplus EK[(k+2){\text{ mod }}8]} t 1 = F I ( t 1 , E K [ ( k + 1 )  mod  8 + 8 ] ) {\displaystyle t_{1}=\mathbf {FI} (t_{1},EK[(k+1){\text{ mod }}8+8])} t 1 = t 1 ⊕ t 0 {\displaystyle t_{1}=t_{1}\oplus t_{0}} t 0 = t 0 ⊕ E K [ ( k + 7 )  mod  8 ] {\displaystyle t_{0}=t_{0}\oplus EK[(k+7){\text{ mod }}8]} t 0 = F I ( t 0 , E K [ ( k + 3 )  mod  8 + 8 ] ) {\displaystyle t_{0}=\mathbf {FI} (t_{0},EK[(k+3){\text{ mod }}8+8])} t 0 = t 0 ⊕ t 1 {\displaystyle t_{0}=t_{0}\oplus t_{1}} t 1 = t 1 ⊕ E K [ ( k + 4 )  mod  8 ] {\displaystyle t_{1}=t_{1}\oplus EK[(k+4){\text{ mod }}8]} F O _ O U T = ( t 1 ≪ 16 ) ∨ t 0 {\displaystyle FO\_OUT=(t_{1}\ll 16)\lor t_{0}} Return  F O _ O U T {\displaystyle {\text{Return }}FO\_OUT} הפונקציה FI מקבלת שני פרמטרים; קלט באורך 16 סיביות F_IN וחלק מהמפתח המורחב FI_KEY ומחזירה פלט באורך 16 סיביות FI_OUT. הפונקציה משתמשת בשני משתני עזר מקומיים d_7 באורך 7 סיביות ו-d_9 באורך 9 סיביות וכן מנצלת את תיבות ההחלפה המתוארות לעיל. בגלל האורך השונה של המשתנים d_7 ו-d_9 יש צורך להפעיל פונקציה כלשהי שמרחיבה או מכווצת את המשתנה בהתאם לפני שמבצעים XOR. הרחבה נעשית על ידי הוספת שני אפסים משמאל (בצד המשמעותי של המספר) וכיווץ נעשה על ידי חיתוך שתי הסיביות המשמעותיות. F I ( F I _ I N , F I _ K E Y ) {\displaystyle \mathbf {FI} (\mathbf {FI\_IN,FI\_KEY} )} d 9 = F I _ I N ≫ 7 {\displaystyle d_{9}=FI\_IN\gg 7} d 7 = F I _ I N ∧ 0x7F {\displaystyle d_{7}=FI\_IN\land {\text{0x7F}}} d 9 = S9TABLE [ d 9 ] ⊕ d 7 {\displaystyle d_{9}={\text{S9TABLE}}[d_{9}]\oplus d_{7}} d 7 = S7TABLE [ d 7 ] ⊕ d 9 {\displaystyle d_{7}={\text{S7TABLE}}[d_{7}]\oplus d_{9}} ( d 7 = d 7 ∧ 0x7F ) {\displaystyle (d_{7}=d_{7}\land {\text{0x7F}})} d 7 = d 7 ⊕ ( F I _ K E Y ≫ 9 ) {\displaystyle d_{7}=d_{7}\oplus (FI\_KEY\gg 9)} d 9 = d 9 ⊕ ( F I _ K E Y ∧ 0x1FF ) {\displaystyle d_{9}=d_{9}\oplus (FI\_KEY\land {\text{0x1FF}})} d 9 = S9TABLE [ d 9 ] ⊕ d 7 {\displaystyle d_{9}={\text{S9TABLE}}[d_{9}]\oplus d_{7}} F I _ O U T = ( d 7 ≪ 9 ) ∨ d 9 {\displaystyle FI\_OUT=(d_{7}\ll 9)\lor d_{9}} Return  F I _ O U T {\displaystyle {\text{Return }}FI\_OUT} הפונקציה FL מקבלת שני פרמטרים; קלט באורך 32 סיביות FL_IN ואינדקס k לחלק המתאים במפתח המורחב ומחזירה את FL_OUT באורך 32 סיביות. F L ( F L _ I N , k ) {\displaystyle \mathbf {FL} (\mathbf {FL\_IN,k} )} d 0 = F L _ I N ≫ 16 {\displaystyle d_{0}=FL\_IN\gg 16} d 1 = F L _ I N ∧ 0xFFFF {\displaystyle d_{1}=FL\_IN\land {\text{0xFFFF}}} If k is even then:  {\displaystyle {\text{If k is even then: }}} d 1 = d 1 ⊕ ( d 0 ∧ E K [ k / 2 ] ) {\displaystyle d_{1}=d_{1}\oplus (d_{0}\land EK[k/2])} d 0 = d 0 ⊕ ( d 1 ∨ E K [ ( k / 2 + 6 )  mod  8 + 8 ] ) {\displaystyle d_{0}=d_{0}\oplus (d_{1}\lor EK[(k/2+6){\text{ mod }}8+8])} Else {\displaystyle {\text{Else}}} d 1 = d 1 ⊕ ( d 0 ∧ E K [ ( ( k − 1 ) / 2 + 2 )  mod  8 + 8 ] ) {\displaystyle d_{1}=d_{1}\oplus (d_{0}\land EK[((k-1)/2+2){\text{ mod }}8+8])} d 0 = d 0 ⊕ ( d 1 ∨ E K [ ( ( k − 1 ) / 2 + 4 )  mod  8 ] ) {\displaystyle d_{0}=d_{0}\oplus (d_{1}\lor EK[((k-1)/2+4){\text{ mod }}8])} F L _ O U T = ( d 0 ≪ 16 ) ∨ d 1 {\displaystyle FL\_OUT=(d_{0}\ll 16)\lor d_{1}} Return  F L _ O U T {\displaystyle {\text{Return }}FL\_OUT} במצבי הפעלה ECB ו-CBC בפענוח צריך להשתמש בפונקציה ההופכית FLINV הבאה: F L I N V ( F L _ I N , k ) {\displaystyle \mathbf {FLINV} (\mathbf {FL\_IN,k} )} d 0 = F L _ I N ≫ 16 {\displaystyle d_{0}=FL\_IN\gg 16} d 1 = F L _ I N ∧ 0xFFFF {\displaystyle d_{1}=FL\_IN\land {\text{0xFFFF}}} If k is even then:  {\displaystyle {\text{If k is even then: }}} d 0 = d 0 ⊕ ( d 1 ∨ E K [ ( k / 2 + 6 )  mod  8 + 8 ] ) {\displaystyle d_{0}=d_{0}\oplus (d_{1}\lor EK[(k/2+6){\text{ mod }}8+8])} d 1 = d 1 ⊕ ( d 0 ∧ E K [ k / 2 ] ) {\displaystyle d_{1}=d_{1}\oplus (d_{0}\land EK[k/2])} Else {\displaystyle {\text{Else}}} d 0 = d 0 ⊕ ( d 1 ∨ E K [ ( ( k − 1 ) / 2 + 4 )  mod  8 ] ) {\displaystyle d_{0}=d_{0}\oplus (d_{1}\lor EK[((k-1)/2+4){\text{ mod }}8])} d 1 = d 1 ⊕ ( d 0 ∧ E K [ ( ( k − 1 ) / 2 + 2 )  mod  8 + 8 ] ) {\displaystyle d_{1}=d_{1}\oplus (d_{0}\land EK[((k-1)/2+2){\text{ mod }}8+8])} F L _ O U T = ( d 0 ≪ 16 ) ∨ d 1 {\displaystyle FL\_OUT=(d_{0}\ll 16)\lor d_{1}} Return  F L _ O U T {\displaystyle {\text{Return }}FL\_OUT} באופן רגיל התהליך האמור מבוצע שמונה פעמים. בכל סבב מתבצעת הקריאה לפונקציה FO. בנוסף בכל סבב זוגי מתבצעת קריאה לפונקציה FL. לאחר הסבב האחרון מתבצעת קריאה נוספת לפונקציה FL. לצורך המחשה אם הקלט חולק לשני חצאים R ו-L בהתאמה, שמונה הסבבים של הצופן נראים כך: GSM KASUMI Mitsuru Matsui (1997). Block encryption algorithm MISTY. Fast Software Encryption, 4th International Workshop, FSE '97, LNCS 1267. pp. 64–74. [www.cs.berkeley.edu/~daw/papers/integrals-fse02.ps Integral Cryptanalysis] Cryptanalysis of Reduced-Round MISTY (2001) [www.iacr.org/cryptodb/data/paper.php?pubkey=22914 A Practical-Time Attack on the A5/3 Cryptosystem Used in Third Generation GSM Telephony]