שיטת מרקל-דמגרד

בקריפטוגרפיה, בניית מרקל-דמגרד (Merkle-Damgård Construction) היא שיטה לבניית פונקציית גיבוב קריפטוגרפית חסינת-התנגשויות באמצעות פונקציית תמצות חד-כיוונית, שהוצעה לראשונה על ידי רלף מרקל ואיוון דמגרד ב-1979 והוכחה על ידם כבטוחה. דהיינו אם משתמשים בסכמת ריפוד מתאימה ופונקציית הכיווץ הפנימית היא חד-כיוונית וחסינת התנגשויות אזי הבנייה כולה איתנה. בנייה זו נוצלה במספר אלגוריתמים פופולריים כמו MD5, SHA-1 ו-SHA-2.

==עקרונות השיטה==
בשל העובדה שפונקציית התמצות הפנימית <math>f</math> חייבת לקבל בלוק קלט באורך קבוע ומוגדר מראש (512 או 1024 סיביות), בעוד שהמסר המיועד לגיבוב בדרך כלל גדול משמעותית מאורך הבלוק, הפתרון הישיר הוא לחלק את המסר לבלוקים בגודל קבוע ולעבדם עם הפונקציה הפנימית באופן איטרטיבי. מתחילים עם וקטור אתחול קבוע ידוע מראש, שנקרא גם IV (קיצור של Initialization Vector) ואז בכל סבב פונקציית הכיווץ הפנימית מקבלת כקלט את הבלוק הבא ואת תמצית הבלוק הקודם ומפיקה תמצית חדשה. כך פלט סבב אחד הופך קלט לסבב הבא וכן הלאה עד לעיבוד כל הבלוקים. אם המסר אינו מתחלק יפה בגודל הבלוק, מרפדים את הבלוק האחרון בשיטת הריפוד של תמצית המסרים (בקיצור MD) של רונלד ריבסט שתתואר בהמשך. 

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

====תיאור המבנה====
נתונה פונקציה <math>f</math> שממפה קלט באורך <math>r+n</math> סיביות לפלט באורך <math>n</math> סיביות. ממנה אפשר לבנות פונקציית גיבוב כדלהלן:
#מחלקים את הקלט <math>M</math> באורך <math>b</math> סיביות ל-<math>t</math> בלוקים <math>M_1,M_2,...,M_t</math> בני <math>r</math> סיביות כל אחד.
#אם הבלוק האחרון קטן מ-<math>r</math> סיביות, מוסיפים '1' ומרפדים באפסים עד שמתקבל בלוק בגודל <math>r</math> סיביות.
#מוסיפים בלוק <math>M_{t+1}</math> שבו מקודדים את אורך המסר בסיביות ומרפדים באפסים.
#מגדירים וקטור אתחול קבוע שערכו תלוי ביישום ספציפי. מציבים <math>H_0=IV</math>.
#עבור כל <math>i</math> כאשר <math>1\le i\le t+1</math> מחשבים <math>H_i=f(H_{i-1} \ \| \ M_i)</math> כאשר ל-<math>H_i</math> קוראים ערך-ביניים (chaining value).
#הפלט הוא <math>h(M)=H_{t+1}</math>.

הסימון <math>\|</math> מייצג שרשור מחרוזות. כדי לחזק את המבנה עוד יותר התוצאה האחרונה היא פלט פונקציה מסיימת (finalisation). הפונקציה האחרונה יכולה לשמש גם לכיווץ נוסף של התוצאה הפנימית לפלט באורך הרצוי כמו גם לחיזוק המבנה.

==ביטחון הבנייה==
פונקציות הגיבוב הנפוצות מורכבות בדרך כלל מפונקציית דחיסה פנימית איטרטיבית, כשהמטרה היא השגת שלושה מאפיינים עיקריים מהקל אל הכבד: קושי בהיפוך (מקור ראשון), עמידות מפני מציאת מקור שני ועמידות מפני התנגשויות. האיטרציה אפשרית בכמה דרכים כשמבנה מרקל-דמגרד המתואר היה במשך שנים הפופולרי ביותר והוא הבסיס של סדרת פונקציות התמצות MD וכן של SHA. כמו כן ההנחה היא שמציאת מקור ראשון או שני בכוח גס היא מסדר גודל של <math>2^m</math> כאשר <math>m</math> הוא אורך הפלט בסיביות ומציאת התנגשות היא בסדר גודל <math>2^{m/2}</math> בגלל פרדוקס יום ההולדת. הוכח שמבנה מרקל-דמגר משמר את המאפיין האחרון - עמידות בפני התנגשויות והדעה הרווחת הייתה בעבר שהוא משמר גם את שני המאפיינים האחרים אם כי זה לא הוכח.

בעקבות קריפטואנליזה חדשה הסתבר שההנחה הייתה שגויה. הממצא הראשון היה של ריצ'רד דין שגילה ב-1999 התקפה נגד מבנה מרקל-דמגרד שנקראת התקפת נקודות שבת (להלן), המתמקדת בנקודות השבת של הפונקציה הפנימית ומאפשרת בתנאים מסוימים גילוי מקור שני בסיבוכיות של <math>O(m\cdot 2^{m/2})</math> זמן ומקום כאשר <math>m</math> הוא אורך התמצית של פונקציית הגיבוב. מאוחר יותר חוקרים שיפרו את ההתקפה בעזרת טכניקה של Joux מ-2004 שנקראת התקפת רב-התנגשויות (multi-collisions attack) המתוארת להלן והראו שעם חישוב מוקדם אפשר להפוך את הפונקציה בסיבוכיות של <math>O(2^{m/2})</math> עם מסרים יחסית קצרים.

להלן תקציר קריפטואנליזה של מבנה מרקל-דמגרד.

===התקפת נקודת שבת===
מבנה מרקל דמגרד מחוזק בדרך כלל על ידי ריפוד המסר והוספת קידוד האורך שלו בסופו. ללא תוספת זו המתקיף יכול לפעול כדלהלן: בהינתן פונקציית גיבוב של מסר ארוך <math>M=M_1,M_2,M_3,...,M_l</math> והתמצית של המסר <math>H(M)</math> שהיא בעצם ערך הביניים או המצב הפנימי האחרון של הפונקציה. המתקיף מעוניין למצוא מסר אחר <math>M^*</math> כך שיתקיים <math>H(M)=H(M^*)</math>. תחילה הוא בוחר אקראית בלוקים שונים <math>M'</math> כלשהם עד שנמצא בלוק כזה שהתמצית שלו זהה לאחד מ-<math>l</math> ערכי הביניים של המסר <math>M</math>. אם נמצא בלוק <math>M_i</math> כזה הוא יכול לחבר ל-<math>M'</math> רק את הבלוקים של <math>M</math> מהנקודה <math>i</math> שבה נמצאה ההתנגשות, כך יתקבל מסר חדש <math>M^*</math> שהתמצית שלו זהה למסר המקורי אך באורך שונה. התקפה זו מסוכלת על ידי תוספת אורך המסר.

אפשר לעקוף את שיטת הריפוד של מרקל דמגרד בהתקפה מתוחכמת שנקראת התקפת נקודות-שבת (fixed-points attack). אחד הממצאים מהמחקר הוא המאפיין הבא: אפשר להוכיח שאם יהיה קל להפוך את מבנה מרקל דמגרד יהיה אפשר למצוא מקור לפונקציה הפנימית עם התקפת יום הולדת. אך ההפך אינו נכון, כלומר גם אם ניתן להוכיח שהפיכת מבנה מרקל דמגרד היא בסיבוכיות <math>2^m</math> פעולות, עדיין פונקציית הגיבוב הפנימית אינה יכולה להציע ביטחון טוב יותר מ-<math>2^{m/2}</math>.

ריצ'רד דין הראה שאם פונקציית הדחיסה הפנימית של פונקציית הגיבוב היא כזו שקל למצוא בה נקודות שבת, דהיינו קל למצוא מסר ותמצית <math>(h,M)</math> כך שמתקיים <math>H(h,M)=h</math> אזי קל יותר לשבור את מבנה מרקל דמגרד. קיומן של נקודות שבת היה ידוע למומחים רבים אך לא נחשב בעבר כאיום ממשי כשלעצמו.

