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 בתים. הקלט M תחילה מרופד, לפי שיטת ריפוד שתובא בהמשך, באופן שיתחלק ל-t בלוקים שלמים באורך \ell סיביות כל אחד המסומנים m_1,...,m_t. האורך \ell מייצג את גודל הזיכרון הפנימי של האלגוריתם הנקרא **מצב** (state) וצריך להיות 512 סיביות עבור תמציות באורך של עד 256 סיביות או 1024 סיביות במידה שאורך התמצית המבוקשת גדול יותר. המבנה הכללי של האלגוריתם פשוט בתכלית כמתואר בתרשים משמאל. האלגוריתם מקבל וקטור אתחול h_0=\text{iv} באורך \ell סיביות ואת הבלוקים של הקלט ומעבד אותם בזה אחר זה:
:h_i\longleftarrow f(h_{i-1},m_i) כאשר i=1 עד t.
בכל סבב של האלגוריתם פונקציית הכיווץ הפנימית f מקבלת שני קלטים באורך \ell סיביות כל אחד, הראשון הוא תוצאת הפונקציה מהסבב הקודם הנקראת **ערך ביניים** והשני נקרא **בלוק מסר** ומחזירה בלוק אחד h_i מסיבה זו היא נקראת פונקציית **כיווץ**. לאחר עיבוד כל הבלוקים התוצאה היא h_t. פלט האלגוריתם הסופי הוא H(M)=\Omega(h_t) כאשר \Omega היא פונקציה מסיימת שמקצצת (truncate) את הפלט לאורך הרצוי והיא מוגדרת להלן. הפלט שלה באורך n סיביות הוא תמצית המסר הסופית.

### פונקציית הכיווץ
180px|ממוזער|שמאל|פונקציית הכיווץ הפנימית של Grøstl
פונקציית הכיווץ f השוכנת בלב האלגוריתם היא פונקציה מהצורה: f:\{0,1\}^{\ell}\times\{0,1\}^{\ell}\longrightarrow\{0,1\}^{\ell}
המבוססת על שתי תמורות פנימיות גדולות וקבועות הנקראות P ו-Q בהתאמה, באורך \ell סיביות כל אחת. שים לב שעבור תמצית באורך n, רוחב המצב הפנימי חייב להיות \ell\ge 2n. באופן פורמלי פונקציית הכיווץ מבצעת, כמתואר בתרשים משמאל:
:f(h_{i-1},m_i)=P(h_{i-1}\oplus m_i)\oplus Q(m_i)\oplus h_{i-1}.

### פונקציה מסיימת
הפונקציה \text{trunc}_n(x) שהיא מעין פעולת "קיצוץ" שמחזירה רק את n הסיביות המסיימות של הקלט x ומתעלמת מכל היתר. הפונקציה המסיימת של האלגוריתם \Omega המתוארת בתרשים משמאל היא:
:\Omega(x)=\text{trunc}_n(P(x)\oplus x).

### התמורות
220px|ממוזער|שמאל|תרשים הפונקציה <math>\Omega</math> של Grøstl
כאמור פונקציית הכיווץ הפנימית פועלת בשתי גרסאות, גרסת 512 סיביות עם התמורות: P_{512}, Q_{512}, עבור תמצית מסרים קצרה והשנייה גרסת 1024 סיביות עם התמורות P_{1024}, Q_{1024}, עבור תמצית ארוכה. כל גרסה משתמשת בזוג תמורות P ו-Q אחרות. כך שבסך הכול קיימות ארבע תמורות שונות. התמורות הן בהשראת צופן הבלוקים AES, כלומר כל אחת מהן מורכבת למעשה מ-R סבבים שבכל אחד מהם מתבצעות ארבע פעולות ערבוב ופיזור שונות בהתאם לטבלאות קבועות. היות שהמצב הפנימי גדול בהרבה מזה של AES היה צורך לחשב מחדש את ערכיהן. הפעולות של התמורות הן:
***הוספת קבועים**
***החלפת בתים**
***הזזת בתים**
***ערבוב בתים**

הפעולה הראשונה והשלישית משתנות בהתאם לאורך התמצית המבוקשת ואילו האחרות זהות. מספר הסבבים נקבע גם הוא לפי אורך התמצית המבוקשת. עבור תמצית בטווח [8-256] סיביות נדרשים עשרה סבבים ועבור תמצית בטווח [264-512] נדרשים 14 סבבים. סדר הפעולות מוגדר באופן פורמלי על ידי:
:R=\text{MixBytes}\circ\text{ShiftBytes}\circ\text{SubBytes}\circ\text{AddRoundConstants}.
כל הפעולות מבוצעות על המצב הפנימי המיוצג כמערך דו־ממדי של בתים או מטריצה מסדר 8\times v בתים. v מייצג את מספר העמודות והוא שווה 8 או 16 בהתאם לגודל המצב הפנימי. עבור תמצית מסרים עד 256 סיביות v=8 בתים ואילו עבור תמצית ארוכה יותר v=16 בתים. ההמרה ממערך בתים למטריצה ובחזרה נייטרלית מהיבט של סדר הבתים, אולם יש צורך לציין במפורש כיצד מערך של 64 בתים ממופה למטריצה A וההפך. אם נמספר את כניסות 64 הבתים של המערך מ-00 עד \text{3f} בבסיס הקסדצימלי הרי שהמיפוי מתבצע כמתואר בתרשים הבא:


\begin{bmatrix}
\text{00} & \text{08} & \text{10} & \text{18} & \text{20} & \text{28} & \text{30} & \text{38} \\
\text{01} & \text{09} & \text{11} & \text{19} & \text{21} & \text{29} & \text{31} & \text{39} \\
\text{02} & \text{0a} & \text{12} & \text{1a} & \text{22} & \text{2a} & \text{32} & \text{3a} \\
\text{03} & \text{0b} & \text{13} & \text{1b} & \text{23} & \text{2b} & \text{33} & \text{3b} \\
\text{04} & \text{0c} & \text{14} & \text{1c} & \text{24} & \text{2c} & \text{34} & \text{3c} \\
\text{05} & \text{0d} & \text{15} & \text{1d} & \text{25} & \text{2d} & \text{35} & \text{3d} \\
\text{06} & \text{0e} & \text{16} & \text{1e} & \text{26} & \text{2e} & \text{36} & \text{3e} \\
\text{07} & \text{0f} & \text{17} & \text{1f} & \text{27} & \text{2f} & \text{37} & \text{3f}
\end{bmatrix}

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

### הוספת קבועי סבב
בשלב זה מחברים ב-XOR את קבועים המובאים להלן בהתאם למספר הסבב עם המטריצה A. בניסוח רשמי עבור סבב i החל מאפס, מעדכנים את המטריצה כך:
:A\leftarrow A\oplus C[i].
כאשר C[i] הוא קבוע תלוי סבב המתאים לסבב i. לתמורות P ו-Q יש קבועים שונים. הקבועים עבור מצב פנימי של 512 סיבית בבסיס הקסדצימלי, הם:


P_{512}:C[i]=\begin{bmatrix}
00 \oplus i & 10 \oplus i & 20 \oplus i & 30 \oplus i & 40 \oplus i & 50 \oplus i & 60 \oplus i & 70 \oplus i \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00
\end{bmatrix}

Q_{512}:C[i]=\begin{bmatrix}
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} \\
\text{ff} \oplus i & \text{ef} \oplus i & \text{df} \oplus i & \text{cf} \oplus i & \text{bf} \oplus i & \text{af} \oplus i & \text{9f} \oplus i & \text{8f} \oplus i
\end{bmatrix}


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


