בקריפטוגרפיה, **אלגוריתם גיבוב בטוח** (באנגלית: Secure Hashing Algorithm) הידוע בקיצור SHA הוא שם כולל למשפחה של פונקציות גיבוב קריפטוגרפיות שהן חלק מתקן פדרלי של ממשלת ארצות הברית FIPS (בעברית: תקן עיבוד מידע פדרלי) הנקרא SHS (קיצור של **פונקציית גיבוב בטוחה**). התקן נועד לשימוש כחלק ממנגנון אימות והבטחת שלמות מידע וחלק מתקן חתימה דיגיטלית והוא הכולל את הפונקציות: SHA-0 (במקור SHA), SHA-2, SHA-1 והחל מ-2012 גם את SHA-3. הפונקציות ממשפחה זו משמשות ביישומים ופרוטוקולים מאובטחים רבים.

ייעוד
-----

 ערך מורחב – **פונקציית גיבוב קריפטוגרפית**  

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

גרסאות
------

הפונקציות ממשפחת SHA פותחו, אושררו והוכנסו לתקן SHS של FIPS המנוהל על ידי NIST בשיתוף פעולה של NSA. הן כוללות את:

* **SHA-0** שם שניתן למפרע כדי להבדילה מ-SHA-1. היא מפיקה תמצית באורך 160 סיביות ומבוססת על MD4. זוהי הפונקציה הראשונה במשפחה שפורסמה ב-1993 ונקראה בקיצור SHA תחת תקן FIPS PUB 180. הפונקציה הוסרה מהתקן זמן קצר לאחר שפורסמה והוחלפה ב-SHA-1 עקב חסרונות מהותיים שהתגלו בה.
* SHA-1 פונקציית גיבוב המפיקה תמצית באורך 160 סיביות. היא דומה מאוד ל-MD5 במבנה הפנימי שלה. האלגוריתם פותח על ידי NSA על מנת שישמש כחלק מחתימה דיגיטלית והוכנס לתקן FIPS PUB 180-1. לאחר שנמצאו פגמים גם בגרסה זו היא אינה נתמכת יותר החל מ-2010.
* SHA-2 היא משפחה של פונקציות גיבוב שפותחו גם הן על ידי NSA ונבדלות ביניהן בעיקר באורך התמצית שהן מפיקות ובמספר ערכים התחלתיים קבועים. הגרסאות הראשונות נקראו SHA-256, SHA-512 והוכנסו לתקן FIPS PUB 180-2. לאחריהן נוספו הפונקציות SHA-224, SHA-384 שנגזרות מהאחרות במספר שינויים מינוריים והתקן עודכן ל-FIPS PUB 180-3.
* SHA-3 פונקציית גיבוב המבוססת על קצ'אק שפותחה על ידי קריפטוגרפים בלגיים. בניגוד לפונקציות הקודמות במשפחה, פונקציה זו שונה לגמרי במבנה הפנימי שלה, היא נבחרה בתחרות פתוחה לציבור שהתקיימה בין השנים 2010-2012. היא תומכת בתמציות באותם אורכים כמו SHA-2 ונועדה למעשה לשמש כתחליף אופציונלי ל-SHA-2. הוכנסה לתקן FIPS PUB 202 כתקן נפרד אף שאינו אמור להחליף את קודמו אלא רק כאופציה נוספת בסגנון אחר.

אישורים
-------

כל הפונקציות ממשפחת SHA עוברות בדיקות בנושא ביטחון ומאושרות בתקן FIPS על ידי הארגון CMVP, שיתוף פעולה של NIST האמריקאי ו-CSE (הסוכנות הקנדית הממשלתית בנושא קריפטולוגיה). תפקיד הארגון להעריך ולבדוק מודולים קריפטוגרפיים לצורך שימוש מסחרי (לא ממשלתי/צבאי). היא עומדת לרשות יצרנים וספקים בתחומי ארצות הברית וקנדה ומספקת תעודות המאשרות מוצרים קריפטוגרפיים שעברו בחינה ואישור של מומחי הצפנה (בעיקר מומחים של NSA).

היסטוריה
--------

אלגוריתם SHA פורסם במאי 1993 על ידי ה-NIST לצורך ייצוג תמציתי של הודעות בשימוש באלגוריתמי חתימות וכאשר נדרש ערך גיבוב קריפטוגרפי ביישומים פדרליים. אלגוריתם SHA בנוי בשיטת מרקל-דמגרד. הקלט שלו הוא מחרוזת שאורכה עד {\displaystyle 2^{64}} סיביות והפלט שלה הוא תמצית באורך 160 סיביות. האלגוריתם מבוסס ברובו על הפונקציה MD4 תוך הגדלת המצב הפנימי ושינוי חלק מהפונקציות הפנימיות וערכי הקבועים שבשימוש.

