Hummingbird (צופן)
תיאור צופן Hummingbird

מבנה Hummingbird בנוי באופן בלתי שגרתי בניסיון ליהנות מיתרונות שני תחומים שונים בהצפנה סימטרית, צופן זרם וצופן בלוקים. הוא מורכב מצופן בלוקים המקבל קלט באורך 16 סיביות ומתחלק לארבעה עם ארבעה מפתחות שונים:  E_{k_{1}},E_{k_{2}},E_{k_{3}},E_{k_{4}} בהתאמה, ארבעה אוגרים פנימיים באורך 16 סיביות כל אחד:  RS1,RS2,RS3,RS4 ואוגר זיזה ממושב LFSR עם 16 מצבים. המפתח הסודי המסופק על ידי המשתמש מחולק לארבעה תת-מפתחות באורך 64 סיביות:  k_{1},k_{2},k_{3},k_{4} המתאימים לצופן הבלוקים האמור.
להצפנה, בלוק טקסט קריא באורך 16 סיביות  PT_{i} מחובר תחילה מודולו  2^{16} עם תכולת האוגר הראשון  RS1 והתוצאה מוצפנת עם צופן הבלוקים הראשון  E_{k_{1}} והפלט הופך קלט לשלב הבא. תהליך זה חוזר על עצמו בדרך דומה שלוש פעמים נוספות עם יתר האוגרים והצפנים, כאשר פלט  E_{k_{4}} הוא הטקסט המוצפן  CT_{i}. המצב הפנימי (ארבעת האוגרים) של הצופן מעודכן באופן בלתי צפוי, בהתאם לערכם הנוכחי, פלט שלושת צפני הבלוקים הראשונים וה-LFSR יחד. פענוח מתנהל בדרך דומה להצפנה אף בסדר הפוך.
לצופן שלושה מצבים אפשריים: מצב אתחול, מצב הצפנה ומצב פענוח. לפני הצפנה/פענוח יש צורך לאתחל את המצב הפנימי של הצופן כדלהלן: תחילה וקטור אתחול המונה ארבעה ערכים אקראיים באורך 16 סיביות:  {\text{NONCE}}_{i} כאשר  i=1,2,3,4 נטען לתוך ארבעת האוגרים בהתאמה ואז מצפינים את  RS1\boxplus RS3 (חיבור של האוגר הראשון והשלישי מודולו  2^{16}) במצב אתחול כשהפלט הסופי  TV_{i} משמש כערכים התחלתיים של ה-LFSR. יתרה מזו, הסיבית ה-13 של ה-LFSR נקבעת תמיד ל-1 כדי למנוע מצב שהאוגר יהיה כולו אפסים. ה-LFSR מופעל פעימה אחת לפני שהוא מפיק פלט כדי לעדכן את האוגר השלישי. הטבלה הבאה מסכמת את מהלכי האלגוריתם בשלושת המצבים האמורים:
| 0 | 1 | 2 |
| --- | --- | --- |
| הצפנה |   V12_{t}=E_{k_{1}}(PT_{i}\boxplus RS1_{t})  V23_{t}=E_{k_{2}}(V12_{t}\boxplus RS2_{t})  V34_{t}=E_{k_{3}}(V23_{t}\boxplus RS3_{t})  CT_{i}=E_{k_{4}}(V34_{t}\boxplus RS4_{t}) |  עדכון מצב פנימי (זהה בכל המצבים)  LFSR_{t+1}\leftarrow LFSR_{t}  RS1_{t+1}=RS1_{t}\boxplus V34_{t}  RS3_{t+1}=RS3_{t}\boxplus V23_{t}\boxplus LFSR_{t+1}  RS4_{t+1}=RS4_{t}\boxplus V12_{t}\boxplus RS1_{t+1}  RS2_{t+1}=RS2_{t}\boxplus V12_{t}\boxplus RS4_{t+1}  RS1_{t+1}=RS1_{t}\boxplus TV_{t}  RS2_{t+1}=RS2_{t}\boxplus V12_{t}  RS3_{t+1}=RS3_{t}\boxplus V23_{t}  RS4_{t+1}=RS4_{t}\boxplus V34_{t} ‎ ‎ ‎ ‎ |
| פענוח |   V34_{t}=D_{k_{4}}(CT_{i})\boxminus RS4_{t}  V23_{t}=D_{k_{3}}(V34_{t})\boxminus RS3_{t}  V12_{t}=D_{k_{2}}(V23_{t})\boxminus RS2_{t}  PT_{i}=D_{k_{1}}(V12_{t})\boxminus RS1_{t} |  עדכון מצב פנימי (זהה בכל המצבים)  LFSR_{t+1}\leftarrow LFSR_{t}  RS1_{t+1}=RS1_{t}\boxplus V34_{t}  RS3_{t+1}=RS3_{t}\boxplus V23_{t}\boxplus LFSR_{t+1}  RS4_{t+1}=RS4_{t}\boxplus V12_{t}\boxplus RS1_{t+1}  RS2_{t+1}=RS2_{t}\boxplus V12_{t}\boxplus RS4_{t+1}  RS1_{t+1}=RS1_{t}\boxplus TV_{t}  RS2_{t+1}=RS2_{t}\boxplus V12_{t}  RS3_{t+1}=RS3_{t}\boxplus V23_{t}  RS4_{t+1}=RS4_{t}\boxplus V34_{t} ‎ ‎ ‎ ‎ |
| אתחול (ארבעה סבבים) |   V12_{t}=E_{k_{1}}((RS1_{t}\boxplus RS3_{t})\boxplus RS1_{t})  V23_{t}=E_{k_{2}}(V12_{t}\boxplus RS2_{t})  V34_{t}=E_{k_{3}}(V23_{t}\boxplus RS3_{t})  TV=E_{k_{4}}(V34_{t}\boxplus RS4_{t}) |  עדכון מצב פנימי (זהה בכל המצבים)  LFSR_{t+1}\leftarrow LFSR_{t}  RS1_{t+1}=RS1_{t}\boxplus V34_{t}  RS3_{t+1}=RS3_{t}\boxplus V23_{t}\boxplus LFSR_{t+1}  RS4_{t+1}=RS4_{t}\boxplus V12_{t}\boxplus RS1_{t+1}  RS2_{t+1}=RS2_{t}\boxplus V12_{t}\boxplus RS4_{t+1}  RS1_{t+1}=RS1_{t}\boxplus TV_{t}  RS2_{t+1}=RS2_{t}\boxplus V12_{t}  RS3_{t+1}=RS3_{t}\boxplus V23_{t}  RS4_{t+1}=RS4_{t}\boxplus V34_{t} ‎ ‎ ‎ ‎ |