IDEA

International Data Encryption Algorithm (בראשי תיבות: IDEA) הוא צופן בלוקים סימטרי שהוצע ב-1991 על ידי ג'יימס מסי מהמכון הטכנולוגי של ציריך ו-Xuejia Lai מאוניברסיטת ג'יאו טונג שאנגחאי כדי להוות מחליף ראוי ל-DES הוותיק. הצופן פועל על בלוק קלט באורך 64 סיביות, עם מפתח באורך 128 סיביות והוא מבוסס על הקונספט "שילוב פעולות מחבורות אלגבריות שונות". הצופן הומלץ על ידי מומחים וההתקפה היעילה ביותר כנגדו היא בסיבוכיות של 2 126 {\displaystyle 2^{126}} בערך – קצת פחות מכוח גס. חסרונותיו העיקריים, בלוק המידע הוא רק 64 סיביות (כלומר סיבוכיות מקום נמוכה ביחס לדרישת התקן המתקדם – 128 סיביות לפחות) וכן קצת איטי ביישום הן בתוכנה והן בחומרה. זמינותם של אלגוריתמים חדשים, מהירים ובטוחים יותר הותירה את IDEA מאחור, אם כי עדיין נתמך בפועל במערכות אבטחה רבות כולל PGP ו-OpenSSL. השם IDEA הוא סימן רשום ונרשם כפטנט שתוקפו פג ב-2012 וכעת חופשי לשימוש. IDEA הוא מעין שילוב של רשת החלפה-תמורה עם רשת פייסטל ובמקום תיבות החלפה מנצל פעולות אריתמטיות בשלוש חבורות אלגבריות שונות על תת-בלוקים בגודל 16 סיביות, להשגת פיזור (Diffusion) מהיר וערבוב (Confusion) גבוה. פיזור נחוץ להבטיח שכל סיבית טקסט גלוי וכל סיבית מפתח, ישפיעו על כל סיביות הטקסט המוצפן במידה שווה. ערבוב מטשטש את הקשר בין הטקסט המוצפן לטקסט הגלוי והמפתח. רשת פייסטל בנויה כך שהצפנה ופענוח ייעשו באמצעות אותה פונקציה עם מפתח שונה (להלן). ידוע על מפתחות הצפנה "חלשים" של IDEA שלא מומלץ להשתמש בהם (כגון אם הייצוג הבינארי מכיל רצף ארוך של אפסים), בפועל אם המפתח נבחר באקראי הסיכוי נמוך ביותר שיבחר מפתח חלש, מלבד זאת קיימות טכניקות למנוע זאת. תהליך ההצפנה מורכב משמונה סבבים של פעולות אריתמטיות וטרנספורמציה מסיימת (ראו שורה אחרונה בפסאודו קוד). האלגוריתם מקבל בלוק קלט בגודל 64 סיביות, מחולק לארבעה מקטעים בני 16 סיביות כל אחד X 1 , . . . , X 4 {\displaystyle X_{1},...,X_{4}} ומפיק ארבעה בלוקים Y 1 , . . . , Y 4 {\displaystyle Y_{1},...,Y_{4}} בסיוע 52 תת-מפתחות Z 1 , . . . , Z 52 {\displaystyle Z_{1},...,Z_{52}} המחולקים כדלהלן: שישה תת-מפתחות עבור כל סבב כפול שמונה סבבים המסומנים Z 1 ( r ) , . . . , Z 6 ( r ) {\displaystyle Z_{1}^{(r)},...,Z_{6}^{(r)}} כאשר r = 1 , . . , 8 {\displaystyle r=1,..,8} מייצג את מספר הסבב. וארבעה נוספים עבור הפעולה המסיימת המסומנים Z 1 ( 9 ) , Z 2 ( 9 ) , Z 3 ( 9 ) , Z 4 ( 9 ) {\displaystyle Z_{1}^{(9)},Z_{2}^{(9)},Z_{3}^{(9)},Z_{4}^{(9)}} . בכל סבב מתבצע צירוף של סדרת פעולות אריתמטיות: מיפוי סיביות בשדה בינארי מורחב F 2 n {\displaystyle F_{2^{n}}} מעל F 2 {\displaystyle F_{2}} עם פעולת XOR המסומן בסמל ⊕ {\displaystyle \oplus } . חיבור שלמים מודולו 2 16 {\displaystyle 2^{16}} (חבורה חיבורית Z 2 16 {\displaystyle Z_{2^{16}}} ), המסומן ב- ⊞ {\displaystyle \boxplus } . כפל שלמים מודולו 2 16 + 1 {\displaystyle 2^{16}+1} (חבורה כפלית Z 2 16 + 1 {\displaystyle Z_{2^{16}+1}} ) ומסומן בקיצור ⊙ {\displaystyle \odot } . זהו כפל מודולרי רגיל למעט הכלל שמחרוזת 16 אפסים מייצגת את הערך 2 16 {\displaystyle 2^{16}} (כזכור לא ניתן לייצג את 2 16 {\displaystyle 2^{16}} ב-16 סיביות, על כן סיבית 1 הגבוהה מרומזת) לדוגמה 00...00 ⋅ 10...00 = 10...01 {\displaystyle {\mbox{00...00}}\cdot {\mbox{10...00}}={\mbox{10...01}}} בגלל ש- 2 16 ⋅ 2 15  mod  ( 2 16 + 1 ) = 2 15 + 1 {\displaystyle 2^{16}\cdot 2^{15}{\mbox{ mod }}(2^{16}+1)=2^{15}+1} . מבצעים בלולאה שמונה סבבים (שימו לב שהאינדקס מתחיל באחד ולא באפס. Z i ( r ) {\displaystyle Z_{i}^{(r)}} מייצג את ערך המפתח בכניסה i {\displaystyle i} במפתח-סבב r {\displaystyle r} במערך הדו-ממדי): For  r = 1  to  8  do  {\displaystyle {\text{For }}r=1{\text{ to }}8{\text{ do }}} X 1 = X 1 ⊙ Z 1 ( r ) {\displaystyle X_{1}=X_{1}\odot Z_{1}^{(r)}} , {\displaystyle \quad } {\displaystyle \quad } X 2 = X 2 ⊙ Z 2 ( r ) {\displaystyle X_{2}=X_{2}\odot Z_{2}^{(r)}} . X 3 = X 3 ⊞ Z 3 ( r ) {\displaystyle X_{3}=X_{3}\boxplus Z_{3}^{(r)}} , {\displaystyle \quad } {\displaystyle \quad } X 4 = X 4 ⊞ Z 4 ( r ) {\displaystyle X_{4}=X_{4}\boxplus Z_{4}^{(r)}} . k = Z 5 ( r ) ⊙ ( X 1 ⊕ X 3 ) {\displaystyle k=Z_{5}^{(r)}\odot (X_{1}\oplus X_{3})} t 1 = Z 6 ( r ) ⊙ k ⊞ ( X 2 ⊕ X 4 ) {\displaystyle t_{1}=Z_{6}^{(r)}\odot k\boxplus (X_{2}\oplus X_{4})} t 2 = k ⊞ t 1 {\displaystyle t_{2}=k\boxplus t_{1}} a = X 1 ⊕ t 1 {\displaystyle a=X_{1}\oplus t_{1}} , {\displaystyle \quad } {\displaystyle \quad } x 1 = X 3 ⊕ t 1 {\displaystyle x_{1}=X_{3}\oplus t_{1}} , {\displaystyle \quad } {\displaystyle \quad } X 3 = a {\displaystyle X_{3}=a} a = X 2 ⊕ t 2 {\displaystyle a=X_{2}\oplus t_{2}} , {\displaystyle \quad } {\displaystyle \quad } x 2 = X 4 ⊕ t 2 {\displaystyle x_{2}=X_{4}\oplus t_{2}} , {\displaystyle \quad } {\displaystyle \quad } X 4 = a {\displaystyle X_{4}=a} Y 1 = X 1 ⋅ Z 1 ( 9 ) {\displaystyle Y_{1}=X_{1}\cdot Z_{1}^{(9)}} , {\displaystyle \quad } {\displaystyle \quad } Y 2 = X 2 ⋅ Z 2 ( 9 ) {\displaystyle Y_{2}=X_{2}\cdot Z_{2}^{(9)}} , {\displaystyle \quad } Y 3 = X 3 ⊞ Z 3 ( 9 ) {\displaystyle Y_{3}=X_{3}\boxplus Z_{3}^{(9)}} , {\displaystyle \quad } {\displaystyle \quad } Y 4 = X 4 ⊞ Z 4 ( 9 ) {\displaystyle Y_{4}=X_{4}\boxplus Z_{4}^{(9)}} המפתח המורחב כולל מערך של 52 מילים בגודל 16 סיביות כל אחת (סך הכול 832 סיביות). תהליך ההכנה בהצעה המקורית הוא כדלהלן: תחילה 128 סיביות המפתח הראשוני המסופק על ידי המשתמש מחולקות לשמונה קבוצות של 16 סיביות כל אחת, אותם מציבים בשמונה הכניסות הראשונות לפי הסדר, מבצעים הזזה מעגלית של 128 סיביות המפתח 25 פוזיציות שמאלה ואת התוצאה מציבים בשמונה הכניסות הבאות, שוב מזיזים בהזזה מעגלית 25 פוזיציות ואת התוצאה בכניסות הבאות וכן הלאה, שש פעמים עד להשלמת 48 כניסות ואז מבצעים הזזה נוספת ומשלימים את ארבע הכניסות האחרונות בחלק מהתוצאה. להלן ניסוח פורמלי של תהליך הכנת מפתח (שונה במעט מהתיאור המקורי): תחילה מכינים מערך נלווה S 0 , . . . , S 54 {\displaystyle S_{0},...,S_{54}} , בשמונה הכניסות הראשונות מציבים את המפתח המסופק על ידי המשתמש ואז עבור היתר, מבצעים לולאה i = 8 , . . . , 54 {\displaystyle i=8,...,54} כדלהלן: אם ( i + 2 ) {\displaystyle (i+2)} מתחלק ב- 8 {\displaystyle 8} מציבים: S i = ( S i − 7  ROL 9 ) ⊕ ( S i − 14  ROR 7 ) {\displaystyle S_{i}=(S_{i-7}{\mbox{ ROL}}_{9})\oplus (S_{i-14}{\mbox{ ROR}}_{7})} . אחרת, אם ( i + 1 ) {\displaystyle (i+1)} מתחלק ב- 8 {\displaystyle 8} מציבים: S i = ( S i − 15  ROL 9 ) ⊕ ( S i − 14  ROR 7 ) {\displaystyle S_{i}=(S_{i-15}{\mbox{ ROL}}_{9})\oplus (S_{i-14}{\mbox{ ROR}}_{7})} . ביתר המקרים מציבים: S i = ( S i − 7  ROL 9 ) ⊕ ( S i − 6  ROR 7 ) {\displaystyle S_{i}=(S_{i-7}{\mbox{ ROL}}_{9})\oplus (S_{i-6}{\mbox{ ROR}}_{7})} . מבצעים לולאה אחרונה שבה מעבירים את הערכים ל- Z {\displaystyle Z} כאשר האינדקסים הם r = 1 , . . . , 9 {\displaystyle r=1,...,9} ו- j = 1 , . . . , 6 {\displaystyle j=1,...,6} : Z j , r = S 6 ⋅ ( r − 1 ) + j − 1 {\displaystyle Z_{j,r}=S_{6\cdot (r-1)+j-1}} הפעולות ROR ו-ROL הן הזזה מעגלית בסיביות ימינה או שמאלה בהתאמה במספר פוזיציות לפי המציין התחתי. לפענוח תחילה מחשבים את 52 מפתחות הפענוח מתוך מפתחות ההצפנה באמצעות חישוב המספרים ההופכיים שלהם. כלומר Z − 1 {\displaystyle Z^{-1}} מייצג הופכי כפלי של Z {\displaystyle Z} מודולו 2 16 + 1 {\displaystyle 2^{16}+1} כך שמתקיים Z ⋅ Z − 1 ≡ 1  (mod  2 16 + 1 ) {\displaystyle Z\cdot Z^{-1}\equiv 1{\mbox{ (mod }}2^{16}+1)} וכן − Z {\displaystyle -Z} הוא הופכי חיבורי או המשלים של Z {\displaystyle Z} מודולו 2 16 {\displaystyle 2^{16}} (במקרה זה המשלים יהיה 2 16 − Z {\displaystyle 2^{16}-Z} ). ההופכי של XOR נותר זהה. לצורך המחשה אם מפתחות הסבב הם Z 1 ( r ) , Z 2 ( r ) , Z 3 ( r ) , Z 4 ( r ) , Z 5 ( r ) , Z 6 ( 1 ) {\displaystyle Z_{1}^{(r)},Z_{2}^{(r)},Z_{3}^{(r)},Z_{4}^{(r)},Z_{5}^{(r)},Z_{6}^{(1)}} מפתחות הפענוח המקבילים להם יהיו Z 1 ( r ) − 1 , Z 2 ( r ) − 1 , − Z 3 ( r ) , − Z 4 ( r ) , Z 5 ( r ) , Z 6 ( r ) {\displaystyle {Z_{1}^{(r)}}^{-1},{Z_{2}^{(r)}}^{-1},-Z_{3}^{(r)},-Z_{4}^{(r)},Z_{5}^{(r)},Z_{6}^{(r)}} (שני האחרונים מייצגים XOR לכן הם הופכיים של עצמם) – בסדר הפוך, דהיינו תחילה ארבעת המפתחות המקבילים לטרנספורמציה האחרונה המסומנים 9 ולאחר מכן 48 המפתחות הנותרים בסדר הפוך, שישה עבור כל סבב. ואז הפענוח מתבצע באופן זהה להצפנה (בפסאודו-קוד לעיל). הכנת מפתח הפענוח בניסוח פורמלי מתוארת להלן, כאשר DK מייצג את מפתח הפענוח (decryption key). מבצעים תשעה סבבים כדלהלן: For  j = 1  to  9  do  {\displaystyle {\text{For }}j=1{\text{ to }}9{\text{ do }}} D K 1 ( 10 − j ) = Z 1 ( j ) − 1 {\displaystyle DK_{1}^{(10-j)}={Z_{1}^{(j)}}^{-1}} D K 2 ( 10 − j ) = Z 2 ( j ) − 1 {\displaystyle DK_{2}^{(10-j)}={Z_{2}^{(j)}}^{-1}} D K 3 ( 10 − j ) = 2 16 − Z 3 j {\displaystyle DK_{3}^{(10-j)}=2^{16}-Z_{3}^{j}} D K 4 ( 10 − j ) = 2 16 − Z 4 j {\displaystyle DK_{4}^{(10-j)}=2^{16}-Z_{4}^{j}} D K 5 ( 9 − j ) = Z 5 ( j ) {\displaystyle DK_{5}^{(9-j)}=Z_{5}^{(j)}} D K 6 ( 9 − j ) = Z 6 ( j ) {\displaystyle DK_{6}^{(9-j)}=Z_{6}^{(j)}} הצופן אינו עושה שימוש בתיבות החלפה (S-box) אלא תחת זאת שילוב פעולות אלגבריות בחבורות שונות. פעולות אילו נבחרו בשל היחס הסטטיסטי בין המשתנים X , Y , Z {\displaystyle X,Y,Z} בפעולה Y = X ∗ Z {\displaystyle Y=X*Z} עם תכונת סודיות מושלמת, כלומר שאם אחד מהמשתנים נבחר באקראי במידה שווה מתוך כל איברי החבורה אזי שני המשתנים האחרים יהיו בלתי תלויים סטטיסטית. מבנה הצופן נקרא מבנה כפל-חיבור בקיצור מבנה MA (כמתואר בתרשים). האינטראקציה בין סוגים שונים של פעולות בחבורות מניבה את הערבוב (Confusion) הדרוש. השילוב נעשה באופן שבכל קבוצה של שלוש פעולות אלגבריות לא תתקיים דיסטריבוטיביות או אסוציאטיביות. למשל אפשר לראות שאם מציבים a = b = c = 1 {\displaystyle a=b=c=1} בשתי המשוואות הבאות החוקים האמורים אינם מתקיימים: a ⊞ ( b ⊙ c ) ≠ ( a ⊞ b ) ⊙ ( a ⊞ c ) {\displaystyle a\boxplus (b\odot c)\neq (a\boxplus b)\odot (a\boxplus c)} a ⊞ ( b ⊕ c ) ≠ ( a ⊞ b ) ⊕ c {\displaystyle a\boxplus (b\oplus c)\neq (a\boxplus b)\oplus c} לפי טענת המפתחים האלגוריתם מעוצב כדי להתמודד מול איום קריפטואנליזה דיפרנציאלית. נכון ל-2007 ההתקפה הטובה ביותר כנגד האלגוריתם הייתה בסיבוכיות של 2 126.8 {\displaystyle 2^{126.8}} עם 2 64 {\displaystyle 2^{64}} טקסטים גלויים. למרות היותו איטי מספק האלגוריתם ביטחון טוב יותר בהשוואה ל-DES אולם חלש יחסית לאלגוריתמים חדשים דוגמת AES או Twofish. העובדה שגודל הבלוק הוא רק 64 סיביות מעיבה מעט על ביטחונו. DES SAFER TEA צופן בלוקים A Proposal for a New Block Encryption Standard