בשנת 1995 פרסם ה-NIST אלגוריתם חדש שנקרא SHA-1 שמטרתו להחליף את אלגוריתם SHA הקודם (החל מהפרסום נהוג להתייחס לאלגוריתם הראשון כ-SHA-0). השוני היחיד בין האלגוריתמים כלל שינוי במנגנון הרחבת ההודעה של SHA-1 על פני SHA-0. לטענת ה-NIST מטרת התיקון הייתה לפתור חולשה שנמצאה באלגוריתם הקודם; ה-NIST לא פרסם את החולשה שהתיקון אמור לפתור.

בשנת 2002 הוסיף ה-NIST שלוש פונקציות נוספות לתקן SHA-256, SHA-384 ו-SHA-512. הפונקציות החדשות נבדלו משמעותית באלגוריתמים שבבסיסן מ-SHA-1 ובכך הבטיחו שחולשות בה לא ישפיעו בהכרח על הפונקציות החדשות. הפונקציות גם איפשרו ליצור ערכי תמצית ארוכים יותר עבור הודעות ובכך להגביר את בטיחות הפרוטוקולים המשתמשים בהן. בשנת 2008 הוסיפה ה-NIST פונקציה נוספת, SHA-224.

בשנת 2007 יזמה ה-NIST תחרות לבחירת פונקציות שיצטרפו למשפחת ה-SHA. לתחרות הוגשו 64 הצעות שמתוכן עמדו 51 בתנאי הסף. ההצעות פורסמו והקהילה הקריפטוגרפית הבינלאומית הוזמנה לנתח ולנסות לשבור את כל המועמדים. 14 מועמדים עברו לשלב השני של התחרות כאשר חמשת המועמדים הסופיים הם BLAKE, Grøstl, JH, קצ'אק ו-Skein. בשנת 2012 פורסם הזוכה בתחרות לגיבוב SHA-3 והוא הצופן Keccak.

תיאור האלגוריתמים
-----------------

התרשים מתאר איטרציה אחת בתוך פונקציית ה"כיווץ" של האלגוריתם. A,B,C,D,E הם מילים בנות 32 ביט אשר שומרות מצב; F היא פונקציה לא ליניארית משתנה; *s*left shift מסמלת הזזת סיביות ימנית ב-s מקומות. Addition מסמל חיבור מודולו 232. Kt הוא קבוע.
### SHA-0

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

#### אתחול

ראשית, המשתנים הפנימיים מקבלים את ערכי וקטור האתחול (IV)

{\displaystyle A={\text{0x67452301}}}  

{\displaystyle B={\text{0xEFCDAB89}}}  

{\displaystyle C={\text{0x98BADCFE}}}  

{\displaystyle D={\text{0x10325476}}}  

{\displaystyle E={\text{0xC3D2E1F0}}}  

{\displaystyle h\_{0}=(A,B,C,D,E)}

לאחר מכן, קלט הפונקציה מחולק לבלוקים באורך 512 סיביות המכונים {\displaystyle M\_{1},M\_{2}...M\_{\ell }}; לבלוק האחרון מוסיפים את אורך ההודעה. במידה ואורך ההודעה אינו כפולה של 512 מוסיפים לבלוק האחרון, אחרי ההודעה ולפני האורך שלה את הסיבית 1 ולאחריה 0 בכמות הנדרשת כדי להביא אותה לאורך של 512 סיביות.

#### אופן הפעולה

בכל שלב של הפונקציה מועברים לפונקציית התמצות המשתנים הפנימיים מהסיבוב הקודם והבלוק הנוכחי לעיבוד. הפונקציה מחזירה את הערך החדש של המשתנים הפנימיים ({\displaystyle h\_{i}=H(H\_{i-1},M\_{i})}). פונקציית הגיבוב אינה כוללת שלב סיום ולכן בסיום התהליך פלט פונקציית הגיבוב הוא הפלט של פונקציית התמצות מהשלב האחרון.

#### פונקציית התמצות

מנגנון הרחבת הודעות: הפונקציה מחלקת את הבלוק ל-16 חלקים באורך 32 סיביות המכונים {\displaystyle w\_{0},w\_{1}...w\_{15}}. לאחר מכן, הפונקציה מרחיבה את 16 החלקים ל-80 באמצעות הפעלת ה-LFSR הבא 64 פעמים:

{\displaystyle w\_{t}=w\_{t-3}\oplus w\_{t-8}\oplus w\_{t-14}\oplus w\_{t-16}}

