Trivium

טריוויום (באנגלית: Trivium) הוא צופן זרם אסינכרוני קל משקל המיועד לחומרה ומאפשר איזון גמיש בין תפוקה לשטח (בשערים). הוצע במסגרת תחרות צופן זרם שאורגנה על ידי eSTREAM, נבחר ב-2008 ברשימת הצפנים המועדפים ונכלל בפורטפוליו בקטגוריית חומרה. הוא אינו מוגן בפטנט ונכלל בתקן איזו ISO/IEC 29192-3. 
תרשים צופן טריוויום
טריוויום מקבל מפתח הצפנה באורך 80 סיביות, ווקטור אתחול (IV) באורך 80 סיביות, הזיכרון הפנימי שלו מכיל 288 סיביות והוא מורכב משלושה אוגרים ממושבים אי-ליניאריים (NLFSR) באורכים: 93, 84 ו-111 סיביות. האלגוריתם מכיל שני מצבי עבודה, מצב אתחול של המפתח וה-IV ומצב עבודה שבו מופק זרם מפתח פסאודו-אקראי. בכל פעימה שלוש סיביות מהמצב הפנימי מעודכנות באמצעות פונקציית משוב אי-ליניארית והפלט הוא סיבית פסאודו-אקראית אחת. בהגדרה הצופן יכול להפיק <math>2^{64}</math> סיביות ממפתח/IV נתונים.

הצופן פותח ב-2005 על ידי Bart Preneel ו-Christophe De Cannière כחלק מניסוי על מנת לברר כמה קטן צופן זרם יכול להיות מבלי לוותר על ביטחון, מהירות או גמישות. בדרך כלל צופן זרם בסגנון LFSR בגלל רגישותו היתרה סביר שיהיה פגיע להתקפות קריפטוגרפיות ייתכן הרסניות לכן המפתחים מקווים שביקורת ציבורית תביא לאימון רב יותר בביטחון הצופן. העיצוב האלגנטי והפשטות שלו משכו תשומת לב רבה מצד הקהילה האקדמית. נכון ל-2017 טרם נמצאה התקפה קריפטוגרפית הרסנית נגד הצופן מלבד התקפת קובייה של עדי שמיר ואיתי דינור וסוג של קריפטואנליזה דיפרנציאלית שמוצאת "מפתחות חלשים" (שפוגעים באקראיות הצופן). שתיהן אינן מהוות איום של ממש על הצופן המלא אלא רק על גרסאות מוחלשות שלו.

==תיאור הצופן==
מחולל זרם המפתח מכיל מצב פנימי בגודל 288 סיביות המיוצגות על ידי המערך <math>s_1,...,s_{288}</math> וכן תהליך איטרטיבי שמחלץ את ערכן של 15 סיביות ספציפיות מתוך הזיכרון הפנימי איתן הוא מעדכן שלוש סיביות של המצב הפנימי ומחשב סיבית פלט אחת <math>z_i</math>. בשלב זה כל סיביות המצב מוזזות במעגליות צעד אחד, התהליך חוזר על עצמו שוב ושוב עד שמתקבלות <math>2^{64}</math> סיביות של זרם מפתח או פחות לפי הצורך, אותו מחברים ב-XOR עם זרם הנתונים המיועד להצפנה. לסיכום הפסאודו קוד הבא מכיל תיאור שלם של האלגוריתם:
{| dir="ltr"
|-
|
:<math>\text{for }i = 1\text{ to }N\text{ do}</math>
:<math>\ \ \ \ t_1 \leftarrow s_{66} \oplus s_{93}</math>
:<math>\ \ \ \ t_2 \leftarrow s_{162} \oplus s_{177}</math>
:<math>\ \ \ \ t_3 \leftarrow s_{243} \oplus s_{288}</math>
:<math>\ \ \ \ z_i \leftarrow t_1 \oplus t_2 \oplus t_3</math>
:<math>\ \ \ \ t_1 \leftarrow t_1 \oplus s_{91} \land s_{92} \oplus s_{171}</math>
:<math>\ \ \ \ t_2 \leftarrow t_2 \oplus s_{175} \land s_{176} \oplus s_{264}</math>
:<math>\ \ \ \ t_3 \leftarrow t_3 \oplus s_{286} \land s_{287} \oplus s_{69}</math>
:<math>\ \ \ \ (s_1, s_2,...,s_{93}) \leftarrow (t_3, s_1,...,s_{92})</math>
:<math>\ \ \ \ (s_{94}, s_{95},...,s_{177}) \leftarrow (t_1, s_{94},...,s_{176})</math>
:<math>\ \ \ \ (s_{178}, s_{279},...,s_{288}) \leftarrow (t_2, s_{178},...,s_{287})</math>
:<math>\text{end}</math>
|}
הסימן<math> \oplus</math> הוא האופרטור XOR והסימן <math>\land</math> הוא האופרטור וגם שהן הפעולות המקבילות לחיבור וכפל בשדה הבינארי <math>GF(2)</math>.

