Hummingbird (צופן)

בקריפטוגרפיה, Hummingbird הוא שם כולל למשפחה של צפני בלוקים קלי משקל המיועדים להצפנת תקשורת בחומרה מוגבלת משאבים כתיוג אלקטרוני,מיקרו-בקר, כרטיס חכם וסנסור אלחוטי. Hummingbird הוא פיתוח ייעודי בהשראת מכונת האניגמה במבנה היברדי המשלב צופן בלוקים עם צופן זרם, הוא המקבל בלוק טקסט קריא באורך 16 סיביות (שני בתים), מפתח הצפנה באורך 256 סיביות (32 בתים), הוא כולל מצב פנימי (זיכרון) באורך 80 סיביות (עשרה בתים) ומפיק בלוק מוצפן באורך 16 סיביות. השילוב של סיביות המפתח והזיכרון הפנימי מספק לדעת המפתחים ביטחון רב-נגד קריפטואנליזה מודרנית (דיפרנציאלית וליניארית). הוא מתאים להטמעה במערכות משובצות מחשב זעירות, יעיל בתוכנה וגם בחומרת 8-ביט/16-ביט. נחשב צופן בלוקים קל משקל 'סטייט אוף דה ארט' ומציג ביצועים טובים מצופן PRESENT.

הצופן הראשון Hummingbird (בעברית "יונק דבש") פותח ב-2009 על ידי דניאל אנגלס מחברת Revere Security ועמיתיו מ-CACR (מרכז מחקר לקריפטוגרפיה יישומית) אוניברסיטת ווטרלו קנדה. הוצג ב-2010 WLC (ועידה שנתית בינלאומית לקריפטוגרפיה קלת משקל עבור חומרה מוגבלת משאבים) וב-RISC ’09. עד כמה שידוע אינו מוגן בפטנט וחופשי לשימוש. הצופן Hummingbird-2 פותח ב-2011 בעקבות קריפטואנליזה של קודמו והוצג ב-RFIDSec'11. הוא מספק הצפנה מאומתת, אורך המפתח הופחת ל-128 סיביות והזיכרון הפנימי הורחב ל-128 סיביות. הוא מכיל שיפורים אחדים לעומת קודמו כדי לחזקו נגד קרפיטואנליזה. המפרט שלו, התפוקה והביטחון שלו מותאמים לתקן איזו ISO/IEC 18000-6:2010.

==מבוא ותיאור כללי==
השפעת טכנולוגית מחשוב מפושט (Pervasive Computing) כמו RFID, כרטיסים חכמים וסנסורים אלחוטיים על חיי היום יום הולכת ומתרחבת. השימוש בהם פורץ לכל תחומי החיים, מבקרה ושליטה מרחוק, בית חכם, ניהול שירותי אספקה כמו מדי חשמל ומים ועד ניטור רפואי. כל אילו מערבים עיבוד ושידור מידע רגיש, כמו מידע ביו-רפואי או מידע על צריכה או אספקה של מוצרים ולכן יש צורך להטמיע במערכות אילו מנגנון קריפטוגרפי שיאפשר לשמור על דיסקרטיות ולהבטיח את שלמות המידע. ברוב המקרים מכשירי מחשוב מפושט מכילים מעבד זעיר שפועל על אנרגיה חיצונית כמו כרטיס חכם או על סוללה זעירה שאמורה להחזיק מעמד זמן רב ללא טעינה. מסיבה זו הוא פועל על משאבים כמו זיכרון וכוח מחשוב אולטרה נמוכים בהשוואה למחשב שולחני. צפנים סימטריים רגילים אינם מתאימים במיוחד לעבודה בסביבה כזו. רובם, במיוחד AES פותחו עוד בטרם הטכנולוגיה הזו פרצה לתודעה.

