**SHA-3**, השלישית במשפחת האלגוריתמים Secure Hash Algorithm (בשמו המקורי **Keccak**), היא פונקציית גיבוב קריפטוגרפית שפותחה ב-2008 על ידי גוידו ברטוני, יוהאן דאמן (ממפתחי AES), מיכאל פיטרס וג'יל ואן אשה, ונבחרה על ידי NIST כתקן גיבוב פדרלי של ממשלת ארצות הברית.

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

תחרות תקן הגיבוב
----------------

המניע מאחורי פיתוח תקן SHA-3 הוא התפתחותן של טכניקות קרפיטואנליטיות חדשות וחשיפת חולשות תאורטיות ומעשיות באלגוריתמים הקודמים במשפחה MD5 וכן SHA-0 והתקפה תאורטית על SHA-1. ב-NIST ראו צורך לפתח פונקציית גיבוב חדשה שונה במבנה ובקונספט מקודמותיה, על מנת להרחיב את היצע הפונקציות במשפחה, וסימונה יהיה SHA-3. לאור זאת הוחלט בנובמבר 2007 על תחרות פתוחה לציבור לפיתוח פונקציית גיבוב קריפטוגרפית שתשמש כתקן גיבוב ממשלתי (בדומה לתחרות לבחירת תקן AES שבסופה נבחר צופן הבלוקים Rijndael). באוקטובר 2008 הצטברו 64 הצעות של מומחי הצפנה מכל העולם, מתוכם נבחרו 51 מועמדים לסבב הראשון לאחר שכמה מהם נפסלו כי לא עמדו בתנאי הסף. ביולי 2009 הצטמקה הרשימה הנבחרת לסבב השני ל-14 מועמדים, ההכרזה בוצעה באמצעות אימייל שנשלח לרשימת התפוצה של התחרות.

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

בדצמבר 2010 הגיעו לגמר חמישה מועמדים מובילים:

* **Keccak**
* Skein
* JH
* Grøstl
* BLAKE

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

משפחת האלגוריתמים SHA-3 הוכנסה לתקן FIPS PUB 202 של NIST והיא כוללת שישה אלגוריתמים בגדלים שונים בהתאם, SHA3-224,‏ SHA3-256,‏ SHA3-384 ו-SHA3-512 וכן שתי פונקציות הרחבה הנקראות XOF והן SHAKE128 ו-SHAKE256. תקן FIPS 202 אושר על ידי מנהל מחלקת המסחר של ארצות הברית באוגוסט 2015.

כל החישובים בפונקציית הגיבוב, מוגבלים לפעולות AND,‏ NOT,‏ XOR והזזה מעגלית (Rotate), ללא פעולות אריתמטיות או פונקציות המבוססות על מידע חיצוני. וכן אין צורך ליישם טבלאות חיפוש לצורך האצת החישובים. לפי הצהרת המפתחים נדרשים 12.5 מחזורי שעון לבית במעבד אינטל ליבה כפולה. בגרסת החומרה שלו האלגוריתם הפגין ביצועים טובים יותר מכל המועמדים האחרים.

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

Keccak
------

