Skein

Skein היא משפחה של פונקציות גיבוב קריפטוגרפיות שפותחה ב-2010 על ידי ניילס פרגוסון ועמיתיו במטרה להציעה לתחרות תקן הגיבוב הפדרלי של NIST שבה הפסידה בסופו של דבר ל-Keccak. פונקציית גיבוב נחשבת לסוס עבודה של הקריפטוגרפיה המודרנית והיא שכיחה בכל מערכת אבטחה מודרנית כחלק מחתימה דיגיטלית, מנגנון סיסמאות, קישור אינטרנטי מאובטח, ניהול מפתחות הצפנה, אנטי-וירוס וכמעט כל פרוטוקול קריפטוגרפי.

מוטיבציה

בשל חולשות, חלקן תאורטיות שהתגלו בפונקציות הגיבוב ממשפחת SHA, נערכה על ידי NIST תחרות פתוחה לבחירת תקן גיבוב מדור חדש SHA-3. למרות שעדיין אין צורך מיידי במעבר לתקן החדש, הדעה הרווחת היא שבעתיד הקרוב מרבית היישומים יעברו. מארגני התחרות הצהירו כי למרות בדיקות מעמיקות שנעשו על ידי מומחים רבים לא נמצאו כשלים או פגמים חמורים באף אחד מחמשת המועמדים המובילים שהוצעו לתקן, ביניהם Skein והם הוצהרו כבטוחים לשימוש.
Skein מעוצבת במיוחד להשגת גמישות, ביצועים, ביטחון ופשטות אופטימליים והיא מהירה מאוד הן בחומרה והן בתוכנה עם זיכרון פנימי באורך 200 בתים. ניתן ליישמה גם בחומרת 8 ביט כמו כרטיס חכם בשטח של 100 בתים. Skain-512 פועלת במהירות של 6.1 CPB על מעבד 64 ביט, במילים אחרות על מחשב ממוצע Skein יכולה לגבב מעל 500MB לשנייה לליבה, שזה מהיר פי שניים ויותר מ-SHA-2. בתצורת עץ גיבוב (Tree Hash) להלן, אפשר להגיע לביצועים טובים אף יותר על ידי יישום מקבילי.
Skein נחשבת לפונקציית גיבוב בטוחה בעיצוב שמרני המבוססת על צופן בלוקים Threefish במצב הפעלה שנקרא UBI שהוא גרסה של מטיאס-מאייר-אוסאס. היא מגיעה בשלוש מידות שונות בהתאם לגודל הזיכרון הפנימי: Skain-256, Skein-512, Skein-1024 כאשר הפלט יכול להיות בכל אורך רצוי. כוונת המפתחים היא ליצור חלופה טובה לאלגוריתמים הקיימים באופן שלא יהיה צורך בשינויים מהותיים במערכות קיימות. מסיבה זו Skein נבנתה תוך ראייה רחבה שתהיה כלי שימושי במגוון תחומים כמו מחולל פסאודו-אקראי, צופן זרם, פונקציית גזירת מפתח או פונקציית אימות.

ריפוד

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

MAC

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

עץ גיבוב

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