דוגמה לפונקציית גיבוב שקל למצוא בה נקודות שבת היא מבנה דוויס-מאייר שהוא מבנה גנרי של פונקציית גיבוב המבוסס על צופן בלוקים. בהינתן צופן בלוקים <math>E</math> המקבל מסר <math>M</math> באורך <math>m</math> סיביות ומפתח באורך <math>n</math> סיביות, פונקציית הגיבוב מבצעת: <math>h_i=H(h_{i-1}, M_i)=E_{M_i}(h_{i-1})\oplus h_{i-1}</math>.

במקרה כזה נקודת השבת עבור כל <math>M</math> היא <math>h=E_M^{-1}(0)</math> כי מתקיים:
<center>
:<math>E_M(E_M^{-1}(0))\oplus E_M^{-1}(0)=0\oplus E_M^{-1}(0)=H</math>
</center>
כלומר עבור כל בלוק מסר קיים בלוק מיוחד המקיים <math>f(H,M)=H</math> וקל לחשב אותו. פונקציות התמצות SHA-1 ו-SHA-2 פועלות על עיקרון דומה למבנה דוויס-מאייר עם חיבור שלמים במקום XOR.

התקפת נקודות שבת של ג'ון קלסי וברוס שנייר לשבירת מבנה מרקל-דמגרד פועלת בשלושה צעדים בסיסיים:
#מוצאים <math>2^{m/2}</math> נקודות שבת כאלו מסמנים אותם על ידי <math>A=(h,M)</math>.
#בוחרים <math>2^{m/2}</math> בלוקים כלשהם ומחשבים את ערך הביניים שלהם. אותם מסמנים על ידי <math>B=(H(IV,\tilde m),\tilde m)</math>.
#מחפשים התנגשויות בין ערכי הביניים ונקודות השבת. כלומר כניסות זהות ב-<math>A</math> ו-<math>B</math>.
אם נמצא ערך ביניים <math>h</math> ונקודת שבת זהים, נניח שהבלוק המתאים ב-<math>A</math> נקרא <math>m</math> כלומר <math>(h,m)\in A</math> וכן הבלוק המתאים ל-<math>h</math> ב-<math>B</math> הוא <math>\tilde m</math> כלומר <math>(h,\tilde m)\in B</math>. המתקיף חוזר על התקפה זו כשהוא מתחיל משרשור של שני הבלוקים <math>\tilde m\| m</math> כלומר מנסה להוסיף בלוקים שגורמים לערך ביניים להיות זהה למסר המקורי, בונה שוב רשימות כמו בסעיפים 1 ו-2 ומחפש התאמות ביניהן. אם נמצא מסר כזה שערכי הביניים מתאימים לנקודות השבת אזי למתקיף קל להרחיב את המסר לאורכו המקורי על ידי הוספת נקודות שבת לפי הצורך עד שמגיע לאורך הרצוי. ובכך לקבל תוצאת גיבוב זהה ואם אורך המסר זהה קידוד הארוך בסופו מניב תוצאה זהה ובכך למעשה המתקיף הערים על שיטת הריפוד.

כמובן שההתקפה מניחה שקל למצוא נקודת שבת, אולם שנייר וקלסי הראו שאפשר לבצע את ההתקפה גם אם קשה למצוא נקודות שבת על ידי שימוש בטכניקה של Joux שנקראת רב-התנגשויות. הם צמצמו את סיבוכיות ההתקפה האמורה ל-<math>3\cdot 2^{m/2}</math> עם מקום בסדר גודל של <math>2^{m/2}</math>. ג'ון פיליפ אמסון שיפר את ההתקפה הזו אף יותר עד לסיבוכיות של <math>2^{m/2}</math> וללא צריכת זיכרון משמעותית.