תיאור המצב הפנימי של Keccak. נתיב (lane) הוא שורה אחת לאורך ציר ה-z
אלגוריתם Keccak (מבוטא קֵצַ'אק, על שם ריקוד באלינזי עתיק) פותח ב-2008 על ידי Guido Bertoni, Joan Daemen, Michaël Peeters ו-Gils Van Assche. זוהי משפחה של פונקציות גיבוב המבוססת על פונקציית ספוג שהיא מבנה גנרי שהומצא במהלך פיתוח אלגוריתם RadioGatun. ב-Keccak הפונקציה הפנימית f היא פרמוטציה אחת מתוך אוסף של שבע פרמוטציות אפשריות המסומנות {\displaystyle {\text{KECCAK-f}}[b]}, כאשר {\displaystyle b\in \{25,50,100,200,400,800,1600\}} נקרא "רוחב" המצב הפנימי. המצב הפנימי בנוי כמערך תלת-ממדי בעל אורך ורוחב קבועים {\displaystyle 5\times 5} נתיבים (lanes) בעומק משתנה {\displaystyle w\in \{1,2,4,8,16,32,64\}} כאשר {\displaystyle b=25w} כמתואר בתרשים. על מעבד 64 ביט נתיב (Lane) ב-{\displaystyle {\text{KECCAK-f}}[1600]} ניתן לייצוג במילה אחת בגודל 64 סיביות. פונקציית הספוג {\displaystyle {\text{KECCAK-f}}[r+c]} מקבלת את הפרמטרים "קצב" (Bitrate) המסומן r וכן "קיבולת" (Capacity) המסומנת c. מפונקציה זו מתקבל מבנה ספוג יחד עם כלל ריפוד מתאים. כלל הריפוד הוא {\displaystyle {\text{pad}}10^{\*}1}. כלומר תחילה מוסיפים סיבית "1" בסוף המסר, מרפדים באפסים ולבסוף מסיימים עם סיבית "1" נוספת, מספר האפסים הוא פונקציה של גודל הבלוק, כך שלבסוף יתקבל לפחות בלוק שלם באורך b סיביות.

### פונקציית הסבב - {\displaystyle {\text{Round}}[b](A,{\text{RC}})}

להלן פסאודו-קוד המתאר את פונקציית הסבב המקבלת מערך A המכיל את המצב הפנימי. מספר הסבבים הוא {\displaystyle n\_{r}} בהתאם לאורך הבלוק והוא נתון על ידי {\displaystyle n\_{r}=12+2l} כאשר {\displaystyle 2^{l}=w}. למשל עבור {\displaystyle {\text{KECCAK-f}}[1600]} מתקבלים 24 סבבים. כל הפעולות על האינדקסים בקוד הבא הם מודולו 5. הביטוי {\displaystyle A[x,y]} מתייחס לנתיב אחד במצב (ראו תרשים). {\displaystyle B[x,y]}, {\displaystyle X[x]}, {\displaystyle D[x]} הם משתנים זמניים. הקבועים {\displaystyle r[x,y]} הם היסטים של ההזזה המעגלית לפי הטבלה להלן. {\displaystyle {\text{RC}}[i]} הם קבועי סבב הנתונים בטבלה להלן. {\displaystyle {\text{ROT}}(W,r)} הוא פעולת הזזה מעגלית רגילה (Cyclic shift) בסיביות כשההיסט הוא מודולו אורך הנתיב. הביטוי {\displaystyle {\text{NOT}}} פירושו אופרטור השלילה, הסימן \oplus הוא XOR והסימן \land  מייצג AND.

{\displaystyle \mathbf {Round[b](A,{\text{RC}})} }

{\displaystyle \color {Blue}{\boldsymbol {\theta }}{\text{ Step}}}

{\displaystyle {\text{For }}x=0{\text{ to }}4{\text{ do}}}
{\displaystyle C[x]=A[x,0]\oplus A[x,1]\oplus A[x,2]\oplus A[x,3]\oplus A[x,4]}
{\displaystyle {\text{For }}x=0{\text{ to }}4{\text{ do}}}
{\displaystyle D[x]=C[x-1]\oplus {\text{ROT}}(C[x+1],1)}
{\displaystyle {\text{For }}x=0{\text{ to }}4{\text{ do}}}
{\displaystyle {\text{For }}y=0{\text{ to }}4{\text{ do}}}
{\displaystyle A[x,y]=A[x,y]\oplus D[x]}
‎
{\displaystyle \color {Blue}{\boldsymbol {\rho }}{\text{ and }}{\boldsymbol {\pi }}{\text{ Steps}}}

{\displaystyle {\text{For }}x=0{\text{ to }}4{\text{ do}}}
{\displaystyle {\text{For }}y=0{\text{ to }}4{\text{ do}}}
{\displaystyle B[y,2\cdot x+3\cdot y]={\text{ROT}}(A[x,y],r[x,y])}
‎
{\displaystyle \color {Blue}{\boldsymbol {\chi }}{\text{ Step}}}

{\displaystyle {\text{For }}x=0{\text{ to }}4{\text{ do}}}
{\displaystyle {\text{For }}y=0{\text{ to }}4{\text{ do}}}
{\displaystyle A[x,y]=B[x,y]\oplus (({\text{NOT }}B[x+1,y])\land B[x+2,y]}
‎
{\displaystyle \color {Blue}{\boldsymbol {\iota }}{\text{ Step}}}

{\displaystyle A[0,0]=A[0,0]\oplus {\text{RC}}}
{\displaystyle {\text{Return }}A}

### פונקציית הספוג - {\displaystyle {\text{KECCAK-f}}[b](A)}

פונקציית הסבב המתוארת מבוצעת {\displaystyle n\_{r}} פעמים על הקלט:

{\displaystyle \mathbf {KECCAK} {\text{-}}\mathbf {f[b](A)} }

{\displaystyle {\text{For }}i=0{\text{ to }}n\_{r}-1{\text{ do}}}
{\displaystyle A={\text{Round}}[b](A,{\text{RC}}[i])}
{\displaystyle {\text{Return }}A}

### אלגוריתם הגיבוב קצ'אק - {\displaystyle \mathbf {KECCAK[r,c](M)} }

להלן פסאודו-קוד המתאר את אלגוריתם הגיבוב {\displaystyle {\text{KECCAK}}[r,c]}, עם הפרמטרים c ו-r (קצב וקיבולת) והמסר M, כאשר ההנחה לפי התקן היא ש-r הוא כפולה של אורך נתיב. הקוד מתייחס אל המידע ברמה של בתים, ברמה של סיביות יש צורך בהתאמות נוספות. S מייצג את המצב כמערך של נתיבים. המסר המרופד P מאורגן כמערך דו־ממדי של נתיבים. הסימן \| מייצג שרשור מחרוזות. באלגוריתם שלושה שלבים, שלב הריפוד שמקבל את המסר ומפיק מחרוזת מרופדת לפי התקן, שלב הספיגה שמפעיל את הפונקציה הפנימית על הקלט ושלב הסחיטה שמפיק את ערך הגיבוב באורך הנדרש:

{\displaystyle \mathbf {KECCAK[r,c](M)} }

{\displaystyle \color {Blue}{\text{\*Initialization and padding\*}}}

{\displaystyle {\text{For }}x=0{\text{ to }}4{\text{ do}}}
{\displaystyle {\text{For }}y=0{\text{ to }}4{\text{ do}}}
{\displaystyle S[x,y]=0}
{\displaystyle P=M\ \|\ {\text{0x01}}\ \|\ {\text{0x00}}\ \|\ ...\ \|\ {\text{0x00}}}
{\displaystyle P=P\oplus ({\text{0x00}}\ \|\ ...\ \|\ {\text{0x00}}\ \|\ {\text{0x80}})}
‎
{\displaystyle \color {Blue}{\text{\*Absorbing phase\*}}}

{\displaystyle {\text{For all blocks }}P\_{i}{\text{ in }}P{\text{ do}}}
{\displaystyle {\text{For all }}(x,y){\text{ such that }}x+5\cdot y<r/w{\text{ do}}}
{\displaystyle S[x,y]=S[x,y]\oplus P\_{i}[x+5\cdot y]}
{\displaystyle S={\text{KECCAK-f}}[r+c](S)}
‎
{\displaystyle \color {Blue}{\text{\*Squeezing phase\*}}}

{\displaystyle {\text{Loop:}}}
{\displaystyle {\text{For all }}(x,y){\text{ such that }}x+5\cdot y<r/w{\text{ do}}}
{\displaystyle Z=Z\ \|\ S[x,y]}
{\displaystyle S={\text{KECCAK-f}}[r+c](S)}
{\displaystyle {\text{Return }}Z}

### עזרים

קבועי הסבב {\displaystyle {\text{RC}}[i]} נתונים בטבלה הבאה עבור אורך מקסימלי של נתיב. עבור אורכים קצרים יותר פשוט חותכים את הערכים בהתאם.


|  |  |  |  |
| --- | --- | --- | --- |
| RC[ 0] | 0x0000000000000001 | RC[12] | 0x000000008000808B |
| RC[ 1] | 0x0000000000008082 | RC[13] | 0x800000000000008B |
| RC[ 2] | 0x800000000000808A | RC[14] | 0x8000000000008089 |
| RC[ 3] | 0x8000000080008000 | RC[15] | 0x8000000000008003 |
| RC[ 4] | 0x000000000000808B | RC[16] | 0x8000000000008002 |
| RC[ 5] | 0x0000000080000001 | RC[17] | 0x8000000000000080 |
| RC[ 6] | 0x8000000080008081 | RC[18] | 0x000000000000800A |
| RC[ 7] | 0x8000000000008009 | RC[19] | 0x800000008000000A |
| RC[ 8] | 0x000000000000008A | RC[20] | 0x8000000080008081 |
| RC[ 9] | 0x0000000000000088 | RC[21] | 0x8000000000008080 |
| RC[10] | 0x0000000080008009 | RC[22] | 0x0000000080000001 |
| RC[11] | 0x000000008000000A | RC[23] | 0x8000000080008008 |

ההיסטים עבור ההזזה המעגלית נתונים בטבלה הבאה.


| ‎ | x = 3 | x = 4 | x = 0 | x = 1 | x = 2 |
| --- | --- | --- | --- | --- | --- |
| y = 2 | 25 | 39 | 3 | 10 | 43 |
| y = 1 | 55 | 20 | 36 | 44 | 6 |
| y = 0 | 28 | 27 | 0 | 1 | 62 |
| y = 4 | 56 | 14 | 18 | 2 | 61 |
| y = 3 | 21 | 8 | 41 | 45 | 15 |

קישורים חיצוניים
----------------

* cryptographic hash Algorithm Competition, באתר NIST
* SHA-3 Zoo – אתר המרכז את המידע שנצבר לגבי כל אחד מהמועמדים בתחרות
* אור דונקלמן, The Hitchhiker’s Guide to the SHA-3 Competition, מצגת מיום עיון בקריפטולוגיה שנערך בטכניון ב-4 ביולי 2012

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

1. 1 2  NIST בחרה את הזוכה בתחרות אלגוריתם הגיבוב (SHA-3) - הודעה לעיתונות באתר NIST
2. ↑  תחרות פונקציית הגיבוב הקריפטוגרפית - תיאור כללי באתר NIST
3. ↑  תחרות SHA-3 - שלב 2, באתר NIST
4. ↑  SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions
5. ↑  The Keccak sponge function family

| * צ
* ש
* ע
קריפטוגרפיה |
| --- |
| 

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

 |

 |
| 

| הצפנה קלאסית |
| --- |
| 
* מכונת הצפנה
* צופן החלפה
* צופן אתב"ש
* צופן קיסר
* צופן ויז'נר
* צופן ורנם
* צופן פלייפייר
* צופן היל
* אולטרה
* אניגמה
* ציקלומטר
* קולוסוס
* PURPLE
* ג'ייד
* מג'יק
* צופן שחלוף

 |

 |
| 

| צופן בלוקים |
| --- |
| 
* לוציפר
* AES
* 3DES
* DES
* Threefish
* Twofish
* Blowfish
* FEAL
* SEED
* CAST
* IDEA
* RC2
* RC6
* MARS
* RC5
* GOST
* Serpent
* MISTY
* KASUMI
* קמליה
* ARIA
* SAFER
* TEA
* LEA
* CLEFIA
* SEA
* Hummingbird
* PRESENT
* KATAN
* KeeLoq
* Simon & Speck
* אנוביס

 |

 |
| 

| אופני הפעלה |
| --- |
| 
* אופן הפעלה של צופן בלוקים
* EAX
* OCB
* IAPM
* CWC mode
* GCM
* CCM

 |

 |
| 

| צופן זרם |
| --- |
| 
* RC4
* Salsa20
* SOSEMANUK
* Grain
* E0
* A5/1
* A5/2
* A5/3
* A5/4
* MICKEY
* HC-128
* SNOW
* Trivium
* Rabbit
* ZUC
* ChaCha

 |

 |
| 

| הצפנה אסימטרית |
| --- |
| 
* פרוטוקול דיפי-הלמן
* חידות מרקל
* חתימת למפורט
* הצפנת תרמיל
* RSA
* הצפנת רבין
* חתימה דיגיטלית רבין
* צופן אל-גמאל
* חתימה דיגיטלית אל-גמאל
* DSA
* הצפנת בלום-גולדווסר
* ECC
* הצפנת קריימר-שופ
* הצפנת פאיי
* הצפנת מקאליס
* GGH
* NTRU
* עקום 25519
* חתימה דיגיטלית של שנור
* הצפנת אוקמוטו-אושיאמה

 |

 |
| 

| פרוטוקולים |
| --- |
| 
* עץ מרקל
* פרוטוקול אתגר-מענה
* פרוטוקול נידהאם-שרודר
* פרוטוקול קרברוס
* הוכחה באפס ידע
* פרוטוקול פייגה-פיאט-שמיר
* העברה עלומה
* חלוקת סוד
* TLS (SSL)
* Secure Shell
* MQV
* X.509
* פרוטוקול שיתוף מפתח
* מיסור שלא לפרסום
* פרוטוקול סיגנל

 |

 |
| 

| פרימיטיבים תאורטיים |
| --- |
| 
* מחולל פסבדו-אקראי קריפטוגרפי
* פונקציה חד-כיוונית
* תמורה חד-כיוונית
* סיבית קשה
* פונקציה פסבדו-אקראית קריפטוגרפית
* תמורה פסאודו-אקראית
* פונקציית גיבוב קריפטוגרפית
* וקטור אתחול
* פונקציית ספוג
* הצפנה מבוססת סריג

 |

 |
| 

| קריפטואנליזה |
| --- |
| 
* ניתוח תדירויות
* כוח גס
* התקפת איזון זמן/זיכרון
* תקיפת היפגשות באמצע
* קריפטואנליזה ליניארית
* קריפטואנליזה דיפרנציאלית
* התקפת גלוי-ידוע
* התקפת גלוי-נבחר
* התקפת מוצפן-נבחר
* פירוק לגורמים של מספר שלם
* התקפת ערוץ צדדי
* התקפת קורלציה
* התקפת שיבוש
* מודל אורקל אקראי
* התקפת התנגשויות

 |

 |
| 

| בעיות מתמטיות ואלגוריתמים |
| --- |
| 
* בעיית לוגריתם דיסקרטי
* תחשיב אינדקסים
* נפה ריבועית
* אלגוריתם rho של פולרד
* נפת שדה מספרים
* אלגוריתם רו של פולרד ללוגריתמים
* אלגוריתם פוליג-הלמן

 |

 |
| 

| פונקציות גיבוב קריפטוגרפיות |
| --- |
| 
* SHA
* MD5
* MD4
* SHA-1
* SHA-2
* SHA-3
* RIPEMD
* Skein
* BLAKE
* Grøstl
* SipHash

 |

 |
| 

| אימות וזיהוי |
| --- |
| 
* אימות זהות
* סיסמה
* קוד אימות מסרים
* Poly1305
* סיסמה חד-פעמית

 |

 |
| 

| נושאים נלווים |
| --- |
| 
* מספר אקראי
* מספר ראשוני
* יתירות
* מפתח שיחה
* סטגנוגרפיה
* הצפנה קוונטית
* הצפנה פוסט-קוונטית
* עקרון קרקהופס
* אבטחת מידע
* קריפטוגרפיה ויזואלית
* אליס ובוב
* מסיבת חתימה על מפתחות ציבוריים
* שידור מוצפן
* הצפנת דיסקים
* הצפנת סף
* חתימה דיגיטלית מבוססת פונקציית גיבוב
* פונקציה זניחה
* רשת פייסטל
* רשת החלפה-תמורה
* הלבנה
* אימות מסרים
* חתימה עיוורת
* חישוב רב משתתפים בטוח

 |

 |