קריפטוגרפיה קלת משקל פותחה כדי לתת מענה לצורך זה. בין היתר פותחו צפני בלוקים בקטגוריה צפני בלוקים קלי משקל שהיעד העיקרי בהם הוא לפעול בסביבה בה יש צורך לשקלל או להתפשר על מספר גורמים: ביטחון מול עלות מול ביצועים ולהשיג את המיטב בתנאים מוגבלים. קיימות כיום מספר הצעות טובות המתחלקות לשלוש קטגוריות עיקריות: מיטוב צפנים קיימים כמו AES ו-IDEA, שינוי צפנים קיימים כמו DES-XL והשלישי פיתוח צפנים ייעודיים כמו HIGHT, SEA, KATAN ו-PRESENT. בנוסף קיימים צפני זרם קלי משקל ביניהם גריין ו-Trivium.

ל-Hummingbird מבנה היברידי ייחודי בהשראת מכונת האניגמה, המשלב צופן בלוקים עם צופן זרם (מכיל זיכרון פנימי מה שמאפשר בלוק קטן) ופותח מתוך כוונה שיהיה יעיל, פשוט וקל ככל האפשר להטמעה והרצה.

==תיאור צופן Hummingbird==
מבנה Hummingbird בנוי באופן בלתי שגרתי בניסיון ליהנות מיתרונות שני תחומים שונים בהצפנה סימטרית, צופן זרם וצופן בלוקים. הוא מורכב מצופן בלוקים המקבל קלט באורך 16 סיביות ומתחלק לארבעה עם ארבעה מפתחות שונים: <math>E_{k_1}, E_{k_2}, E_{k_3}, E_{k_4}</math> בהתאמה, ארבעה אוגרים פנימיים באורך 16 סיביות כל אחד: <math>RS1,RS2,RS3,RS4</math> ואוגר זיזה ממושב LFSR עם 16 מצבים. המפתח הסודי המסופק על ידי המשתמש מחולק לארבעה תת-מפתחות באורך 64 סיביות: <math>k_1,k_2,k_3,k_4</math> המתאימים לצופן הבלוקים האמור.

להצפנה, בלוק טקסט קריא באורך 16 סיביות <math>PT_i</math> מחובר תחילה מודולו <math>2^{16}</math> עם תכולת האוגר הראשון <math>RS1</math> והתוצאה מוצפנת עם צופן הבלוקים הראשון <math>E_{k_1}</math> והפלט הופך קלט לשלב הבא. תהליך זה חוזר על עצמו בדרך דומה שלוש פעמים נוספות עם יתר האוגרים והצפנים, כאשר פלט <math>E_{k_4}</math> הוא הטקסט המוצפן <math>CT_i</math>. המצב הפנימי (ארבעת האוגרים) של הצופן מעודכן באופן בלתי צפוי, בהתאם לערכם הנוכחי, פלט שלושת צפני הבלוקים הראשונים וה-LFSR יחד. פענוח מתנהל בדרך דומה להצפנה אף בסדר הפוך.

לצופן שלושה מצבים אפשריים: מצב אתחול, מצב הצפנה ומצב פענוח. לפני הצפנה/פענוח יש צורך לאתחל את המצב הפנימי של הצופן כדלהלן: תחילה וקטור אתחול המונה ארבעה ערכים אקראיים באורך 16 סיביות: <math>\text{NONCE}_i</math> כאשר <math>i=1,2,3,4</math> נטען לתוך ארבעת האוגרים בהתאמה ואז מצפינים את <math>RS1\boxplus RS3</math> (חיבור של האוגר הראשון והשלישי מודולו <math>2^{16}</math>) במצב אתחול כשהפלט הסופי <math>TV_i</math> משמש כערכים התחלתיים של ה-LFSR. יתרה מזו, הסיבית ה-13 של ה-LFSR נקבעת תמיד ל-1 כדי למנוע מצב שהאוגר יהיה כולו אפסים. ה-LFSR מופעל פעימה אחת לפני שהוא מפיק פלט כדי לעדכן את האוגר השלישי. הטבלה הבאה מסכמת את מהלכי האלגוריתם בשלושת המצבים האמורים:

{| class="wikitable"
|-
| הצפנה || align="left" | 
:<math>V12_t = E_{k_1}(PT_i \boxplus RS1_t)</math>
:<math>V23_t = E_{k_2}(V12_t \boxplus RS2_t)</math>
:<math>V34_t = E_{k_3}(V23_t \boxplus RS3_t)</math>
:<math>CT_i = E_{k_4}(V34_t \boxplus RS4_t)</math>
| rowspan="3" align="left" |
עדכון מצב פנימי (זהה בכל המצבים)
:<math>LFSR_{t+1} \leftarrow LFSR_t</math>
:<math>RS1_{t+1} = RS1_t \boxplus V34_t</math>
:<math>RS3_{t+1} = RS3_t \boxplus V23_t \boxplus LFSR_{t+1}</math>
:<math>RS4_{t+1} = RS4_t \boxplus V12_t \boxplus RS1_{t+1}</math>
:<math>RS2_{t+1} = RS2_t \boxplus V12_t \boxplus RS4_{t+1}</math>
:<math>RS1_{t+1} = RS1_t \boxplus TV_t</math>
:<math>RS2_{t+1} = RS2_t \boxplus V12_t</math>
:<math>RS3_{t+1} = RS3_t \boxplus V23_t</math>
:<math>RS4_{t+1} = RS4_t \boxplus V34_t</math>
:
:
:
:
|-
| פענוח || align="left" | 
:<math>V34_t = D_{k_4}(CT_i) \boxminus RS4_t</math>
:<math>V23_t = D_{k_3}(V34_t) \boxminus RS3_t</math>
:<math>V12_t = D_{k_2}(V23_t) \boxminus RS2_t</math>
:<math>PT_i = D_{k_1}(V12_t) \boxminus RS1_t</math>
|-
| אתחול (ארבעה סבבים) || align="left" | 
:<math>V12_t = E_{k_1}((RS1_t \boxplus RS3_t) \boxplus RS1_t)</math>
:<math>V23_t = E_{k_2}(V 12_t \boxplus RS2_t)</math>
:<math>V34_t = E_{k_3}(V 23_t \boxplus RS3_t)</math>
:<math>TV = E_{k_4}(V 34_t \boxplus RS4_t)</math>
|}

===צופן בלוקים 16-ביט===
צופן הבלוקים הפנימי <math>E_{k_i}</math> בנוי בסגנון רשת החלפה-תמורה עם בלוק באורך 16 סיביות (2 בתים) ולמעשה מחולק לארבעה צפנים כשכל אחד מהם מקבל תת-מפתח <math>K^{(i)}</math> באורך 64 סיביות (8 בתים) כאשר <math>i\in\{1,2,3,4\}</math> מתייחס למספר הצופן. למעט המפתח השונה הצופן זהה בכל הארבעה והוא פועל עם ארבעה סבבים רגילים בשלוש שכבות החלפה/פיזור/הוספת מפתח וסבב חמישי המכיל רק את שכבת הוספת המפתח וההחלפה לא הפיזור. תת-המפתח מחולק לארבעה מפתחות קטנים באורך 16 סיביות כל אחד: <math>k_1^{(i)},k_2^{(i)},k_3^{(i)},k_4^{(i)}</math> כל מפתח מתאים לסבב אחד ולצורך הסבב האחרון מכינים שני מפתחות נוספים <math>k_5^{(i)},k_6^{(i)}</math> הנגזרים ישירות מהמפתחות הקודמים (המפתח החמישי הוא תוצאת XOR של המפתח הראשון עם השני והמפתח השישי הוא XOR של המפתח השני עם הרביעי).