תמצות המסר: עבור כל אחד מ-80 החלקים של המסר, הפונקציה מפעילה את האלגוריתם הבא:

{\displaystyle T=(A\lll 5)+f\_{t}(B\_{t},C\_{t},D\_{t})+E\_{t}+W\_{t}+K\_{t}}
{\displaystyle E\_{t+1}=D\_{t};D\_{t+1}=C\_{t};C\_{t+1}=B\_{t}\lll 30;B\_{t+1}=A\_{t};A\_{t+1}=T}

פלט: פונקציית התמצות מחזירה את הפלט: 

{\displaystyle A=A\_{0}+A\_{80};B=B\_{0}+B\_{80};C=C\_{0}+C\_{80};D=D\_{0}+D\_{80};E=E\_{0}+E\_{80}}  

הפונקציה {\displaystyle f} והקבוע K מוגדרים כך:

{\displaystyle 0\leq t\leq 19\ K=0x5A827999\ f\_{t}(X,Y,Z)=XY\vee (\neg X)Z}
{\displaystyle 20\leq t\leq 39\ K=0x6ED9EBA1\ f\_{t}(X,Y,Z)=X\oplus Y\oplus Z}

{\displaystyle 40\leq t\leq 59\ K=0x8F1BBCDC\ f\_{t}(X,Y,Z)=XY\vee XZ\vee YZ}

{\displaystyle 60\leq t\leq 79\ K=0xCA62C1D6\ f\_{t}(X,Y,Z)=X\oplus Y\oplus Z}
### SHA-1

הפונקציות SHA-0 ו-SHA-1 זהות באלגוריתמים שלהם פרט למנגנון הרחבת ההודעה ב-SHA-1 שמפעיל את ה-LFSR הבא 64 פעמים:

{\displaystyle w\_{t}=(w\_{t-3}\oplus w\_{t-8}\oplus w\_{t-14}\oplus w\_{t-16})\lll 1}

בטיחות
------

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

בשנת 2005 פרסמו צוות חוקרים מאוניברסיטת שאנדונג סין, התקפה על SHA-1 שמוצאת התנגשות ב-{\displaystyle 2^{69}} פעולות ולאור זאת לא מומלץ לשימוש כיום. לגבי SHA-256 ומעלה לא דווח על חולשות מסוימות, כך שהם עדיין טובים לשימוש.

להלן טבלת האלגוריתמים ובטיחותם כפי שפורסם על ידי NIST:

| האלגוריתם | גודל מסר מקסימלי בסיביות | גודל גוש בסיביות | גודל מילה (Word) | גודל תמצית המסר (בסיביות) | בטיחות\* (בסיביות) |
| --- | --- | --- | --- | --- | --- |
| SHA-1 | {\displaystyle \ 2^{64}} | {\displaystyle \ 512} | {\displaystyle \ 32} | {\displaystyle \ 160} | {\displaystyle \ 80} |
| SHA-256 | {\displaystyle \ 2^{64}} | {\displaystyle \ 512} | {\displaystyle \ 32} | {\displaystyle \ 256} | {\displaystyle \ 128} |
| SHA-384 | {\displaystyle \ 2^{128}} | {\displaystyle \ 1024} | {\displaystyle \ 64} | {\displaystyle \ 384} | {\displaystyle \ 192} |
| SHA-512 | {\displaystyle \ 2^{128}} | {\displaystyle \ 1024} | {\displaystyle \ 64} | {\displaystyle \ 512} | {\displaystyle \ 256} |

* בהקשר זה הבטיחות מתייחסת לכמות העבודה הנדרשת למציאת התנגשות (מסרים שונים המפיקים פלט זהה) תוך שימוש בהתקפת יום ההולדת. הערך מתפרש כ-{\displaystyle \ 2^{n/2}}.

ראו גם
------

* SHA-2
* SHA-3

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

1. ↑  Lucian Constantin, The SHA1 hash function is now completely unsafe, Computerworld, ‏2017-02-23 (באנגלית)
2. ↑  FIPS 180
3. ↑  FIPS 180-1 קובץ PDF
4. ↑  FIPS 180-2
5. ↑  FIPS 180-3
6. ↑  NIST בחרה את הזוכה בתחרות אלגוריתם הגיבוב (SHA-3) - הודעה לעיתונות באתר של NIST

| קריפטוגרפיה |
| --- |
| 

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

 |
| 

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

 |
| 

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

 |
| 

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

 |
| 

| צופן זרם |
| --- |
| RC4 • Salsa20 • SOSEMANUK • גריין • 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 • סיסמה חד-פעמית |

 |
| 

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

 |