[go: up one dir, main page]

לדלג לתוכן

SHA-3

מתוך ויקיפדיה, האנציקלופדיה החופשית

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

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

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

[עריכת קוד מקור | עריכה]

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

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

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

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

משפחת האלגוריתמים SHA-3 הוכנסה לתקן FIPS PUB 202[4] של 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. נתיב (lane) הוא שורה אחת לאורך ציר ה-z

אלגוריתם Keccak (מבוטא קֵצַ'אק, על שם ריקוד באלינזי עתיק) פותח ב-2008 על ידי Guido Bertoni, Joan Daemen, Michaël Peeters ו-Gils Van Assche[5]. זוהי משפחה של פונקציות גיבוב המבוססת על פונקציית ספוג שהיא מבנה גנרי שהומצא במהלך פיתוח אלגוריתם RadioGatun. ב-Keccak הפונקציה הפנימית היא פרמוטציה אחת מתוך אוסף של שבע פרמוטציות אפשריות המסומנות , כאשר נקרא "רוחב" המצב הפנימי. המצב הפנימי בנוי כמערך תלת-ממדי בעל אורך ורוחב קבועים נתיבים (lanes) בעומק משתנה כאשר כמתואר בתרשים. על מעבד 64 ביט נתיב (Lane) ב- ניתן לייצוג במילה אחת בגודל 64 סיביות. פונקציית הספוג מקבלת את הפרמטרים "קצב" (Bitrate) המסומן וכן "קיבולת" (Capacity) המסומנת . מפונקציה זו מתקבל מבנה ספוג יחד עם כלל ריפוד מתאים. כלל הריפוד הוא . כלומר תחילה מוסיפים סיבית "1" בסוף המסר, מרפדים באפסים ולבסוף מסיימים עם סיבית "1" נוספת, מספר האפסים הוא פונקציה של גודל הבלוק, כך שלבסוף יתקבל לפחות בלוק שלם באורך סיביות.

פונקציית הסבב -

[עריכת קוד מקור | עריכה]

להלן פסאודו-קוד המתאר את פונקציית הסבב המקבלת מערך המכיל את המצב הפנימי. מספר הסבבים הוא בהתאם לאורך הבלוק והוא נתון על ידי כאשר . למשל עבור מתקבלים 24 סבבים. כל הפעולות על האינדקסים בקוד הבא הם מודולו 5. הביטוי מתייחס לנתיב אחד במצב (ראו תרשים). , , הם משתנים זמניים. הקבועים הם היסטים של ההזזה המעגלית לפי הטבלה להלן. הם קבועי סבב הנתונים בטבלה להלן. הוא פעולת הזזה מעגלית רגילה (Cyclic shift) בסיביות כשההיסט הוא מודולו אורך הנתיב. הביטוי פירושו אופרטור השלילה, הסימן הוא XOR והסימן מייצג AND.

פונקציית הספוג -

[עריכת קוד מקור | עריכה]

פונקציית הסבב המתוארת מבוצעת פעמים על הקלט:

אלגוריתם הגיבוב קצ'אק -

[עריכת קוד מקור | עריכה]

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

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

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

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

[עריכת קוד מקור | עריכה]

הערות שוליים

[עריכת קוד מקור | עריכה]