בארבעת הסבבים הראשונים של הצופן שלוש השכבות מתבצעות כך: 
# המפתח מחובר ב-XOR עם הקלט (16 סיביות).
# ההחלפה מתבצעת עם ארבע תיבות ההחלפה בסגנון סרפנט המקבלות ארבע סיביות ומחזירות ארבע סיביות, עם קריטריון נוסף, המעלה של כל תיבת החלפה בהצגה בוליאנית שלה תהיה לפחות 3. 
# שכבת הפיזור מתבצעת על ידי הטרנספורמציה הליניארית: <math>L(m)=m\oplus (m\ll 6)\oplus (m\ll 10)</math>.
כאשר <math>m=(m_0,m_1,...,m_{15})</math> הוא בלוק הקלט באורך 16 סיביות. כדי לחסוך בצריכת זיכרון ואנרגיה אפשר להשתמש רק בתיבת החלפה אחת במקום ארבעה. הגרסה עם תיבת החלפה אחת החוזרת על עצמה ארבע פעמים היא קומפקטית ומשיגה אותה רמת ביטחון כמו עם ארבע תיבות החלפה שונות.

בסבב האחרון לא מבצעים את שכבת הפיזור אלא מבצעים XOR עם המפתח האחרון.

===תיבות ההחלפה===
{| class="wikitable" dir="ltr"
|-
| x || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F
|-
| S1(x) || 8 || 6 || 5 || F || 1 || C || A || 9 || E || B || 2 || 4 || 7 || 0 || D || 3
|-
| S2(x) || 0 || 7 || E || 1 || 5 || B || 8 || 2 || 3 || A || D || 6 || F || C || 4 || 9
|-
| S3(x) || 2 || E || F || 5 || C || 1 || 9 || A || B || 4 || 6 || 8 || 0 || 7 || 3 || D
|-
| S4(x) || 0 || 7 || 3 || 4 || C || 1 || A || F || D || E || 6 || B || 2 || 8 || 9 || 5
|}

==Hummingbird-2==
Hummingbird-2 הוא צופן בלוקים היברידי המיועד לחומרה מוגבלת משאבים, פותח בהשראת האניגמה ומשלב תכונות של צופן בלוקים עם צופן זרם. הוא מקבל מפתח סודי באורך 128 סיביות ווקטור אתחול באורך 64 סיביות ומצפין בלוק מידע באורך 16 סיביות ואם נדרש מייצר בנוסף תג אימות עבור כל בלוק קלט שהוצפן. כקודמו Hummingbird-1 זהו צופן קל משקל שפותח בעיקר עבור מיקרו-בקרים ומערכות משובצות מחשב בהתקנים קטנים כמו RFID וסנסור אלחוטי. בהשוואה לגרסה הקודמת ובהתחשב בקריפטואנליזה חדשה של הצופן בעיקר בגרסה הקודמת נעשו מספר שינויים. המצב הפנימי הורחב ל-128 סיביות, פונקציית העדכון של המצב הפנימי שופצה בהתאם. כמו כן נעשו שינויים בתיבות ההחלפה ופונקציית הסבב הפנימית.

===הצפנה מאומתת===

Hummingbird-2 משמש גם כאלגוריתם הצפנה מאומתת המספק במקביל סודיות והגנה על שלמות המידע בריצה אחת. כתוצאה מכך יעילות האלגוריתם גבוהה במיוחד ביישום בחומרה. כקודמו, הצופן אינו מתאים בדיוק לקטגוריה של צופן בלוקים או צופן זרם, אלא מעין הכלאה של השנים בסגנון דומה לצפנים Helix ו-Phelix. הוא פותח בעקבות הפקת לקחים במיוחד לאור קריפטואנליזה של Saarinen נגד הצופן הקודם Hummingbird-1 ולדעת המפתחים הצופן החדש עמיד נגד כל ההתקפות הקריפטואנליטיות הידועות, אם כי קיים מחקר שמראה אחרת.

===תיאור האלגוריתם===
Hummingbird-2 מקבל בלוק טקסט גלוי באורך 16 סיביות (שני בתים), מפתח סודי באורך 128 סיביות (32 בתים) ווקטור אתחול באורך 64 סיביות (16 בתים) ומפיק בלוק מוצפן באורך 16 סיביות וכן במידה שנדרש מפיק תג אימות (באורך של עד שמונה מילים) של הבלוק המוצפן בנוסף למידע אחר גלוי שנקרא מידע נלווה אם קיים, כמו הערכים החד-פעמיים הגלויים המשמשים לאתחול הצופן או חבילת כותר המכילה מידע תפעולי.

