פונקציית ספוג
ויקיפדיה האנציקלופדיה encyclopedia
בקריפטוגרפיה, פונקציית ספוג (sponge function)[1][2] היא דרך להרחיב פונקציית גיבוב לפונקציה קריפטוגרפית כללית שהקלט והפלט שלה באורך משתנה. פונקציית ספוג מיישמת מבנה ספוג (sponge structure) שהוא מבנה איטרטיבי פשוט המבוסס על תמורה או טרנספורמציה פנימית הפועלת על קלט באורך קבוע, שמקבל קלט באורך משתנה ומפיק פלט באורך משתנה. פונקציית ספוג מאוד גמישה ויכולה לשמש כצופן זרם שבו נדרש קלט קצר ופלט ארוך או כפונקציית גיבוב וקוד אימות מסרים שבהם הקלט ארוך והפלט קצר. מהיבט תאורטי פונקציית ספוג משמשת כמודל למבנה קונקרטי של פונקציית גיבוב עם גישה לזיכרון פנימי. פונקציית ספוג אקראית מקבילה לאורקל אקראי, למעט אפקט הזיכרון הסופי (התנגשויות הן בלתי נמנעות). לכן יכולה לשמש כחלופה למודל אורקל אקראי כדי לבטא טענת ביטחון.
הרעיון נולד במהלך פיתוח RadioGatun שהיא פונקציית גיבוב המקבלת קלט באורך שרירותי ומפיקה פלט בכל אורך רצוי. המפתחים נתקלו בבעיה בניסיון לבטא את ביטחון האלגוריתם במונחים של סיבוכיות זמן. כאשר הפלט קבוע אפשר לטעון שפונקציית הגיבוב טובה לפחות כאורקל אקראי שהפלט שלו נחתך ל- סיביות. לכן בגלל התקפת יום הולדת סיבוכיות התקפה בסיסית למציאת התנגשות היא מסדר גודל של . אולם כאשר הפלט באורך משתנה אין לטענה זו משמעות, כביכול אפשר להגיע לביטחון אינסופי אם מאריכים את הפלט מאוד. לכן המפתחים הגיעו למודל שונה שבו מצהירים ביטחון במונחים של אורקל אקראי שנקרא כאן "פונקציית ספוג אקראית", שהוא מבנה תאורטי כמו אורקל אקראי למעט העובדה שהוא מוגבל בזיכרון לכן התנגשויות בלתי נמנעות. הממצאים פורסמו לראשונה ב-2007 בסמינר Dugstuhl בגרמניה ולאחר מכן בסדנת Ecrypt בברצלונה.
פונקציית ספוג התגלתה ככלי יעיל לבניית פרימיטיבים קריפטוגרפיים רבים. אפשר לנצל מבנה ספוג ותאומו הנקרא "מבנה דופלקס" (duplex construction), כדי ליישם מגוון רחב של פרימיטיבים קריפטוגרפיים, כולל פונקציית גיבוב, מחולל פסאודו-אקראי, הצפנה סימטרית, אימות מסרים והצפנה מאומתת, עם ובלי וקטור אתחול ובאורכים משתנים לפי לצורך. בדרך זו נהנים מפונקציונליות רבה בפונקציית תמורה יחידה ומפשטים את תהליך הפיתוח והיישום מבלי לדאוג למרכיבים אחרים כמו תהליך הכנת מפתח. האטרקטיביות של מבנה זה נובעת מהעובדה שאפשר להתבסס על פרמוטציה מתאימה שזה יותר קל מלפתח צופן בלוקים או פונקציית דחיסה. קיימים כמה אלגוריתמים חדשים שמסתמכים על מבנה ספוג מהם Keccak, Quark, Photon, Spongent וכן Spritz. מראה כללי של מבנה ספוג הוא:
|
הסימן מייצג שרשור. תחילה הקלט מרופד לפי כלל ריפוד מתאים (בהמשך), לאחר מכן התוצאה נספגת לתוך המצב הפנימי באמצעות הפונקציה הפנימית באורך סיביות. היא יכולה להיות כל PRP או PRF בטוח לפי בחירה. ואז הפלט נסחט בהתאם לאורך הרצוי , הפלט יכול לשמש כמפתח הצפנה או ערך גיבוב. באופן כללי אמור להיות קשה למצוא מסלול מ- ל-. התנגשות פירושה ש- כאשר וכן אם מתקבל פירושו שהמבנה מכיל מעגליות ולכן הפלט יחזור על עצמו.
היות שהקלט באורך משתנה יש להפעיל כלל ריפוד מתאים כדי לחלק את הקלט ל- בלוקים בגודל סיביות כל אחד, באופן שיהיה קל להסיר את הריפוד עם קבלת המסר בצד השני מבלי לדעת מה היה אורך המסר. סכמת הריפוד הפשוטה והנפוצה ביותר היא כלומר מוסיפים את הסיבית "1" בסוף הקלט ומרפדים באפסים, כאשר הכוכבית מציינת שמספר האפסים הנדרש תלוי באורך הקלט ובגודל הבלוק, כך שהאורך הכולל צריך להתחלק ב-. כלל הריפוד חייב לקיים שלושה תנאים:
- הריפוד צריך להיות קל להסרה.
- מחרוזת הריפוד לא יכולה להיות ריקה.
- הבלוק האחרון חייב להיות שונה מאפס.
הסימון של כלל הריפוד עבור בלוק באורך סיביות מסומן בקיצור:
מבנה ספוג הוא מבנה איטרטיבי פשוט ליצירת פונקציה המקבלת קלט מהתחום ומפיקה פלט בטווח . היא מבוססת על תמורה או טרנספורמציה הפועלת על סיביות. קבוע ונקרא כאן רוחב. הוא כולל מצב פנימי (זיכרון) באורך סיביות, כאשר נקרא "קצב" (bitrate) ו- נקרא "קיבולת" (capacity). המצב הפנימי מאותחל באפסים, הקלט מרופד כאמור ומחולק לבלוקים של סיביות ומשם ממשיכים בשני שלבים:
- שלב הספיגה, בשלב זה הבלוקים של הקלט מועברים בפונקציה ומשולבים ב-XOR עם הסיביות הראשונות של המצב הפנימי. כאשר מסיימים לקלוט את כל הבלוקים עוברים לשלב הבא.
- שלב הסחיטה. בשלב זה הסיביות הראשונות של המצב מועברות שוב בפונקציה והתוצאה מוחזרת למשתמש. מספר הבלוקים שהפונקציה מחזירה תלוי במשתמש.
הסימון פירושו שאת פלט הפונקציה חותכים ל- הסיביות הראשונות. כאשר הסיביות הנותרות של המצב לעולם לא מושפעות מבלוקים של הקלט ולעולם אינן נכללות בפלט במהלך הסחיטה.
להלן פסאודו-קוד המתאר מבנה הספוג:
מודל ביטחון
בפונקציית גיבוב עם פלט קבוע מקובל היה בדרך כלל להשוותה מול אורקל אקראי, אולם זה השתנה בעקבות גילויים חדשים בעשור האחרון[3][4][5]. יש לזכור שהיות שהמצב הפנימי סופי והפונקציה איטרטיבית - היא מעבדת את הקלט בלוק אחר בלוק, בהכרח שיהיו התנגשויות, זאת לעומת אורקל אקראי תאורטי שאצלו לא קיים מושג "מצב" ואין לו התנגשויות. מסיבה זו אי אפשר להשוות ישירות למודל אורקל אקראי. אלטרנטיבה טובה למודל אורקל אקראי בהקשר זה היא מבנה ספוג אקראי שהוא מבנה תאורטי שהפונקציה הפנימית שלו היא פרמוטציה אקראית שנבחרה באופן אחיד מטווח הפרמוטציות האפשריות מעל סיביות. למעט האפקט שנובע עקב מגבלת הזיכרון הסופי. מהיבט תאורטי כשמנתחים ביטחון פונקציית ספוג לפי מודל זה מביאים בחשבון גם את הפרמטרים קצב וקיבולת. במצב אידיאלי אומרים שביטחון הפונקציה הוא במונחים של הקיבולת , כלומר התקפה גנרית שאינה מנצלת חולשות ספציפיות בפונקציה הפנימית תהיה בסיבוכיות לפחות. במילים אחרות מוכיחים שכל התקפה מוצלחת נגד המבנה עצמו משליכה בהכרח שניתן להבחין בין תוצאת הפרמוטציה שהמבנה משתמש בה לבין מחרוזת אקראית ומכאן שהיא אינה טובה לשימוש.
באופן דומה מבנה משתמש בטרנספורמציה או תמורה פנימית , כלל ריפוד מתאים ופרמטר . אך בשונה מפונקציית ספוג שהיא חסרת מצב בין הקריאות לפונקציה, מבנה דופלקס הוא אובייקט שיכול לקבל קלט נוסף ולהפיק מחרוזת פלט שהיא תוצאה של הקלט שהתקבל עד כה. במילים אחרות מבנה דופלקס דומה לרצף קריאות חוזרות של פונקציית ספוג עם קלט שונה. אובייקט דופלקס מכיל מצב בגודל סיביות, בשלב האתחול המצב הפנימי מאופס, ומכאן ואילך אפשר להפעיל את הפונקציה שוב ושוב עם קלט שאורכו צריך להיות קצר מספיק כדי שיתקבל בלוק אחד לאחר ריפוד. הפלט הוא באורך שהוא לכל היותר סיביות. בכל קריאה המבנה תחילה מרפד את הקלט לפי כלל הריפוד שנבחר, מחבר את הקלט ב-XOR עם חלק החיצוני של המצב הפנימי ואז מיישם את הפונקציה על המצב ומחזיר את הסיביות הראשונות של המצב. הוכח שמבנה דופלקס בטוח כמבנה ספוג, היות שמבנה דופלקס בעצם מקביל למבנה ספוג שהקלט שלו חולק למקטעים בגודל שכל אחד מהם מרופד בנפרד ואז הם משורשרים לרצף אחד ארוך. להלן תיאור מבנה דופלקס: