Grøstl

Grøstl (גרוסטל) היא פונקציית גיבוב קריפטוגרפית שהייתה מועמדת ל-SHA-3 והייתה בין חמשת האלגוריתמים שעלו לגמר. Grøstl היא פונקציית גיבוב איטרטיבית ברמת בתים, עם זיכרון פנימי רחב (wide pipe), בסגנון רשת החלפה-תמורה בדומה ל-AES והיא למעשה משתמשת במספר מרכיבים דומים. פונקציית הכיווץ הפנימית בנויה משתי תמורות גדולות וקבועות שנבנו כך שתהיה להן עקבה רחבה באופן שאפשר להראות את עמידותן נגד התקפות קריפטואנליטיות שונות. יתרה מזו אם מניחים שהתמורות הפנימיות "אידיאליות" קיימת הוכחה לביטחון פונקציית הגיבוב. Grøstl באופן כללי מבוססת על עקרונות שונים למדי ממשפחת האלגוריתמים SHA והיא בעלת ביצועים טובים על מגוון פלטפורמות.

מוטיבציה ושיקולי פיתוח
פונקציית הגיבוב Grøstl פותחה ב-2011 על ידי Praveen Gauravaram, Lars Knudsen, Krystian Matusiewicz, Florian Mendel, Christian Rechberger, Martin Schläffer, ו-Søren S. Thomsen. המפתחים ממדינות שונות, דנמרק, פולין אוסטריה ובלגיה.

מקור השם Grøstl נובע משילוב של שתי שפות. Gröstl מתאר מאכל אוסטרי מסורתי, כאשר האות "ö" הוחלפה ב-"ø" שהיא מהאלפבית הדני, אותה מבטאים באופן דומה. ביטוי השם בשפות רבות קשה, במיוחד בגלל האות ø אותה אפשר להחליף בהלחם האותיות "oe".

הפונקציה פותחה עקב הקריאה של NIST לפיתוח תקן חדש של פונקציות גיבוב קריפטוגרפיות שכונה SHA-3, בסוף 2008 הוכרזה התחרות שבה השתתפו מועמדים רבים ומתוכם רק חמישה הגיעו לקו הסיום ביניהם גרוסטל. באוקטובר 2012 נבחר קצ'אק מבין חמשת המועמדים המובילים לאלגוריתם הזוכה בתחרות. המארגנים הצהירו כי חמשת האלגוריתמים המובילים נבדקו היטב ונמצאו ראויים לשימוש ולא התגלו בהם פגמים רציניים.

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

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

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

תיאור האלגוריתם
560px|ממוזער|שמאל|מבנה כללי של פונקציית הגיבוב Grøstl
אלגוריתם גרוסטל הוא פונקציית גיבוב איטרטיבית במבנה מרקל-דמגרד הפועלת ברמה של בתים, מקבלת מסר באורך כלשהו ומחזירה תמצית גיבוב באורך משתנה בין בית אחד ל-64 בתים לפי בחירת המשתמש. אורכים שונים של הפלט מבוטאים במספר המופיע לאחר השם, לדוגמה Grøstl-256 מחזירה מחרוזת באורך 256 סיביות או 32 בתים. הקלט  תחילה מרופד, לפי שיטת ריפוד שתובא בהמשך, באופן שיתחלק ל- בלוקים שלמים באורך  סיביות כל אחד המסומנים . האורך  מייצג את גודל הזיכרון הפנימי של האלגוריתם הנקרא מצב (state) וצריך להיות 512 סיביות עבור תמציות באורך של עד 256 סיביות או 1024 סיביות במידה שאורך התמצית המבוקשת גדול יותר. המבנה הכללי של האלגוריתם פשוט בתכלית כמתואר בתרשים משמאל. האלגוריתם מקבל וקטור אתחול  באורך  סיביות ואת הבלוקים של הקלט ומעבד אותם בזה אחר זה:
 כאשר  עד .