וקטור האתחול <math>IV</math> מחולק לארבע מילים: <math>IV_1,IV_2,IV_3,IV_4</math>, המפתח הסודי <math>K</math> מחולק לשמונה מילים: <math>K_1,K_2,...,K_8</math> והמצב הפנימי (הזיכרון) <math>R</math> של הצופן מחולק לשמונה אוגרים: <math>R_1,R_2,...,R_8</math>. כל המילים הן באורך 16 סיביות. הפעולות הן חיבור מודולו 65536, XOR ופונקציית ערבוב אי-ליניארית <math>f(x)</math>. הפונקציה האי-ליניארית מורכבת מארבע תיבות תמורה לפי טבלה קבועה על כל המילים ולאחריהם מתבצע פיזור ליניארי. תיבות ההחלפה מוצגות בטבלה הבאה:
{| class="wikitable" dir="ltr"
|-
! colspan="17" | תיבות ההחלפה
|-
| x || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 || 13 || 14 || 15
|-
| S1(x) || 7 || 12 || 14 || 9 || 2 || 1 || 5 || 15 || 11 || 6 || 13 || 0 || 4 || 8 || 10 || 3
|-
| S2(x) || 4 || 10 || 1 || 6 || 8 || 15 || 7 || 12 || 3 || 0 || 14 || 13 || 5 || 9 || 11 || 2
|-
| S3(x) || 2 || 15 || 12 || 1 || 5 || 6 || 10 || 13 || 14 || 8 || 3 || 4 || 0 || 11 || 9 || 7
|-
| S4(x) || 15 || 4 || 5 || 8 || 9 || 7 || 2 || 1 || 10 || 3 || 0 || 14 || 6 || 12 || 13 || 11
|}

תיבות ההחלפה של Hummingbird-2 תופסות שטח של 256 סיביות (32 בתים).

להלן הגדרה פורמלית של הפונקציה <math>f(x)</math> המשתמשת בתורה בפונקציית ההחלפה <math>S(x)</math> הכוללת את ארבע תיבות ההחלפה המתוארות ובפונקציה הליניארית <math>L(x)</math>:
{| dir="ltr"
|-
| 
:<math>\boldsymbol{f(x) = L(S(x))}</math>
:::<math>\ \ \ \ S(x) = S_1(x_0)\ |\ S_2(x_1) \ | \ S_3(x_2) \ | \ S_4(x_3)</math>
:::<math>\ \ \ \ L(x) = x \oplus (x \lll 6) \oplus (x \lll 10)</math>
|}

===פונקציית ההצפנה===
מבנה כללי של פונקציית הסבב הפנימית <math>WD16(x,a,b,c,d)</math> המקבלת חמש מילים, את הקלט <math>x</math> וארבעה מפתחות ומשתמשת ב-<math>f</math> הוא:
<center>
:<math>\boldsymbol{WD16(x, a, b, c, d) = f(f(f(f(x \oplus a) \oplus b) \oplus c) \oplus d)}</math>
</center>
הפונקציה ההופכית <math>f^{-1}(x)</math> וכן הפונקציה ההופכית <math>WD16^{-1}</math> נגזרות ישירות מהפונקציות האמורות.