===הכנת המפתח ווקטור האתחול===
האלגוריתם מתחיל בטעינת המפתח ווקטור האתחול לתוך המצב הפנימי ויתרת סיביות המצב הפנימי מאופסות למעט שלוש הסיביות האחרונות: <math>s_{286}</math>,<math>s_{287}</math> ו-<math>s_{288}</math>. המפתח נטען ראשון ואחריו אפסים עד פוזיציה 93. החל מ-פוזיציה 94 טוענים את וקטור האתחול ולאחריו מאפסים את יתרת הסיביות. ואז בדומה לתהליך המתואר לעיל, המצב הפנימי מסובב במשך ארבע פעימות מבלי להפיק סיביות זרם מפתח. המהלך מומחש בפסאודו קוד הבא:
{| dir="ltr"
|-
|
:<math>(s_1,s_2,...,s_{93})\leftarrow (K_1,...,K_{80},0,...,0)</math>
:<math>(s_{94},s_{95},...,s_{177})\leftarrow (IV_1,...,IV_{80},0,...,0)</math>
:<math>(s_{178},s_{279},...,s_{288})\leftarrow (0,...,0,1,1,1)</math>
:<math>\text{for }i = 1\text{ to }4 \cdot 288\text{ do}</math>
::<math>\ \ \ \ t_1\leftarrow s_{66} \oplus s_{91} \land s_{92} \oplus s_{93} \oplus s_{171}</math>
::<math>\ \ \ \ t_2\leftarrow s_{162} \oplus s_{175} \land s_{176} \oplus s_{177} \oplus s_{264}</math>
::<math>\ \ \ \ t_3\leftarrow s_{243} \oplus s_{286} \land s_{287} \oplus s_{288} \oplus s_{69}</math>
::<math>\ \ \ \ (s_1,s_2,...,s_{93})\leftarrow (t_3,s_{1},...,s_{92})</math>
::<math>\ \ \ \ (s_{94},s_{95},...,s_{177})\leftarrow (t_1,s_{94},...,s_{176})</math>
::<math>\ \ \ \ (s_{178},s_{279},...,s_{288})\leftarrow (t_2,s_{178},...,s_{287})</math>
:<math>\text{end}</math>
|}

==היבטי יישום==
טריוויום נועד ליישום בחומרה ועוצב בעיקר להשגת סקלביליות, גמישות ותפוקה גבוהה. הוא אמור להיות קטן מאוד במטרה להתאימו להטמעה בחומרה מוגבלת במספר שערים לוגיים וצריכת אנרגיה מינימלית. כדי לאפשר מקביליות גבוהה הצופן פותח כך שכל סיבית מנוצלת פעם אחת ב-64 פעימות לאחר שעודכנה. כך שעל ידי הכפלת השערים (3 שערי AND ו-11 שערי XOR לפעימה) 64 פעמים, אפשר לבצע 64 איטרציות במקביל ולהפיק 64 סיביות זרם מפתח בפעימה אחת. התחשיב של מספר השערים הכולל מסתמך על ההנחה שדרושים 12 שערי NAND עבור פליפ פלופ אחד (יחידת זיכרון אחת) 2.5 שערי NAND עבור XOR אחד ו-1.5 שערי NAND עבור AND אחד. בסך הכול יוצא שבמימוש הרגיל נדרשים 3488 שערי NAND למימוש הצופן כולו ובגרסה המקבילית אפשר להגיע לתצורה שבה עם 5504 שערי NAND יופקו 64 סיביות פלט בבת אחת. 

למרות שיועד לחומרה, טריוויום ניתן למימוש באופן יעיל למדי גם בתוכנה.

==ביטחון==
קיימת קריפטואנליזה של הצופן שמוצאת "מפתחות חלשים" שניתנים להבחנה בסיבוכיות מעשית לאחר כ-961 פעימות מתוך 1152.

==ראו גם==
* צופן בלוקים
* AES

==הערות שוליים==

קטגוריה:צפני זרם