בכל סבב של האלגוריתם פונקציית הכיווץ הפנימית  מקבלת שני קלטים באורך  סיביות כל אחד, הראשון הוא תוצאת הפונקציה מהסבב הקודם הנקראת ערך ביניים והשני נקרא בלוק מסר ומחזירה בלוק אחד  מסיבה זו היא נקראת פונקציית כיווץ. לאחר עיבוד כל הבלוקים התוצאה היא . פלט האלגוריתם הסופי הוא  כאשר  היא פונקציה מסיימת שמקצצת (truncate) את הפלט לאורך הרצוי והיא מוגדרת להלן. הפלט שלה באורך  סיביות הוא תמצית המסר הסופית.

פונקציית הכיווץ
180px|ממוזער|שמאל|פונקציית הכיווץ הפנימית של Grøstl
פונקציית הכיווץ  השוכנת בלב האלגוריתם היא פונקציה מהצורה: 
המבוססת על שתי תמורות פנימיות גדולות וקבועות הנקראות  ו- בהתאמה, באורך  סיביות כל אחת. שים לב שעבור תמצית באורך , רוחב המצב הפנימי חייב להיות . באופן פורמלי פונקציית הכיווץ מבצעת, כמתואר בתרשים משמאל:
.

פונקציה מסיימת
הפונקציה  שהיא מעין פעולת "קיצוץ" שמחזירה רק את  הסיביות המסיימות של הקלט  ומתעלמת מכל היתר. הפונקציה המסיימת של האלגוריתם  המתוארת בתרשים משמאל היא:
.

התמורות
220px|ממוזער|שמאל|תרשים הפונקציה  של Grøstl
כאמור פונקציית הכיווץ הפנימית פועלת בשתי גרסאות, גרסת 512 סיביות עם התמורות: , , עבור תמצית מסרים קצרה והשנייה גרסת 1024 סיביות עם התמורות , , עבור תמצית ארוכה. כל גרסה משתמשת בזוג תמורות  ו- אחרות. כך שבסך הכול קיימות ארבע תמורות שונות. התמורות הן בהשראת צופן הבלוקים AES, כלומר כל אחת מהן מורכבת למעשה מ- סבבים שבכל אחד מהם מתבצעות ארבע פעולות ערבוב ופיזור שונות בהתאם לטבלאות קבועות. היות שהמצב הפנימי גדול בהרבה מזה של AES היה צורך לחשב מחדש את ערכיהן. הפעולות של התמורות הן:
הוספת קבועים
החלפת בתים
הזזת בתים
ערבוב בתים

הפעולה הראשונה והשלישית משתנות בהתאם לאורך התמצית המבוקשת ואילו האחרות זהות. מספר הסבבים נקבע גם הוא לפי אורך התמצית המבוקשת. עבור תמצית בטווח [8-256] סיביות נדרשים עשרה סבבים ועבור תמצית בטווח [264-512] נדרשים 14 סבבים. סדר הפעולות מוגדר באופן פורמלי על ידי:
.
כל הפעולות מבוצעות על המצב הפנימי המיוצג כמערך דו־ממדי של בתים או מטריצה מסדר  בתים.  מייצג את מספר העמודות והוא שווה 8 או 16 בהתאם לגודל המצב הפנימי. עבור תמצית מסרים עד 256 סיביות  בתים ואילו עבור תמצית ארוכה יותר  בתים. ההמרה ממערך בתים למטריצה ובחזרה נייטרלית מהיבט של סדר הבתים, אולם יש צורך לציין במפורש כיצד מערך של 64 בתים ממופה למטריצה  וההפך. אם נמספר את כניסות 64 הבתים של המערך מ-00 עד  בבסיס הקסדצימלי הרי שהמיפוי מתבצע כמתואר בתרשים הבא:

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

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

באופן דומה הקבועים עבור מצב פנימי גדול הם:

החלפת בתים
ההחלפה מתבצעת על המצב הפנימי בית אחר בית לפי תיבות החלפה קבועות הנקראות S-box. תיבות אילו זהות לתיבות ההחלפה של ריינדל. כך שאם  הוא אלמנט בשורה  ובעמודה  של המטריצה  טרנספורמציית ההחלפה SubBytes מתבצעת כדלהלן:
.

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

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

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