===אתחול===
המצב הפנימי של הצופן מאותחל בארבעה מהלכים. תחילה טוענים את וקטור האתחול:
:<math>R^{(0)}=(IV_1, IV_2, IV_3, IV_4, IV_1, IV_2, IV_3, IV_4)</math>
ומפעילים את פונקציית הסבב ארבע פעמים:
{| dir="ltr"
|-
| 
:<math>t_1 = WD16(R^{(i)}_1 \boxplus \langle \ i\ \rangle,K_1,K_2,K_3,K_4)</math>
:<math>t_2 = WD16(R^{(i)}_2 \boxplus t_1,K_5,K_6,K_7,K_8)</math>
:<math>t_3 = WD16(R^{(i)}_3 \boxplus t_2,K_1,K_2,K_3,K_4)</math>
:<math>t_4 = WD16(R^{(i)}_4 \boxplus t_3,K_5,K_6,K_7,K_8)</math>
:<math>R^{(i+1)}_1 = (R^{(i)}_1 \boxplus t_4)\lll 3</math>
:<math>R^{(i+1)}_2 = (R^{(i)}_2 \boxplus t_1)\ggg 1</math>
:<math>R^{(i+1)}_3 = (R^{(i)}_3 \boxplus t_2)\lll 8</math>
:<math>R^{(i+1)}_4 = (R^{(i)}_4 \boxplus t_3)\lll 1</math>
:<math>R^{(i+1)}_5 = R^{(i)}_5 \oplus R^{(i+1)}_1</math>
:<math>R^{(i+1)}_6 = R^{(i)}_6 \oplus R^{(i+1)}_2</math>
:<math>R^{(i+1)}_7 = R^{(i)}_7 \oplus R^{(i+1)}_3</math>
:<math>R^{(i+1)}_8 = R^{(i)}_8 \oplus R^{(i+1)}_4</math>
|}
המצב ההתחלתי לפני ההצפנה של הבלוק הראשון הוא <math>R^{(4)}</math>. הסמל <math>\langle \ i \ \rangle</math> מייצג את המשלים ל-2 של <math>i</math>.

===הצפנה===
פונקציית ההצפנה של בלוק אחד: <math>C_i=E(P_i)</math> מבצעת ארבע קריאות לפונקציית הסבב הפנימית:
{| dir="ltr"
|-
| 
:<math>t_1 = WD16(R^{(i)}_1 \boxplus P_i,K_1,K_2,K_3,K_4)</math>
:<math>t_2 = WD16(R^{(i)}_2 \boxplus t_1,K_5 \oplus R^{(i)}_5 ,K_6 \oplus R^{(i)}_6 ,K_7 \oplus R^{(i)}_7 ,K_8 \oplus R^{(i)}_8)</math>
:<math>t_3 = WD16(R^{(i)}_3 \boxplus t_2,K_1 \oplus R^{(i)}_5 ,K_2 \oplus R^{(i)}_6 ,K_3 \oplus R^{(i)}_7 ,K_4 \oplus R^{(i)}_8)</math>
:<math>C_i = WD16(R^{(i)}_4 \boxplus t_3,K_5,K_6,K_7,K_8) \boxplus R^{(i)}_1</math>.
|}
והטקסט המוצפן הוא <math>C_i</math>.

פענוח מתבצע בדרך דומה אך עם הפונקציות ההופכיות ובסדר הפוך של המפתחות.

===עדכון מצב פנימי===
לאחר הצפנה או פענוח מבצעים את המהלכים הבאים לעדכון המצב הפנימי:
{| dir="ltr"
|-
| 
:<math>R^{(i+1)}_1 = R^{(i)}_1 \boxplus t_3</math>
:<math>R^{(i+1)}_2 = R^{(i)}_2 \boxplus t_1</math>
:<math>R^{(i+1)}_3 = R^{(i)}_3 \boxplus t_2</math>
:<math>R^{(i+1)}_4 = R^{(i)}_4 \boxplus R^{(i)}_1 \boxplus t_3 \boxplus t_1</math>
:<math>R^{(i+1)}_5 = R^{(i)}_5 \oplus (R^{(i)}_1 \boxplus t_3)</math>
:<math>R^{(i+1)}_6 = R^{(i)}_6 \oplus (R^{(i)}_2 \boxplus t_1)</math>
:<math>R^{(i+1)}_7 = R^{(i)}_7 \oplus (R^{(i)}_3 \boxplus t_2)</math>
:<math>R^{(i+1)}_8 = R^{(i)}_8 \oplus (R^{(i)}_4 \boxplus R^{(i)}_1 \boxplus t_3 \boxplus t_1)</math>.
|}