P_{1024}:C[i]=\begin{bmatrix}
00 \oplus i & 10 \oplus i & 20 \oplus i & 30 \oplus i & 40 \oplus i & 50 \oplus i & 60 \oplus i & 70 \oplus i & \cdots & \text{f0} \oplus i \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 & \cdots & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 & \cdots & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 & \cdots & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 & \cdots & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 & \cdots & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 & \cdots & 00 \\
00 & 00 & 00 & 00 & 00 & 00 & 00 & 00 & \cdots & 00
\end{bmatrix}

Q_{1024}:C[i]=\begin{bmatrix}
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \cdots & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \cdots & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \cdots & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \cdots & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \cdots & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \cdots & \text{ff} \\
\text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \text{ff} & \cdots & \text{ff} \\
\text{ff} \oplus i & \text{ef} \oplus i & \text{df} \oplus i & \text{cf} \oplus i & \text{bf} \oplus i & \text{af} \oplus i & \text{9f} \oplus i & \text{8f} \oplus i & \cdots & \text{0f} \oplus i
\end{bmatrix}



### החלפת בתים
ההחלפה מתבצעת על המצב הפנימי בית אחר בית לפי תיבות החלפה קבועות הנקראות S-box. תיבות אילו זהות לתיבות ההחלפה של ריינדל. כך שאם a_{i,j} הוא אלמנט בשורה i ובעמודה j של המטריצה A טרנספורמציית ההחלפה SubBytes מתבצעת כדלהלן:
:a_{i,j}=S(a_{i,j}), 0\le i.

### הזזת בתים
הזזת בתים, ליתר דיוק **הזזת בתים מעגלית** מתבצעת באופן שונה בהתאם לסוג המצב הפנימי. כמו בריינדל, שורות המצב מוסטות באופן מעגלי, כל אלמנט מועתק לאמנט שמשמאלו והאלמנט האחרון מועתק לאלמנט הראשון בתנועה מעגלית כמו בשעון. אם הווקטור \sigma=[\sigma_0,\sigma_1\,...,\sigma_7] הוא רשימה של שלמים בטווח שבין 0 ל-v-1 אז ההזזה ShiftBytes מזיזה את כל הבתים שבשורה ה-i של מטריצת המצב \sigma_i צעדים או פוזיציות לשמאל ומחזירה את הבתים ששנפלטו מצד אחד לצד השני. עבור התמורה P הווקטור הוא \sigma=[0,1,2,3,4,5,6,7], כלומר השורה הראשונה אינה מוסטת כלל, השנייה מוסטת בפוזיציה אחת, השלישית בשתי פוזיציות וכן הלאה. ואילו עבור Q הווקטור הוא \sigma=[1,3,5,7,0,2,4,6]. במצב הפנימי הרחב משתמשים בווקטור אחר כי קיימות יותר עמודות. במקרה זה וקטורי ההזזות עבור P ו-Q הם \sigma=[0,1,2,3,4,5,6,11] וכן \sigma=[1,3,5,11,0,2,4,6] בהתאמה.

### ערבוב בתים
בפעולת הערבוב כל עמודה של המטריצה A מעובדת בנפרד. פעולה זו היא פעולה בשדה הסופי \mathbb{F}_{256} וכמו בצופן ריינדל השדה מוגדר על ידי הפולינום האי-פריק x^8+x^4+x^3+x+1 מעל \mathbb{F}_2. הבתים של העמודה ה-i נחשבים לאלמנטים בשדה ופעולות הכפל והחיבור בין אלמנטים אילו מתבצעת לפי כללי האריתמטיקה בשדה הבינארי המורחב {F}_{2^8}. כלומר האלמנטים נחשבים לפולינומים מדרגה 7 עם מקדמים אפס או אחד, הסיבית המשמעותית ביותר מייצגת את המקדם המוביל ואילו הסיבית הכי פחות משמעותית מייצגת את המקדם החופשי והכפל והחיבור הם על המקדמים כנהוג בפולינומים. ביתר פירוט ראה צופן ריינדל.