אפשר לתאר את המטריצה בכתיב מקוצר:  כאשר הפונקציה  היא פונקציית הזזה מעגלית.

קבועים התחלתיים
וקטור האתחול  עבור Grøstl-n כאשר  מייצג את אורך התמצית המבוקשת, הוא הייצוג הבינארי של  במשתנה באורך  סיביות. בטבלה הבאה מופיעים הערכים ההתחלתיים עבור תמציות באורכים 224,256,384,512 בבסיס הקסדצימלי:


ריפוד
פונקציית הריפוד של Grøstl הנקראת כאן  דומה לזו שיושמה ב-MD5. בהינתן קלט באורך  סיביות, תחילה מוסיפים את הסיבית '1' בסופו ואז מוסיפים אפסים כנדרש כדי להשלימו לאורך המתחלק ב- פחות 64 סיביות. בניסוח רשמי מספר האפסים שיש להוסיף הוא . ב-64 הסיביות הנותרות מקודדים את הערך  המספר הזה יוצא תמיד שלם בגלל  והוא מייצג את מספר הבלוקים הסופי לאחר הריפוד. לאור זאת האורך המקסימלי של קלט הניתן לעיבוד על ידי Grøstl יכול להיות לכל היותר  בלוקים אחרת 64 סיביות לא יספיקו כדי לקודד את הערך האמור. עבור תמצית מסרים קצרה אורך הקלט המקסימלי הוא  ועבור תמצית מסרים ארוכה האורך המקסימלי הוא .

ביטחון ויעילות
Grøstl יכולה להגיע לתפוקה של 21.4 מחזורי שעון לבית על מעבד Intel Core 2. האלגוריתם הוא שילוב של מצב פנימי רחב (wide pipe) עם גרסה של מבנה מרקל-דמגרד משופרת (שבה מקצצים חלק מהפלט). בעקבות הניסיון המצטבר הוכח ששתי התכונות הללו מחזקות את האלגוריתם מפני התקפות קריפטואנליטיות שונות. זיכרון פנימי רחב עוזר נגד התקפות גנריות שמתמקדות באיטרציה של הפונקציה הפנימית. האלגוריתם מסתמך על שתי תמורות שונות, תחת ההנחה התאורטית שהתמורות הללו אקראיות המפתחים הוכיחו שהיתרון של מבחין לזיהוי בין פלט Grøstl לבין פלט אקראי אמיתי אינו גדול מ-, כאשר המבחין רשאי להגיש לכל היותר  שאילתות באורך לכל היותר  בלוקים. כמו כן אפשר לראות שיש חשיבות לפונקציה המסיימת בלעדיה קיימות התקפות מעשיות נגד האלגוריתם. כמו כן קיימות התקפות היעילות מכוח גס נגד גרסה מצומצמת של גרוסטל בחמישה סבבים.

המפתחים מונים ניתוח סדרה של התקפות קריפטואנליטיות ידועות והטענות שלהם לגבי הביטחון של Grøstl נגד התקפות אילו. בין ההתקפות הם מונים את: ההתקפה הדיפרנציאלית, התקפת ריבאונד, אנליזה ליניארית ואינטגרלית, התקפה אלגברית, התקפות התנגשויות ורב-התנגשויות, התקפת הארכה והתקפת נקודות שבת, התקפת יום הולדת וההתקפה של קלסי ושנייר על מבנה מרקל-דמגרד. הם מסכמים שביטחון האלגוריתם עם מספר סבבים מלא, נגד כל ההתקפות המתוארות הוא לכל הפחות בסדר גודל של . לכן אם הפלט הוא באורך 256 סיביות המשמעות היא ביטחון של  שזה המינימום הנדרש כיום.

ראו גם
 SHA-3
 AES
 שיטת מרקל-דמגרד

הערות שוליים

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