===רב-התנגשויות===
Joux גילה את העובדה שבפונקציות איטרטיביות מציאת התנגשויות מרובות, כלומר רשימה של מסרים המייצרים תמצית גיבוב זהה קלה כמעט כמו מציאת התנגשות אחת. ההתקפה שלו נקראת התקפת רב-התנגשויות. הרעיון הוא שאמנם במבנה מרקל-דמגרד קשה למצוא התנגשות עבור כל בלוק בנפרד, אבל בהנחה שמוצאים <math>t</math> התנגשויות (כל אחת מתחילה מערך הביניים של ההתנגשות הקודמת) אפשר לבנות <math>2^t</math> מסרים עם ערך גיבוב זהה על ידי צירופים של בלוקים מתנגשים. לפני התגלית של Joux מומחים היו סבורים שמציאת <math>k</math> התנגשויות בפונקציית גיבוב איטרטיבית עם התקפת יום הולדת היא בסיבוכיות אופטימלית של <math>k!^{1/k}\cdot 2^{m(k-1)/k}</math>, אולם Joux הוכיח שמציאת התנגשויות מרובות אפשרית ב-<math>\lceil\log_2 k\rceil\cdot 2^{n/2}</math> פעולות. המסקנה מההתקפה שלו היא שאם מחברים שתי פונקציות גיבוב זו אחר זו לא מקבלים ביטחון כפול נגד התנגשויות כפי שעשויים לחשוב. החיבור בטוח רק כמו הפונקציה החזקה מבין השתיים.

באופן כללי התקפת רב-התנגשויות פועלת כדלהלן. כדי לחשב <math>2^k</math> התנגשויות מתוך <math>k</math> התנגשויות בודדות, תחילה מחשבים את הזוג <math>(M_1,M_1')</math> כך שמתקיים <math>f(H_0,M_1)=f(H_0,M_1')=H_1</math>, כאשר <math>H_0</math> הוא וקטור האתחול. לאחר מכן מוצאים זוג נוסף <math>(M_2, M_2')</math> עם התכונה הבאה: <math>f(H_1,M_2)=f(H_1,M_2')=H_2</math>. כך ממשיכים כאשר כל תוצאה מהווה וקטור אתחול לחישוב הבא, עד שמגיעים ל-<math>(M_k,M_k')</math> כאשר <math>H_{k-1}</math> הוא וקטור האתחול. משנמצאו <math>k</math> ערכים כאלו ניתן לבנות מהם <math>2^k</math> מסרים שונים שלהם תמצית זהה. אם נקרא למסר אחד <math>X\in(M,M')</math> אזי לכל אחד מ-<math>2^k</math> המסרים <math>X_1,...,X_k</math> שניתן לבנות יש ערכי ביניים <math>H_1,...,H_k</math> מרשימת ההתנגשויות ומהם אפשר ליצור <math>2^k</math> מסרים כאלו על ידי צירופים שונים והוספת בלוקים לפי הצורך. העלות של המהלך האמור היא <math>k\cdot 2^{m/2}</math> כפול הזמן הדרוש לביצוע פעולת גיבוב אחת ועם צריכת זיכרון נמוכה. לדוגמה אם <math>k=2</math> תחילה מוצאים התנגשות ראשונה <math>f(H_0,M_1)=f(H_0,M_1')=H_1</math> ואז התנגשות שנייה <math>f(H_1,M_2)=f(H_1,M_2')=H_2</math> ואז אפשר להכין <math>k^2=4</math> התנגשויות: <math>(M_1M_2), (M_1M_2'),(M_1',M_2)</math> ו-<math>(M_1'M_2')</math>, כולם מכילים תמצית זהה.