הטרנספורמציה MixBytes מכפילה כל עמודה של המטריצה A במטריצה קבועה B מסדר 8\times 8. כל התהליך יכול להתפרש ככפל מטריצות הבא:
:A\leftarrow B\times A.
והמטריצה B היא **מטריצה מעגלית**, שפירושה הוא שכל שורה שווה לשורה שמעליה כשהי מוסטת באופן מעגלי צעד אחד לימין:


B=\begin{bmatrix}
02 & 02 & 03 & 04 & 05 & 03 & 05 & 07 \\
07 & 02 & 02 & 03 & 04 & 05 & 03 & 05 \\
05 & 07 & 02 & 02 & 03 & 04 & 05 & 03 \\
03 & 05 & 07 & 02 & 02 & 03 & 04 & 05 \\
05 & 03 & 05 & 07 & 02 & 02 & 03 & 04 \\
04 & 05 & 03 & 05 & 07 & 02 & 02 & 03 \\
03 & 04 & 05 & 03 & 05 & 07 & 02 & 02 \\
02 & 03 & 04 & 05 & 03 & 05 & 07 & 02
\end{bmatrix}


אפשר לתאר את המטריצה בכתיב מקוצר: B=\text{circ}(2,2,3,4,5,3,5,7) כאשר הפונקציה \text{circ} היא פונקציית הזזה מעגלית.

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




### ריפוד
פונקציית הריפוד של Grøstl הנקראת כאן x^*=\text{pad}(x) דומה לזו שיושמה ב-MD5. בהינתן קלט באורך N סיביות, תחילה מוסיפים את הסיבית '1' בסופו ואז מוסיפים אפסים כנדרש כדי להשלימו לאורך המתחלק ב-\ell פחות 64 סיביות. בניסוח רשמי מספר האפסים שיש להוסיף הוא w=-N-65\text{ mod }\ell. ב-64 הסיביות הנותרות מקודדים את הערך (N+w+65)/\ell המספר הזה יוצא תמיד שלם בגלל w והוא מייצג את מספר הבלוקים הסופי לאחר הריפוד. לאור זאת האורך המקסימלי של קלט הניתן לעיבוד על ידי Grøstl יכול להיות לכל היותר 2^{64}-1 בלוקים אחרת 64 סיביות לא יספיקו כדי לקודד את הערך האמור. עבור תמצית מסרים קצרה אורך הקלט המקסימלי הוא 512\cdot (2^{64}-1)-65=2^{73}-577 ועבור תמצית מסרים ארוכה האורך המקסימלי הוא 1024\cdot(2^{64}-1)-65=2^{74}-1089.

## ביטחון ויעילות
Grøstl יכולה להגיע לתפוקה של 21.4 מחזורי שעון לבית על מעבד Intel Core 2. האלגוריתם הוא שילוב של מצב פנימי רחב (wide pipe) עם גרסה של מבנה מרקל-דמגרד משופרת (שבה מקצצים חלק מהפלט). בעקבות הניסיון המצטבר הוכח ששתי התכונות הללו מחזקות את האלגוריתם מפני התקפות קריפטואנליטיות שונות. זיכרון פנימי רחב עוזר נגד התקפות גנריות שמתמקדות באיטרציה של הפונקציה הפנימית. האלגוריתם מסתמך על שתי תמורות שונות, תחת ההנחה התאורטית שהתמורות הללו אקראיות המפתחים הוכיחו שהיתרון של מבחין לזיהוי בין פלט Grøstl לבין פלט אקראי אמיתי אינו גדול מ-O((Kq)^4/2^{\ell}), כאשר המבחין רשאי להגיש לכל היותר q שאילתות באורך לכל היותר K בלוקים. כמו כן אפשר לראות שיש חשיבות לפונקציה המסיימת בלעדיה קיימות התקפות מעשיות נגד האלגוריתם. כמו כן קיימות התקפות היעילות מכוח גס נגד גרסה מצומצמת של גרוסטל בחמישה סבבים.

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

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

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

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