MICKEY

MICKEY הוא צופן זרם סינכרוני המיועד לפלטפורמת חומרה מוגבלת משאבים, שפותח ב-2006 על ידי סטיב באבג' מחברת וודאפון ומת'יו דוֹד. שם הצופן הוא ראשי התיבות של Mutual Irregular Clocking KEYstream, והוא מבוסס על אוגר זיזה ממושב (LFSR) שמבוקר בטכניקה ייחודית לאיזון בין הצורך במחזוריות גבוהה ופסאודו-אקראיות לבין הצורך בעמידות נגד קריפטואנליזה. הוא מספק רמה גבוהה יחסית של ביטחון לחומרה בעלת סיבוכיות נמוכה. גרסת MICKEY 2.0 נבחרה על ידי eSTREAM כצופן מועדף לשימוש יחד עם מבחר אלגוריתמים נוספים בקטגוריית חומרה. הצופן מקבל מפתח סודי בגודל 80 סיביות ווקטור אתחול בגודל של עד 80 סיביות ומייצר זרם פסאודו-אקראי באורך מרבי של 2 40 {\displaystyle 2^{40}} סיביות, המשמש כמפתח להצפנת זרם הנתונים באמצעות XOR כבכל צופן זרם. הצופן מורכב משני אוגרי LFSR המסומנים ב- R {\displaystyle R} ו- S {\displaystyle S} כל אחד בגודל 100 סיביות הנקראות מצבים (states) שמסומנים בקיצור r 0 , . . . , r 99 {\displaystyle r_{0},...,r_{99}} וכן s 0 , . . . , s 99 {\displaystyle s_{0},...,s_{99}} בהתאמה. בכל פעימת שעון (clocking) כל הסיביות או המצבים מוסטים שלב אחד כלפי מטה (ימינה) והפוזיציות הבאות של האוגר R {\displaystyle R} משמשות להיזון חוזר (feedback): RTAPS = { 0 , 1 , 3 , 4 , 5 , 6 , 9 , 12 , 13 , 16 , 19 , 20 , 21 , 22 , 25 , 28 , 37 , 38 , 41 , 42 , 45 , 46 , 50 , 52 , 54 , 56 , 58 , {\displaystyle {\text{RTAPS}}=\{0,1,3,4,5,6,9,12,13,16,19,20,21,22,25,28,37,38,41,42,45,46,50,52,54,56,58,} 60 , 61 , 63 , 64 , 65 , 66 , 67 , 71 , 72 , 79 , 80 , 81 , 82 , 87 , 88 , 89 , 90 , 91 , 92 , 94 , 95 , 96 , 97 } {\displaystyle 60,61,63,64,65,66,67,71,72,79,80,81,82,87,88,89,90,91,92,94,95,96,97\}} הפרוצדורה CLOCK_R (‎clocking מתייחס לעדכון האוגר בכל פעימת שעון) ייחודית בכך שהיא משתנה בהתאם לפרמטר. קלט הפונקציה הוא סיבית-קלט INPUT _ BIT _ R {\displaystyle {\text{INPUT}}\_{\text{BIT}}\_{\text{R}}} וסיבית בקרה CONTROL _ BIT _ R {\displaystyle {\text{CONTROL}}\_{\text{BIT}}\_{\text{R}}} , הסימן ⊕ {\displaystyle \oplus } הוא XOR והסיביות r 0 ′ , . . . , r 99 ′ {\displaystyle r_{0}',...,r_{99}'} מייצגות את מצבו החדש של האוגר לאחר העדכון. בכל פעימה כאשר סיבית הבקרה מאופסת מתבצעת הזזה פוזיציה אחת והזנה (feedback) לפי הפוזיציות המנויות ב-RTAPS. המשמעות של ההזזה במונחים של אלגברה שהיא פועלת כמו כפל אלמנטים בשדה סופי מורחב G F ( 2 100 ) {\displaystyle GF(2^{100})} מודולו הפולינום הפרימיטיבי C R ( x ) = x 100 + ∑ i ∈ RTAPS x i {\displaystyle \textstyle C_{R}(x)=x^{100}+\sum _{i\in {\text{RTAPS}}}x^{i}} . כי בעצם אפשר לראות במצבי האוגר כמקדמים בינאריים של פולינום כלשהו ממעלה 100 כאשר המצב השמאלי הוא המקדם המוביל. כאן הכפל הוא בין המצב הנוכחי של האוגר לפולינום x {\displaystyle x} או p ( x ) = a 1 x {\displaystyle p(x)=a_{1}x} (היות שהמקדמים בינאריים זוהי מחרוזת שבה רק הסיבית השנייה משמאל דלוקה). פעולת כפל זו שקולה למעשה לפעולת ההזזה (shift) של כל סיביות האוגר ימינה. בנוסף מחברים ב-XOR את סיבית-הקלט INPUT _ BIT _ R {\displaystyle {\text{INPUT}}\_{\text{BIT}}\_{\text{R}}} למצב הנוכחי. כאשר סיבית הבקרה היא '1', לאחר ההזזה האמורה כל סיביות המצב מחוברת בחזרה ב-XOR (כמתואר בתרשים). במונחי אלגברה בשדה G F ( 2 100 ) {\displaystyle GF(2^{100})} פירוש הפעולה הוא כפל בפולינום x + 1 {\displaystyle x+1} (הזזה שקולה לכפל ו-XOR שקול לחיבור). הפולינום C R ( x ) {\displaystyle C_{R}(x)} נבחר כך שהוא מתחלק ב- x J + x + 1 {\displaystyle x^{J}+x+1} כאשר J = 2 50 − 157 {\displaystyle J=2^{50}-157} . קריאה לפונקציית ההיזון עם סיבית הבקרה הדינאמית דלוקה שקולה ל- J {\displaystyle J} הזזות. להלן ניסוח פורמלי של הפונקציה: FEEDBACK _ BIT = r 99 ⊕ INPUT _ BIT _ R {\displaystyle {\text{FEEDBACK}}\_{\text{BIT}}=r_{99}\oplus {\text{INPUT}}\_{\text{BIT}}\_{\text{R}}} For  i = 1  to  99  do:  r i ′ = r i − 1 {\displaystyle {\text{For }}i=1{\text{ to }}99{\text{ do: }}r_{i}'=r_{i-1}} r 0 ′ = 0 {\displaystyle r_{0}'=0} For each  i ∈ RTAPS do: {\displaystyle {\text{For each }}i\in {\text{RTAPS do:}}} r i ′ = r i ′ ⊕ FEEDBACK _ BIT {\displaystyle r_{i}'=r_{i}'\oplus {\text{FEEDBACK}}\_{\text{BIT}}} If CONTROL _ BIT _ R = 1  then:  {\displaystyle {\text{If CONTROL}}\_{\text{BIT}}\_{\text{R}}=1{\text{ then: }}} For  i = 0  to  99  do:  r i ′ = r i ′ ⊕ r i {\displaystyle {\text{For }}i=0{\text{ to }}99{\text{ do: }}r_{i}'=r_{i}'\oplus r_{i}} תחילה מוגדרות ארבע מחרוזות ערכים קבועים: COMP0, COMP1, FB0, FB1 כל אחת באורך 100 סיביות (כמתואר בטבלה המצורפת). הפונקציה לעדכון האוגר S {\displaystyle S} מקבלת כקלט שתי סיביות INPUT _ BIT _ S {\displaystyle {\text{INPUT}}\_{\text{BIT}}\_{\text{S}}} וכן CONTROL _ BIT _ S {\displaystyle {\text{CONTROL}}\_{\text{BIT}}\_{\text{S}}} ומפיקה ערכי ביניים s ^ i {\displaystyle {\hat {s}}_{i}} המשתנים בהתאם לסיבית הבקרה. התוצאה מומרת למערך סיביות הפלט s 0 ′ , . . . , s 99 ′ {\displaystyle s_{0}',...,s_{99}'} . הסימן ⊙ {\displaystyle \odot } מייצג את הפעולה הלוגית AND. הפונקציה פועלת כדלהלן: FEEDBACK _ BIT = s 99 ⊕ INPUT _ BIT _ S {\displaystyle {\text{FEEDBACK}}\_{\text{BIT}}=s_{99}\oplus {\text{INPUT}}\_{\text{BIT}}\_{\text{S}}} For  i = 1  to  98  do:  s ^ i = s i − 1 ⊕ ( ( s i ⊕  COMP0 i ) ⊙ ( s i + 1 ⊕  COMP1 i ) ) {\displaystyle {\text{For }}i=1{\text{ to }}98{\text{ do: }}{\hat {s}}_{i}=s_{i-1}\oplus ((s_{i}\oplus {\text{ COMP0}}_{i})\odot (s_{i+1}\oplus {\text{ COMP1}}_{i}))} s ^ 0 = 0 , s ^ 99 = s 98 {\displaystyle {\hat {s}}_{0}=0,{\hat {s}}_{99}=s_{98}} For  i = 0  to  99  do:  s i ′ = s ^ i {\displaystyle {\text{For }}i=0{\text{ to }}99{\text{ do: }}s_{i}'={\hat {s}}_{i}} If FEEDBACK _ BIT = 1  then: {\displaystyle {\text{If FEEDBACK}}\_{\text{BIT}}=1{\text{ then:}}} If CONTROL _ BIT _ S = 0  then:  For  i = 0  to  99  do:  s i ′ = s ^ i ⊕ FB0 i {\displaystyle {\text{If CONTROL}}\_{\text{BIT}}\_{\text{S}}=0{\text{ then: }}{\text{For }}i=0{\text{ to }}99{\text{ do: }}s_{i}'={\hat {s}}_{i}\oplus {\text{FB0}}_{i}} Else if CONTROL _ BIT _ S = 1  then:  For  i = 0  to  99  do:  s i ′ = s ^ i ⊕ FB1 i {\displaystyle {\text{Else if CONTROL}}\_{\text{BIT}}\_{\text{S}}=1{\text{ then: }}{\text{For }}i=0{\text{ to }}99{\text{ do: }}s_{i}'={\hat {s}}_{i}\oplus {\text{FB1}}_{i}} המחולל המייצר את זרם המפתח שנקרא keystream generator מוגדר כדלהלן; הקלט הוא שני האוגרים S {\displaystyle S} ו- R {\displaystyle R} וכן דגל אתחול שנקרא MIXING {\displaystyle {\text{MIXING}}} ('1' מציין את שלב אתחול שבו רק מריצים את הצופן ומתעלים מהפלט ו'0' מציין שימוש רגיל) וסיבית קלט INPUT _ BIT {\displaystyle {\text{INPUT}}\_{\text{BIT}}} . הפרמטר סיבית הבקרה של שתי הפונקציות לעיל מוגדרות כך: CONTROL _ BIT _ R = s 34 ⊕ r 67 {\displaystyle {\text{CONTROL}}\_{\text{BIT}}\_{\text{R}}=s_{34}\oplus r_{67}} וכן CONTROL _ BIT _ S = s 67 ⊕ r 33 {\displaystyle {\text{CONTROL}}\_{\text{BIT}}\_{\text{S}}=s_{67}\oplus r_{33}} . אם הדגל MIXING = TRUE {\displaystyle {\text{MIXING}}={\text{TRUE}}} סיבית הקלט של האוגר R {\displaystyle R} תהיה INPUT _ BIT _ R = INPUT _ BIT ⊕ s 50 {\displaystyle {\text{INPUT}}\_{\text{BIT}}\_{\text{R}}={\text{INPUT}}\_{\text{BIT}}\oplus s_{50}} אחרת תהיה INPUT _ BIT {\displaystyle {\text{INPUT}}\_{\text{BIT}}} עצמה. סיבית הקלט של האוגר S {\displaystyle S} היא INPUT _ BIT {\displaystyle {\text{INPUT}}\_{\text{BIT}}} . בכל פעימת שעון המחולל קורא לפונקציות הבאות להפקת סיבית מפתח אחת: CLOCK _ R ( INPUT _ BIT _ R , CONTROL _ BIT _ R ) {\displaystyle {\text{CLOCK}}\_{\text{R}}({\text{INPUT}}\_{\text{BIT}}\_{\text{R}},{\text{CONTROL}}\_{\text{BIT}}\_{\text{R}})} CLOCK _ S ( INPUT _ BIT _ S , CONTROL _ BIT _ S ) {\displaystyle {\text{CLOCK}}\_{\text{S}}({\text{INPUT}}\_{\text{BIT}}\_{\text{S}},{\text{CONTROL}}\_{\text{BIT}}\_{\text{S}})} תוצאת המחולל היא XOR של שתי הסיביות במצבי האפס. כלומר s 0 ⊕ r 0 {\displaystyle s_{0}\oplus r_{0}} . מפתח ההצפנה הסודי שמסופק על ידי המשתמש אינו נטען ישירות לאוגרים כדי למנוע התקפות מסוימות, אלא תחת זאת הטעינה מתבצעת באמצעות הפרוצדורה הבאה. המפתח המיוצג על ידי מחרוזת של 80 סיביות k 0 , . . . , k 79 {\displaystyle k_{0},...,k_{79}} ווקטור האתחול באורך i v l e n g t h {\displaystyle ivlength} (עד 80 סיביות) IV 0 , . . . , IV i v l e n g t h − 1 {\displaystyle {\text{IV}}_{0},...,{\text{IV}}_{ivlength-1}} נטענים למצב הראשוני של האוגרים כדלקמן: תחילה האוגרים מאופסים ואז, לטעינת וקטור האתחול מבצעים: For  i = 0  to  ( i v l e n g t h − 1 )  do: CLOCK _ KG ( R , S ,  TRUE  , IV i ) {\displaystyle {\text{For }}i=0{\text{ to }}(ivlength-1){\text{ do: CLOCK}}\_{\text{KG}}(R,S,{\text{ TRUE }},{\text{IV}}_{i})} לטעינת המפתח מבצעים: For  i = 0  to  79  do: CLOCK _ KG ( R , S ,  TRUE  , k i ) {\displaystyle {\text{For }}i=0{\text{ to }}79{\text{ do: CLOCK}}\_{\text{KG}}(R,S,{\text{ TRUE }},k_{i})} ואז מריצים את הצופן 100 פעימות לצורך הכנה. בשלב זה הפלט אינו משמש כמפתח ההצפנה. For  i = 0  to  99  do: CLOCK _ KG ( R , S ,  TRUE  , 0 ) {\displaystyle {\text{For }}i=0{\text{ to }}99{\text{ do: CLOCK}}\_{\text{KG}}(R,S,{\text{ TRUE }},0)} שני המצבים התחתונים של האוגרים R {\displaystyle R} ו- S {\displaystyle S} בהתאמה, מחוברים ב-XOR ‏: r 0 ⊕ s 0 {\displaystyle r_{0}\oplus s_{0}} מהם מתקבלת סיבית פסאודו-ראנדומלית אחת המהווה חלק מזרם המפתח המשמש להצפנת המידע. הקריאה לפרוצדורה להפעלת הצופן במקרה זה מבוצעת עם הפרמטר MIXING = FALSE {\displaystyle {\text{MIXING}}={\text{FALSE}}} וסיבית קלט 0 כלומר עבור כל סיבית מידע m i {\displaystyle m_{i}} מבצעים: c i = CLOCK _ KG ( R , S ,  FALSE  , 0 ) ⊕ m i {\displaystyle c_{i}={\text{CLOCK}}\_{\text{KG}}(R,S,{\text{ FALSE }},0)\oplus m_{i}} פענוח מתבצע באותה דרך בדיוק: m i = CLOCK _ KG ( R , S ,  FALSE  , 0 ) ⊕ c i {\displaystyle m_{i}={\text{CLOCK}}\_{\text{KG}}(R,S,{\text{ FALSE }},0)\oplus c_{i}} ב-2005 במהלך בדיקת הצופן על ידי eSTREAM התגלו שלוש חולשות בגרסה המקורית. העובדה שהזיכרון הכולל הוא 160 סיביות שהוא המינימלי ביותר האפשרי (מינימום הזיכרון הדרוש כדי להבטיח את ביטחון הצופן מקובל שיהיה פי שנים מגודל המפתח), עדיין מתאפשרת התקפת איזון זמן/זיכרון/דטה שפורסמה לראשונה על ידי אלכס ביריוקוב ועדי שמיר. למרות הצהרת המפתחים שמינימום מחזוריות הצופן היא 2 40 {\displaystyle 2^{40}} , האנטרופיה של המצב הפנימי (הזיכרון) נחלשת עם הזמן ככל שהצופן פועל. המבקרים מציינים שגילו קבוצה קטנה של מפתחות הצפנה שנקראים 'מפתחות חלשים' במובן ששימוש בהם מאפשר לנחש את המצב הפנימי. בכל אופן המפתחים היו מודעים לעובדה זו אך למען שמירה על יעילות בחרו להתעלם מכך בטענה שהסבירות נמוכה מ- 2 − 80 {\displaystyle 2^{-80}} שמפתח כזה ייבחר באקראי. אולם למעשה התגלה שהיא גבוהה במעט ממה שהעריכו. גרסת MICKEY 2 המתוארת כאן טובה יותר במובן שההתקפות המתוארות אינן יעילות כנגדה. בשנת 2013 פותחה התקפה כנגד MICKEY 2.0 שהיא שיפור של התקפת Differential Fault Attack בקיצור DFA שיכולה לחשוף את המצב הפנימי כולו בשלב אתחול הצופן בתוך 2 16.7 {\displaystyle 2^{16.7}} הזרקות ובתוך 2 32.5 {\displaystyle 2^{32.5}} ניסיונות חישוב בממוצע. ההתקפה מבוססת על יכולת התוקף לגרום לסיביות שגויות אקראיות במצב פנימי של הצופן והיא מנצלת את העובדה שפונקציית הפלט וכן פעולות עדכון מסוימות פשוטות מדי. ייתכן שאפשר לשפר את ביטחון הצופן על ידי כמה התאמות. לדעת מחברי ההתקפה היא ישימה כנגד כל הצפנים שנבחרו על ידי eSTREAM בקטגוריית חומרה. צופן זרם eSTREAM portfolio page MICKEY 2.0 Improved Differential Fault Attack on MICKEY 2.0