מחזור ב-Twofish מתקדם כך:
Q3 מסובב סיבית אחת
לשמאל.
Q0 ו-Q1 מסובבים 8 סיביות לשמאל, כל אחד מושלם לארבעה
S-box-ים תלויי מפתח בעלי קלט
ופלט בגודל 8 סיביות. ה-S-box-ים
תלויי המפתח האלה שווים לשימוש ב-S-box-ים
קבועים עם קלט ופלט בגודל 8 סיביות שמתחלפים עם ה-XOR של
תת מפתח חומרי, וה-S-box-ים
הקבועים בעצמם מורכבים מ-S-box-ים
קטנים יותר עם קלט ופלט בגודל 4 סיביות.
אז, הסיביות בכל אחד מאוחדות ע"י שימוש במטריצת כפל עם
המטריצה הבאה (שנקראת מטריצת MDS):
01 EF 5B 5B
5B EF EF 01
EF 5B 01 EF
EF 01 EF 5B
מעל שדה גלואה 28 עם הפולינום
המודולארי 1 + x8 + x6
+ x5 + x3.
זאת אומרת, שכאשר בית מוכפל באיבר מהמטריצה, במקום
שתתבצע מכפלה אמיתית, שאפשר לחשוב עליה כהזזה של בית הקלט, והוספתו לסה"כ כאשר
הסיבית האחרונה שלו היא סיבית אחת מעל הסיבית של המספר במטריצה, פעולה דומה מתבצעת,
אך מתבצע XOR במקום חיבור.
התוצאה של "הכפל" היא מספר בגודל 16 סיביות. אז מצמצמים אותו
למספר בגודל 8 סיביות כך: הפולינום המודולארי, שמתייחסים אליו כמספר הבינארי
101101001, מוזז שמאלה עד שהסיבית הראשונה שלו חופפת לסיבית הראשונה של התוצאה. אז
זה עובר XOR עם המספר, ומוזז ימינה עד שהסיבית הראשונה
חופפת לסיבית הראשונה הנותרת, וזה חוזר חלילה עד שהמספר בגודל 8 סיביות או פחות.
לבסוף, שתי הקבוצות שקיבלנו בגודל 32 סיביות מעורבבות אחת עם השנייה ע"י מהפך פסאודו האדאמרד.
האחד שנוצר מ Q1 לאחד שנוצר מ-Q0, אז האחד שנוצר מ-Q0
מחובר לאחד שנוצר מ-Q1.
אז, תת המפתח הראשון של המחזור מחובר לזה שנוצר מ-Q0, והתוצאה עוברת XOR
עם Q2. ת המפתח השני מחובר לזה שנוצר מ-Q1, והתוצאה עוברת XOR
עם Q3.
לבסוף, Q2 מוזז
סיבית אחת לימין, ושני החצאים של הגוש מוחלפים (Q0
מוחלף עם Q2, ו-Q1
מוחלף עם Q3).
כמו ב- DES, החצאים לא מוחלפים
אחרי המחזור האחרון.
שימו לב כי מטריצת הכפל, מכיוון שהיא משתמשת ב-XOR (במקום חיבור) של תוצאות
נפרדות, יכולה להיות מחושבת מראש, שזה יגרום לכך שכל
ערך ב-S-box
תהיה ברוחב 32 סיביות במקום 8 סיביות.
|