יישום ממוטב של האלגוריתם במחשב 32 סיביות צורך כ-18 מחזורי שעון לבית או 1820 מחזורי שעון במעבד 8 סיביות. Twofish ניתן ליישום בחומרה בעלות של 14,000 שערים. תהליך הרחבת המפתח וכן סבב ההצפנה מתחשב במגוון אפשרויות כדי לאפשר איזון בין ביצועים לביטחון בהתאם לצורך. ההתקפה הטובה ביותר הידועה כנגד האלגוריתם היא התקפת גלוי נבחר עם formula_5 טקסטים ו-formula_6 ניסיונות בחמשה סבבים בלבד. עם מפתח בגודל 128 סיביות יישום בתוכנה של Twofish איטי מעט בהשוואה לריינדל ואילו עם מפתח 256 סיביות קיים יתרון קל ל-Twofish.
שיקולי פיתוח.
אלגוריתם Twofish פותח במיוחד לפי דרישות תקן ההצפנה של המכון הלאומי לתקנים וטכנולוגיה של ארצות הברית:
תיאור האלגוריתם.
קלט: 128 סיביות טקסט קריא המיוצגים על ידי 16 בתים formula_8, מפתח formula_9 בגודל 128, 192 או 256 סיביות.
פלט: 16 בתי צופן formula_10.
1. הקלט מפוצל לארבע מילים, formula_11 של 32 סיביות כל אחת לפי סדר בתים קטן (little-endian) כלומר הספרה הפחות משמעותית מוצבת בבית הראשון שבכתובת הזיכרון. הנוסחה היא:
(הערה: במעבד עם סדר בתים קטן (כמו בארכיטקטורת x86), בשפות C ו-C++ אין צורך בפעולת חישוב כלשהי בהמרה זו ובהמרה האחרונה בסעיף 6, כיוון שניתן להתייחס למצביע הקלט כאל כמצביע לשלם-32 במקום לבתים או להשתמש במבנה Union, כך שסיביות הקלט והפלט נותרות במקומן).
2. שלב הלבנה; מבצעים XOR עם 4 מילות מהמפתח המורחב formula_13 (הכנת המפתח בהמשך):
3. בכל סבב מ-16 הסבבים, שתי המילים הראשונות formula_15 משמשות כקלט לפונקציה formula_16 (להלן) שמקבלת כפרמטר גם את מספר הסבב, המילה השלישית formula_17 מחוברת ב-XOR עם התוצאה הראשונה של formula_16 ולאחר מכן מסובבת בהזזה מעגלית סיבית אחת ימינה. המילה הרביעית formula_19 מסובבת בהזזה מעגלית שמאלה סיבית אחת ואז מחוברת ב-XOR עם התוצאה השנייה של formula_16. לאחר מכן שני החצאים מחליפים מקומות וחוזר חלילה. באופן פורמלי עבור formula_21 עד formula_22 מבצעים:
3.1 formula_23
3.2 formula_24
3.3 formula_25
3.4 formula_26
3.5 formula_27
כאן ROR מייצג Rotate Right שהיא פונקציית הזזה מעגלית לימין במספר סיביות לפי המציין התחתי ו-ROL מייצג Rotate Left.
4. מבצעים החלפה נוספת בין שני חצאי הקלט (למעשה מבטלים את ההחלפה מהסבב האחרון)
5. מבצעים הלבנה נוספת עם ארבע מילות מפתח מורחב נוספות.
formula_28
6. התוצאה מומרת בחזרה ל-16 בתים לפי אותו סדר בתים:
formula_29
פונקציה F.
הפונקציה formula_16 מקבלת שלושה פרמטרים: שתי מילים formula_15 ומספר הסבב formula_32 שמהווה אינדקס לערך המתאים במפתח המורחב. formula_33 משמש קלט לפונקציית formula_34 שמתוארת להלן המחזירה את formula_35. ו-formula_36 מסובב בהזזה מעגלית 8 סיביות שמאלה ואז משמש גם הוא קלט לפונקציה formula_34 שמחזירה את formula_38. התוצאות משולבות יחד באמצעות פונקציית PHT בה מוסיפים שתי מילים מתאימות מהמפתח המורחב לפי formula_32, הפלט הוא הזוג formula_40 ובניסוח פורמלי:
פונקציה g.
הפונקציה formula_34 מקבלת כפרמטר מילה אחת formula_46 בגודל 32 סיביות, מפצלת אותה לארבעה בתים, כל אחד מהם משמש אינדקס לתיבת ההחלפה המתאימה שמחזירה בית אחר. מייצגים את התוצאות כווקטור באורך 4 מעל השדה formula_1 ומכפילים במטריצת MDS בגודל 4x4 (ראה תרשים). התוצאה מומרת בחזרה למילה אחת:
formula_48
כאשר formula_52 היא תיבת החלפה ו-formula_53 הוא התוצאה של formula_34. לצורך המרה בין אלמנטים בשדה formula_1 לבין בתי הקלט משתמשים בפולינום הפרימיטיבי formula_56 ממעלה 8. האלמנט formula_57 כאשר מקדמיו בינאריים, מתאים לבית formula_58. זהו מיפוי טבעי במובן שפעולות חיבור הן בעצם XOR בלבד.
לצורך יעילות ביישום הן בתוכנה והן בחומרה מיישמים את הכפל במטריצה באמצעות סדרת פעולות XOR ו-Shift תוך שימוש בטכניקה שנקראת LFSR, כדלהלן:
והפונקציות L1, L2 הן אוגרי זיזה (LFSR) הראשון מבוסס על הסיבית הראשונה והשני על הסיביות הראשונה והשנייה והן מוגדרות כך:
(הסימן formula_65 מייצג הזזה לימין והסימן AND שנקרא וגם בודק האם הסיבית המתאימה דולקת, 0x02 היא סיבית LSB השנייה). התוצאה היא המרה של ערכי formula_66 למילה בגודל 32 סיביות בסדר בתים קטן לפי הנוסחה formula_67 (במעבד עם סדר בתים קטן, התוצאה מתקבלת במבנה הרצוי ואין צורך בהמרה כלשהי).
הרחבת מפתח.
המפתח המורחב מכיל מערך של 40 מילים formula_68 וארבע תיבות החלפה מהפונקציה formula_34. המפתח כאמור יכול להיות formula_70, formula_71 או formula_72 סיביות. לצורך הכנת המפתח המורחב יהי formula_73, מכינים מהמפתח מערך formula_9 בגודל formula_75 בתים formula_76 (מרפדים באפסים אם נדרש), ממירים ל-formula_77 מילים בגודל 32 סיביות לפי סדר בתים little-endian. ואז ממירים את formula_9 לשני וקטורים (זוגי ואי זוגי) כלומר formula_79 וכן formula_80. וקטור נוסף בגודל formula_81 מיוצר מהמפתח בקבוצות של 8 סיביות, אותם מפרשים כווקטור מעל formula_1 ומכפילים במטריצה 4x8 של קוד RS (ריד-סולומון) כמתואר בתרשים להלן. פעולת הכפל במטריצה נראית כך:
formula_83
ואז מחשבים עבור formula_85 בסדר הפוך formula_86:
להכפלה במטריצה בשיטת ריד-סולומון, משתמשים בפולינום פרימיטיבי formula_88.
שלושת הווקטורים formula_89 הם הבסיס לתהליך הרחבת המפתח.
פונקציה h.
הפונקציה המשמשת להרחבת המפתח מקבלת פרמטר formula_46 בגודל 32 סיביות ורשימה formula_91 של מילות 32 סיביות באורך formula_81 ומפיקה מילה אחת. הפונקציה פועלת באופן איטרטיבי formula_81 שלבים, בכל שלב 4 בתים עוברים בתיבות החלפה קבועות ומחוברים ב-XOR עם בתים מהרשימה formula_94 ולסיום מועברים שוב בתיבות ההחלפה ומוכפלים במטריצת MDS. כדלהלן:
תחילה מפצלים לבתים כאשר formula_85 ו-formula_96:
בשלב החלפה ו-XOR תחילה מציבים formula_99 כאשר formula_100 ואז מחשבים לפי ערך formula_81:
כאשר formula_102 הן תמורות קבועות של ערכים בגודל 8 סיביות המוגדרות להלן.
הווקטור formula_103 מוכפל במטריצת MDS כמו בפונקציה formula_34 לעיל:
תיבות החלפה S-box.
כאמור תיבות ההחלפה תלויות במפתח, ליתר דיוק בוקטור formula_107 שהוכן מהמפתח לעיל. דהיינו ארבע התיבות מחושבות מתוך formula_108 עבור formula_109 בפונקציה formula_110 כאשר הרשימה formula_94 היא formula_107 בתמציתיות: formula_113.
המפתח המורחב K.
עם השלמת הגדרת הפונקציה formula_110, אפשר להשלים את תהליך הרחבת המפתח כדלהלן:
הקבוע formula_120 משמש כאן להכפלת בתים, התכונה שלו היא שהמילה formula_121 מורכבת מארבעה בתים שווים בערכם ל-formula_122. שים לב שנעשה שימוש בהזזה מעגלית, בווקטורים formula_123 ובפונקציית PHT. התמורות הקבועות formula_124 ו-formula_125 מחושבות מתוך 4 תמורות שונות, עבור קלט formula_126 מחשבים את הפלט formula_127 על ידי:
תחילה מפצלים את הבית לשני ניבלים, שעוברים שלב ערבוב עם פונקציה חד-חד-ערכית ועל, כל ניבל עובר בנוסף בתיבת החלפה של 4 סיביות קבועה משלו ואז מאחדים את הניבלים. תיבות ההחלפה 4-סיביות הן:
פענוח.
צופן Twofish משתמש בתהליך הכנה מעט שונה עבור פענוח. השוני הוא בסדר ההפוך של המפתח המורחב formula_13. כמובן שבגרסאות הממוטבות ביישום האלגוריתם בפועל, נמנעים בדרך כלל מפעולות אריתמטיות מסובכות, אותם מחליפים בטבלאות החלפה פשוטות בהם הערכים קודדו מראש בהתאם. ובמקרה של יישום בחומרה מוגבלת כמו כרטיס חכם, מפרקים פעולות לפקודות בסיסיות ביותר כמו Shift ו-XOR, לעיתים על חשבון יעילות.
בוץ' הרטמן
גרגורי
בעילה
עודד שמואלי
עודד שמואלי (נולד ב-12 בדצמבר 1952) הוא מדען ישראלי בתחום מדעי המחשב, המכהן כמשנה למחקר (מנל"מ) של נשיא הטכניון וכמנהל מוסד הטכניון למחקר ופיתוח בע"מ.
שמואלי הוא פרופסור מן המניין בפקולטה למדעי המחשב בטכניון, וחבר במעבדה לתכנה ומערכות שבפקולטה. הומחזיק משנת 2006 בקתדרה ונושא השם The Andrew J. and Erna Viterbi Chair in Information Systems/Computer Science.
עיסוקו המחקרי הוא בתחום מסדי נתונים ופונה לכיוונים הבאים: מסחר אלקטרוני; משא ומתן אוטומטי; אספקטים מערכתיים של מערכות מסדי נתונים; אספקטים תאורטיים ומעשיים של ביצוע שאילתות במסדי נתונים יחסיים, במסדים מבוססי XML ובמסדי נתונים מבוססי לוגיקה (Datalog) וה-WWW.
חיים אישיים והשכלה.
עודד שמואלי נולד וגדל בשכונת צהלה בתל אביב. למד ב"תיכון חדש", שירת 3 שנים וחצי בצבא הגנה לישראל, במלחמת יום הכיפורים פיקד על מחלקת חרמ"ש בגדוד 184 של חטיבה 14 ולחם בחזית המצרית, הוא נפצע במלחמה באורח קשה בעת פינוי מעוז "פורקן", על פועלו זכה בצל"ש אלוף.
בשנת 1977 סיים בהצטיינות תואר ראשון בפיזיקה באוניברסיטת ברנדייס במסצ'וסטס.
תחום המחקר עניין אותו ולכן המשיך ללימודים במסלול ישיר לדוקטורט במתמטיקה שימושית (מדעי המחשב) באוניברסיטת הרווארד בקיימברידג' מסצ'וסטס. בשנת 1978 נשא לאישה את דבורה. בשנת 1979 סיים את התואר השני ובשנת 1981 הוענק לו התואר דוקטור בגין חיבור העוסק תפקיד הבסיסי של סכמות עץ בפתרון שאילתות במסדי נתונים יחסיים.
לאחר קבלת התואר עבד שמואלי כמרצה ועמית פוסט דוקטורט באוניברסיטת הרווארד עד 1982. באוקטובר 1982 הצטרף כחבר סגל ההוראה הבכיר בפקולטה למדעי המחשב שבטכניון, ולימד מאז קורסים בתחומים של מבני נתונים, מערכות קבצים ומערכות מסדי נתונים.