===תג אימות===
לאחר עיבוד כל המידע המוצפן והמידע הגלוי (שאינו מוצפן רק מועבר כמו שהוא) אפשר לייצר תג אימות <math>T</math> באורך של <math>n\le 8</math> מילים. תחילה מפעילים את הצופן שלוש פעמים ללא פלט כלשהו:
{| dir="ltr"
|-
| 
:<math>E(IV_1 \boxplus R_1 \boxplus R_3 \boxplus n)</math>
:<math>E(IV_2 \boxplus R_1 \boxplus R_3)</math>
:<math>E(IV_3 \boxplus R_1 \boxplus R_3)</math>.
|}
כאשר <math>R_1</math> ו-<math>R_3</math> מייצגים את תכולת הזיכרון באוגרים האמורים בכל סבב לפני הפעלת פונקציית ההצפנה <math>E</math>. התג <math>T</math> מורכב מהמילים:
{| dir="ltr"
|-
| 
:<math>T_1 =E(IV_4 \boxplus R_1 \boxplus R_3)</math>
:<math>T_i =E(R_1 \boxplus R_3)</math>, עבור <math>i=2,3,...,n</math>.
|}

===מצב הפעלה המדמה צופן זרם===
לעיתים נדרש להצפין ולאמת יחידות מידע הקטנות ממילה באורך 16 סיביות, במקרה כזה אפשר פשוט להצפין את המידע על ידי תוצאה חתוכה של פונקציית ההצפנה. למשל אם המידע <math>x</math> באורך <math>n</math> סיביות, כאשר <math>n\le 15</math> מצפינים פעם אחת בלוק של 16 אפסים ומחברים ב-XOR את <math>n</math> הסיביות הראשונות של התוצאה המוצפנת עם בלוק המידע <math>x</math> כך: <math>C=x\oplus E(0)</math>. לצורך תג האימות ממשיכים להריץ את הצופן, מעדכנים את המצב הפנימי ומפיקים תג אימות כמתואר לעיל.

היות ש-Hummingbird-2 הוא אלגוריתם הצפנה מאומתת כמו GCM, הוא כולל שימוש בוקטור אתחול חד-פעמי. אף על פי שצופן זה אינו רגיש לשימוש חוזר כמו GCM, מומלץ להימנע משימוש חוזר בוקטור אתחול כל עוד המפתח לא הוחלף (אחד משניהם חייב להיות שונה לפני שמצפינים ומאמתים מסרים נוספים). במילים אחרות ההסתברות ששני מסרים יוצפנו עם אותו מפתח ואותו וקטור אתחול צריכה להיות נמוכה מ-<math>2^{32}</math>. במקרה שהמשתמש לא עמד בקריטריון זה התוצאה תהיה שהמתקיף יוכל לזהות הצפנה של בלוקים זהים. דבר שרצוי להימנע ממנו במקרים מסוימים.

==ביטחון ועילות==
בגרסה הראשונה התגלו חולשות בצופן הבלוקים הפנימי. Markku-Juhani O. Saarinen פרסם התקפה דיפרנציאלית שמסוגלת לשחזר את המפתח תוך מספר מיליוני מסרים נבחרים במה שקרוי התקפת גלוי-נבחר בסיבוכיות של <math>2^{64}</math> פעולות אוף ליין. גרסה 2 יחסית חדשה ועדיין אין הרבה קריפטואנליזה שלה. קיים מחקר שמבוסס על התנגשויות דיפרנציאליות נגד פונקציית הסבב הפנימית, שמראה שקיימת בה בעיה דומה. המחברים מראים אפשר לשבור את הצופן בזמן של <math>2^{32.6}</math> בסיבוכיות מקום של <math>2^{32.6}</math> עם מספר זוגות של מפתחות קשורים.

==ראו גם==
* צופן בלוקים
* AES
* מכונת האניגמה
* הצפנה מאומתת

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

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