===התקפת כינוס===
ג'ון קלסי וטדיושי קונו פיתחו התקפה נגד מבנה מרקל דמגרד הנקראת "התקפת כינוס" (Herding attack). בהתקפה זו בהנחה שהמתקיף מסוגל למצוא התנגשויות מרובות בכוח גס הוא יכול תחילה להציג ערך גיבוב של מסר כלשהו ולאחר מכן "לכנס" כל התחלה של מסר נתון אחר כך שיתקבל ערך הגיבוב שהתחייב לו על ידי בחירת סיומת מתאימה. כלומר המתקיף מראה שהוא מצליח לייצר מסר עם תוספת כלשהי שהגיבוב שלו מתאים לערך הגיבוב הראשוני ובכך הוא הפר למעשה את ההנחה היסודית שלא ניתן למצוא מקור. הרעיון שלהם מסתמך על בחירת ערך גיבוב בצורה כזו שתקל על המתקיף במציאת מקור וההתקפה היא שיפור של הרעיון של Joux על ידי איזון בין זמן וזיכרון. בשלב הראשון המתקיף בוחר <math>2^t</math> ערכי ביניים אפשריים <math>h_i</math> וכן בוחר <math>2^{m/2-t/2}</math> בלוקים בודדים של מסרים כלשהם כאשר <math>m</math> הוא אורך הבלוק בסיביות. הוא מחשב את הפלטים של כל אחד מהבלוקים עם כל אחד מערכי הביניים, מתוך הרשימה הגדולה שקיבל הוא צפוי למצוא מספר התנגשויות. הוא שומר את כל הבלוקים שגרמו להתנגשות וחוזר על התהליך מספר פעמים עם ערכי הביניים שנמצאו. לאחר שהוא נשאר עם ערך ביניים אחד הוא משתמש איתו כדי לחשב את ערך הגיבוב שהוא מתחייב אליו. בשלב המקוון המתקיף צריך לבצע <math>2^{m-t}</math> פעולות גיבוב עד שהוא מוצא מסר שערך הביניים שלו תואם אחד כזה שנמצא ברשימה של <math>2^t</math> ערכים שהכין קודם. אם הוא נמצא ברשימה הוא יכול לקחת את הבלוק המתאים לו שאמור להוביל לערך הגיבוב שהתחייב. סיבוכיות ההתקפה כולה היא <math>2^{m/2+t/2}</math> פעולות הכנה באוף ליין וכן <math>2^{m-t}</math> פעולות און ליין והיא עשויה להיות פרקטית.

==שיפורים==
ההתפתחויות האחרונות במציאת התנגשויות בפונקציות ממשפחת SHA הניעו חוקרים לחפש גישות שונות לפתרון הבעיה. נראה שקיימת חולשה מובנית בסגנון האיטרטיבי של הפונקציה. קיימות מספר אסטרטגיות לשיפור מבנה מרקל דמגרד, בהן:
*צמצום דרישות הביטחון מהפונקציה הפנימית או הפחתת התלות בהגדרות ביטחון מחמירות.
*שימוש במצב פנימי מורחב (wide pipe).
*שיפור מבנה מרקל דמגרד באופן שישמר טוב יותר את תכונות הפונקציה הפנימית.

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

הרחבת הזיכרון או המצב הפנימי (internal state) של פונקציית הדחיסה מתגבר על החיסרון של המבנה האיטרטיבי של מרקל-דמגרד. במקרה זה מציאת התנגשויות פנימיות בערכי הביניים תהיה קשה כמו הפיכת הפונקציה כולה בהנחה שפונקציית הדחיסה טובה. שיטה זו שולבה באלגוריתם LAKE המהווה בסיס לפונקציית הגיבוב BLAKE.

להלן תקציר מספר שיטות מתקדמות של מבנה מרקל דמגרד שנועדו להתמודד עם הקריפטואנליזה המתוארת.

==eMD==
שיטת eMD שהיא קיצור של enveloped Merkle-Damgard הוצעה ב-2006 על ידי מיהיר בלייר ואחרים. והיא נועדה לחיזוק מבנה מרקל דמגרד על ידי שימור הפסאודו-אקראיות של הפונקציה הפנימית. eMD מורכב משני מנגנונים שמטרתם לשמר את תכונות הפונקציה הפנימית. הראשון ריפוד המסר הכולל שילוב קידוד אורך המסר בסופו המבטיח עמידות מפני התנגשויות והשני עטיפת הפונקציה הפנימית בפונקציה פנימית נוספת. המבנה פועל כדלהלן:

הפונקציה הפנימית היא מהצורה:
<center>
:<math>c:\{0,1\}^{d+n}\rightarrow\{0,1\}^n</math> פונקציה כאשר <math>d\ge n+64</math>.
</center>
פונקציית המעטפת היא מהצורה:
<center>
:<math>c^{\circ}:\{0,1\}^{2n}\times D^{\circ}\rightarrow\{0,1\}^n</math> כאשר <math>D^{\circ}=\cup_{i\ge1}\{0,1\}^{(i+1)d-n}</math>.
</center>
היא פועלת על <math>c</math> כדלהלן:
<center>
{| dir="ltr"
|-
|
:<math>c^{\circ}(I_1, I_2, M)</math>:
::<math>M_1,...,M_k \ \ \overset{\underset{\mathrm{def}}{}}{\leftarrow}\ \ \ M</math>
::<math>P\leftarrow M_1,...,M_{k-1}</math>
::<math>\text{Return }c(c^+(I_1,P)\ \| \ M_k \ \| \ I_2)</math>
|}
</center>
כאשר <math>c^+</math> היא מבנה מרקל דמגרד הרגיל. בנוסף צריכה להיות פונקציית ריפוד מתאימה:
<center>
:<math>\text{padEMD}:\{0,1\}^{\le 2^{64}}\rightarrow D^{\circ}</math>.
</center>
הפונקציה מקודדת את אורכו של <math>M</math> המסומן <math>|M|</math> בתוך 64 הסיביות האחרונות של המסר המרופד <math>\text{padEMD}(M)</math>. וכן דרושים שני וקטורי אתחול <math>I_1</math> ו-<math>I_2</math> שונים וקבועים. כעת מבנה eMD הוא:
<center>
:<math>\mathbf{eMD}[c]=c^{\circ}(I_1,I_2,\text{padEMD(M))}</math>.
</center>

==ROX==
ב-2004 פרסמו פיליפ רוגווי ותומס שרימפטון מאמר חשוב לגבי הגדרות ותכונות של פונקציות גיבוב קריפטוגרפיות וציינו שבע תכונות יסודיות שפונקציית גיבוב כזו צריכה לעמוד בהן שהן וריאציות של עמידות מפני התנגשויות, מציאת מקור ראשון ומציאת מקור שני. על בסיס רעיונות אילו פותח המבנה ROX קיצור של Random Oracle XOR שמציע ביטחון טוב יותר ממבנה מרקל דמגרד. הרעיון הוא אם נתונה פונקציית דחיסה מהצורה <math>F:\{0,1\}^k\times \{0,1\}^{b+n}\rightarrow \{0,1\}^n</math>. כאשר <math>2^l</math> הוא מקסימום אורך המסר בסיביות (למשל <math>l=64</math> מקובל). <math>k</math> קטן כגון <math>k=80</math> ו-<math>n</math> יכול להיות 160. ונתונים שני אורקלים אקראיים <math>RO_1:\{0,1\}^k\times \{0,1\}^x\times \{0,1\}^{\lceil \log l\rceil}\rightarrow\{0,1\}^n</math> וכן <math>RO_2:\{0,1\}^k\times \{0,1\}^l\times \{0,1\}^{\lceil \log b\rceil}\rightarrow\{0,1\}^{2n}</math>. אותם אפשר לבנות מצופן בלוקים עם קלט שונה בסיבית אחת. פונקציית הריפוד מקבלת את המסר <math>M</math> ומפיקה בלוקים של מסר מרופד כך:
:<math>m_1\| ...\| m_l=M \| RO_2(m',\gamma, 1)\| RO_2(m',\gamma,2)\| ...,</math>

הריפוד מוסיף למסר סיביות המיוצרות על ידי האורקל האקראי <math>RO_2</math> כך שהבלוק האחרון יכיל לפחות <math>2n</math> סיביות. ייתכן שיתווסף בלוק ריק בסוף המסר המכיל רק ריפוד. נתונה פונקציה <math>\nu(i)</math> שמחזירה את השלם הגדול ביותר <math>j</math> כך שמתקיים <math>2^j</math> מחלק את <math>i</math>. וכן הסימן <math>m'</math> מייצג את <math>k</math> הסיביות הראשונות של <math>m</math>. מבנה ROX מומחש בפסאודו קוד הבא:

{| align="center"
|-
|
<div class="mw-content-ltr">
:<math>\mathbf{ROX}_F^{RO_1,RO_2}(K,M)</math>
::<math>m_1\| ...\| m_l\leftarrow \text{roxpad}^{RO_2}(M)</math>
::<math>h_0=IV.</math>
::<math>\text{For }i=0\text{ to }\lfloor\log_2(l)\rfloor\text{ do: }</math>
:::<math>\mu\leftarrow RO_1(K,\mathfrak{m},i)</math>
::<math>\text{For }i=1\text{ to }l \text{ do: }</math>
:::<math>g_i\leftarrow h_{i-1}\oplus \mu_{\nu(i)},</math>
:::<math>h_i\leftarrow F(K,m_i \| g_i)</math>
::<math>\text{Return }h_l</math>
</div>
|}

מבנה ROX נחשב לבטוח ומשמר את כל התכונות הטובות שצוינו, במסגרת מודל אורקל אקראי.

==HAIFA==
HAsh Iterative FrAmework בקיצור HAIFA הוצע ב-2009 על ידי אלי ביהם ואור דונקלמן כשיפור של מבנה מרקל-דמגרד. HAIFA משמר את התכונות הטובות של מבנה מרקל דמגרד תוך הוספה בביטחון וסקלביליות. הוא פשוט וגמיש, משמר את העמידות מפני התנגשויות של פונקציית הדחיסה, משפר את העמידות שלה נגד התקפת מקור שני ומקשה על התקפת נקודת שבת והתקפות מתקדמות אחרות. אפשר לראות ב-HAIFA כמודל פשוט המשלב יחד כמה מהרעיונות שהוצעו כמו eMD, ROX ו-RMC וניצול התכונות הטובות שלהם.

הרעיון הכללי של HAIFA הוא תוספת מונה וגיוון (salt) לתוך פונקציית הדחיסה. המונה מייצג את מספר הסיביות המצטבר שנקלטו עד כה בכל סבב של האיטרציה. וה-<math>\text{salt}</math> הוא ערך אקראי כלשהו לא סודי. בשיטה זו פונקציית הדחיסה תראה כך:
:<math>H:\{0,1\}^m\times \{0,1\}^n\times \{0,1\}^b\times \{0,1\}^s \rightarrow \{0,1\}^m</math>.
ערך הביניים מחושב על ידי:
:<math>h_i=H(h_{i-1},M_i,\text{nbits}, \text{salt})</math>.
כאשר <math>\text{nbits}</math> מייצג את מספר הסיביות שנקלטו עד עכשיו. כדי לגבב את המסר <math>M</math> והגיוון <math>s</math> יש לבצע את המהלכים הבאים:
#תחילה מרפדים את <math>M</math> לפי שיטת הריפוד להלן.
#מחשבים את וקטור האתחול <math>IV</math> באורך <math>m</math> סיביות בשיטה המתוארת להלן.
#באופן איטרטיבי מעבדים את המסר המרופד בפונקציה <math>H</math> עם הערך ההתחלתי <math>IV</math> והגיוון <math>s</math>. במקרה שהבלוק האחרון שנוסף למסר בעקבות הריפוד אינו מכיל סיביות מהמסר עצמו אלא רק את הריפוד הערך <math>\text{nbits}=0</math>.
#חותכים במידת הצורך ומחזירים את ערך הביניים האחרון.

ריפוד המסר של HAIFA דומה לשיטת הריפוד של מרקל דמגרד.
#מוסיפים '1' בסוף המסר.
#מרפדים באפסים לפי הצורך כך שאורך המסר יהיה שקול ל-<math>n-(t+r)</math> מודולו <math>n</math> כאשר <math>t</math> הוא מספר הסיביות הדרוש לקידוד אורך המסר ו-<math>r</math> מספר הסיביות הדרוש לקידוד אורך התמצית.
#מוסיפים את אורך המסר ב-<math>t</math> הסיביות הבאות.
#מוסיפים את אורך התמצית בסיביות ב-<math>r</math> הסיביות הבאות.

הכנת ה-IV דורשת עבודה נוספת כדי לתמוך בתמצית מסר באורכים שונים כפי שתקן SHA דורש. תחילה יש לעבד את וקטור האתחול. כלומר בהינתן <math>IV</math> שנבחר על ידי המשתמש יש לחשב את:
:<math>IV = H(IV,m,0,0)</math>
את <math>m</math> מקודדים ב-<math>r</math> הסיביות הראשונות, מוסיפים '1' ולאחר מכן <math>n-r-1</math> אפסים. לאחר קריאה זו אפשר להמשיך ליתר הבלוקים של המסר. הקריאה הזו שונה מיתר הקריאות לפונקציה <math>H</math> והיא ייחודית בכך שבשיטה זו אפשר לחתוך את פלט פונקציית הגיבוב לכל אורך רצוי. בנוסף במקרים כאשר ידוע מראש שפלט קבוע באורכו אפשר לחשב מראש את הקריאה הזו ולקודד את התוצאה בתוך הפונקציה.

הוספת אורך תמצית המסר נועדה למנוע מצב שבו שני מסרים עם שני וקטורי אתחול שונים יפיקו ערך ביניים זהה. כמו כן שיטת HAIFA מסתמכת על כך שניתן להבחין בבלוק האחרון. זה אפשרי בשיטה זו כיוון שיש מונה. אם <math>\text{nbits} < n-(t+r)\text{ mod }n</math> וכן <math>\text{nbits} > 0</math> אז זהו הבלוק האחרון של המסר וכן לא קיים אחריו בלוק ריפוד. אחרת קיימות שתי אפשרויות אם <math>\text{nbits}\ne 0\text{ mod }n</math> אזי המשמעות היא שקיים בלוק נוסף שמכיל ריפוד, אחרת אם <math>\text{nbits}=0\text{ mod }n</math> זהו בלוק הריפוד עצמו שבמקרה אינו מכיל סיביות מהמסר כלל. למשל אם <math>m=512</math> ו-<math>n=1536</math> ונניח ש-<math>t+r=64</math>. היות ש-<math>n</math> מתחלק ב-512 נוסף בלוק ריפוד באורך 512 ובתחילתו תוספת 1 לאחריו 447 אפסים ובסופו קידוד האורך ב-64 ביט ומתקבל בסך הכול 2048. במקרה זה בבלוק האחרון <math>\text{nbits}=0</math>.

מבנה HAIFA שולב בפונקציית הגיבוב BLAKE שהייתה מועמדת לתחרות פונקציות הגיבוב SHA-3 שהתקיימה ב-2008 ונוהלה על ידי NIST. וכן מהווה בסיס לגרסה המתקדמת BLAKE2.

בדומה למבנה מרקל דמגרד אפשר להוכיח שמבנה HAIFA משמר את עמידות הפונקציה הפנימית מפני התנגשויות. כאשר שיטת הריפוד ותוספת המונה יחד עם ה-<math>\text{salt}</math> מקשים מאוד על מספר התקפות מתקדמות כמו התקפת נקודת שבת, התקפת רב-התנגשויות וכדומה. ה-<math>\text{salt}</math> למעשה מקנה לפונקציה פסאודו-אקראיות. זה מאפשר להגדיר את ביטחון הפונקציה במודלים תאורטיים, זה מעביר את כל ההתקפות שהיו אפשריות במצב אוף ליין למצב און ליין כיוון שה-<math>\text{salt}</math> אינו ידוע למתקיף מראש. ה-<math>\text{salt}</math> אינו סודי והוא יכול להיות למעשה כל דבר תלוי יישום כמו נומרטור, מחרוזת זיהוי, חותם זמן או סתם מחרוזת אקראית. וכן הוא לא חייב להיות כאורך המסר אלא כאורך הבלוק בלבד.



==ראו גם==
* פונקציית גיבוב קריפטוגרפית
* SHA-2

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

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