חתימה דיגיטלית מבוססת פונקציית גיבוב

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

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

==רקע==
הרעיון להשתמש בפונקציית גיבוב (או בכל פונקציה חד-כיוונית) לצורך חתימה דיגיטלית עלה לראשונה על ידי לזלי למפורט שהמציא ב-1979 את חתימת למפורט. חתימת למפורט היא חד-פעמית במובן שכל זוג מפתחות; מפתח חתימה/מפתח אימות ניתנים לשימוש רק פעם אחת. כדי להדגים זאת, נניח שאליס מעוניינת להעביר לבוב מסר פשוט "כן" או "לא" ('0' או '1'), באופן כזה שהוא ידע בוודאות שההוראה הגיעה ממנה ולא ממתחזה. דרך אחת לפתור את הבעיה, תחילה אליס בוחרת פונקציה חד-כיוונית בלתי הפיכה מוסכמת (כלומר ידועה לכל), בוחרת <math>x</math> אקראי כלשהו ומשתמשת בה כדי לחשב את <math>y=f(x)</math> ושומרת בסוד את <math>x</math>. היא שולחת לבוב את <math>y</math> כהתחייבות וכן מסכמת איתו מראש שעבור המסר "כן" אליס תחשוף בפניו את הסוד <math>x</math> כהוכחה, אחרת המסר יהיה "לא". לאחר מכן נניח שאליס שלחה לבוב את <math>x</math>. בוב בודק שמתקיים <math>y=f(x)</math> ואם כן הרי שההוראה "כן" הגיעה מאליס ולא מאף אחד אחר, משום שבעצם ידיעת <math>x</math> אליס הוכיחה שהמסר הגיע ממנה. מעצם ההגדרה של הפונקציה יהיה קשה מאוד למי שאינו יודע מהו <math>x</math> לנחש ערך כזה המקיים <math>y=f(x)</math>. 

כאן <math>x</math> הוא המפתח הפרטי או "מפתח החתימה" ו-<math>y</math> הוא המפתח הציבורי או "מפתח האימות". היות שבמהלך האימות אליס למעשה חשפה את המפתח הפרטי שלה, היא לא יכולה להשתמש בו שוב לחתימה על מסר אחר. לכן עבור כל סיבית '0' או '1' נוספת היא צריכה לחשב ולשלוח <math>y</math> חדש, כלומר החתימה מתנפחת לממדים ארוכים מאוד ביחס למסר. אפשר להרחיב את הרעיון החתימה החד-פעמית באופן כזה שאליס תחתום על מספר סיביות בו זמנית כפי שעושה חתימת למפורט, אם כי הבעיה נותרת בעינה, מפתחות החתימה והאימות עדיין ארוכים מאוד וכל חתימה מתאימה למספר מוגבל של סיביות. בוב צריך לוודא שאכן <math>y</math> שייך לאליס אבל זהו נושא נפרד.

===עץ מרקל===

רלף מרקל הראה שאפשר להקטין את המפתח האימות בדרך מקורית, במקום לשלוח עבור כל מסר <math>y</math> אחר, אפשר להשתמש בעץ גיבוב שהוא עץ בינארי מושלם בגובה <math>h</math> שבו כל צומת היא גיבוב של שני הצמתים הבנים מהעלים ועד לשורש העץ. מפתח האימות יהיה שורש העץ איתו יהיה אפשר לאמת עד <math>2^h</math> מסמכים המקבילים ל-<math>2^h</math> העלים, כל עלה הוא חתימה חד-פעמית של מסמך אחד. האימות נעשה על ידי בדיקת המסלול מהעלה ועד לשורש העץ. כל עלה מאומת על ידי חתימה חד-פעמית (OTS) שכוללת בתוכה גם מידע הנקרא "מסלול אימות" (authentication path) שהוא בעצם ערכם של עלים אחים לאורך המסלול מהעלה לשורש העץ על מנת לאפשר בניית מסלול אימות. בדרך זו אפשר להפוך חתימה חד-פעמית לחתימה "רב פעמית" חלקית, כי בעוד שנדרשים מפתחות חתימה שונים עבור כל המסמכים, הרי שנדרש מפתח אימות אחד בלבד.

עץ מרקל מהווה שיפור משמעותי אך למרות זאת אינו פרקטי מכמה סיבות:
* היות שמדובר בחתימה חד-פעמית המפתח הפרטי עדיין חייב להיות שונה עבור כל מסמך, לכן החותם צריך לאחסן בזיכרון את כל מפתחות החתימה במקום שמור. 
* מספר החתימות מוגבל למספר העלים בעץ, עבור עץ בגובה <math>h</math> אפשר לחתום על לכל היותר <math>2^h</math> מסמכים.
* על מנת להבטיח שכל עלה מנוצל רק פעם אחת יש צורך לנהל מעקב אחרי חתימות שבהן כבר השתמשו ואת המונה יש צורך לכלול בחתימה. דרישה זו עלולה להיות בעייתית במיוחד אם ארעה תקלה ונמחקו נתונים ואבד המונה.
* החתימה מתנפחת בסדר גודל לוגריתמי כי יש צורך לשלוח מלבד החתימה <math>h</math> ערכי גיבוב נוספים על מנת לאפשר למאמת לבנות מסלול אימות מהמסמך לשורש המצוי בידו. 

כדי לפתור את הבעיות האמורות הוצעו מספר שיפורים. הראשון הוא חלוקת העץ לתת-עצים. למשל אם העץ מכיל יער של <math>d</math> שכבות של עצים המסודרים בערמה זה על גבי זה, כל אחד בגובה <math>h_1</math>, במהלך החתימה על מסר נתון החותם משתמש רק בעץ אחד מתוכם. במקרה כזה המפתח הציבורי עבור <math>2^{h_1}</math> מסרים יקטן ל-<math>h_1</math> ערכים לכן החתימה מצטמצמת מ-<math>O(2^h)</math> ל-<math>O(d2^{h/d})</math>. בנוסף אפשר לצמצם את החתימה על ידי ניצול העובדה שהיא סדרתית. כלומר שימוש באלגוריתם חכם לחיפוש בעץ שמאפשר צמצום החתימה מ-<math>O(2^h)</math> ל-<math>O(h)</math>. שילוב שני הרעיונות יחד מאפשר לצמצם עוד את החתימה ל-<math>O(h/d)</math>.

עץ מרקל זכה לשיפורים רבים כמו FMTseq שהוא עץ חיפוש פרקטלי של נאור, שנהב ואבישי וול, אלגוריתם Bleichenbacher-Mauer המשתמש בגרפים או אלגוריתם עץ מרקל המורחב XMSS המשתמש בתת-עצים רבים וכן אלגוריתם SPHINCS. בשני האחרונים נוסף אלמנט מיסוך. כלומר כל ערך מחובר ב-XOR עם מסכה אקראית כלשהי לפני הפעלת פונקציית הגיבוב. המחיר הוא עליה קלה בסיבוכיות אבל הרווח הוא גדול, כי אלגוריתם מרקל המקורי דורש שאורך החתימות יהיה <math>2n</math> סיביות כדי להגיע לרמת ביטחון של <math>n</math> סיביות בגלל התקפת יום הולדת. עם המסכה האקראית ניתן להגיע לביטחון של <math>b</math> סיביות עם פרמטר <math>n=b</math> שזהו שיפור בפקטור של חצי ביעילות האלגוריתם והפחתה דומה באורך החתימות.

===חתימה דיגיטלית מוכחת כבטוחה נגד התקפת מסר נבחר===
תיאור פונקציות המכילות את התכונה "Claw".
רעיון דומה לעץ מרקל הוצע ב-1984 על ידי שפי גולדווסר, סילביו מיקלי ורונלד ריבסט במאמר חשוב המדגים מהיבט תאורטי מוכח כיצד אפשר להשתמש בזוג פונקציות חד-כיוונית עם דלת מלכודת הנקראות "Claw Free" לחתימה דיגיטלית. פונקציות שנקראות Claw-free הן שתי פונקציות <math>f_0,f_1</math> שבלתי אפשרי למצוא <math>X</math> ו-<math>Y</math> כך שמתקיים <math>f_0(X)=f_1(Y)</math> כמתואר בתרשים. הם הוכיחו שהשיטה שלהם בטוחה נגד "התקפת מסר-נבחר אדפטיבית" בהנחה שבעיית פירוק לגורמים היא בעיה קשה. אף על פי שהסכמה שלהם הודגמה עם פונקציית RSA הרי שאפשר לבנות חתימה כזו מכל פונקציה חד-כיוונית שעונה על התנאי האמור ולאו דווקא כזו המבוססת על פירוק לגורמים או לוגריתם בדיד.

התקפת מסר-נבחר אדפטיבית היא מודל ביטחון תאורטי החזק ביותר של פונקציית חתימה דיגיטלית. לפי מודל זה האויב או המתקיף רשאי לקבל מאורקל חתימות תקפות עבור מסרים כלשהם <math>m_1,...,m_k</math> לפי בחירתו ותפקידו לנסות לשבור את אלגוריתם החתימה על בסיס חתימות אילו וכן הוא רשאי לבקש חתימות נוספות גם לאחר שההתקפה החלה (מכאן הכינוי אדפטיבית). "שבירה" מחולקת לכמה רמות מהקל אל הכבד. 
*שבירה מוחלטת (total break). מציאת דרך לגלות את המפתח הפרטי (דלת המלכודת הסודית) של החותם ואז לזייף בקלות חתימה על כל מסמך ולטעון שנחתם על ידי החותם הלגיטימי.
*זיוף כללי (universal forgery). מציאת דרך לעקוף את אלגוריתם החתימה כך שהתוקף מסוגל לדמות אותו ולזייף חתימות על מסמכים כלשהם מבלי לגלות את מפתח החתימה של החותם הלגיטימי. 
*זיוף סלקטיבי (selective forgery). מציאת דרך לזייף חתימה על מסמך ספציפי אחד או יותר שנבחרו על ידי המתקיף.
*זיוף קיומי (existential forgery). זיוף חתימה על לפחות מסמך אחד כלשהו אפילו חסר משמעות ואפילו אם לתוקף אין שליטה על תוכנו.

ההגדרה האחרונה היא המחמירה ביותר ומבחינה תאורטית עדיף להגיע לסכמה שתהיה מוכחת כעמידה גם כנגד איום זה. הרעיון של אלגוריתם GMR הוא כדלהלן:

בהינתן שתי תמורות עם דלת מלכודת הנקראות Claw-free ופרמטר ביטחון <math>k</math> יהיה קל לבחור באופן אקראי אלמנט מתחום הפונקציות, אך בהינתן תמורות כלשהן <math>f_0,f_1</math> יהיה קשה מבחינה חישובית למצוא <math>x,y</math> כך שמתקיים <math>f_0(x)=f_1(y)</math> ללא ידיעת דלת המלכודת. התכונה Claw-free משליכה גם על חד-כיווניות. למשל אם <math>n=pq</math> כך ש-<math>p\equiv 3\text{ (mod }8)</math> ו-<math>q\equiv 7\text{ (mod }8)</math>, אז הפונקציות <math>f^n_0(x)=x^2\text{ (mod }n)</math> ו-<math>f^n_1(x)=4x^2\text{ (mod }n)</math> הן תמורות חד-כיווניות ומתאימות להגדרה Claw-free, כמו כן מתקיים <math>f_i^{-1}(f_i(x))=x</math> ודלת המלכודת היא המספרים הראשוניים <math>p</math> ו-<math>q</math>. אם נתון <math>Q</math> רק מי שמחזיק במידע הסודי שהוא דלת המלכודת יכול לחשב את הערכים <math>R,L\in n</math> כך שמתקיים <math>f^{-1}_R(Q)=L</math>. תכונה זו נקראת "הוכחת אימות אטומית" של <math> L,R</math> על ידי <math>Q</math> כי רק מי שיכול להפוך את הפונקציה מסוגל לייצר את הערכים הללו מהערך <math>Q</math> כך שהתנאי האמור יתקיים. 

המפתחות הציבוריים לאימות החתימה על מסרים יהיו שני זוגות של תמורות חד-כיווניות <math>(g_0,g_1), (f_0,f_1)</math>. המפתחות הפרטיים המשמשים לחתימה הם דלתות המלכודת של הפונקציות הללו כך שהחותם יכול באמצעותן לחשב את הפונקציות ההופכיות שלהן בקלות. כעת אם נתון המסמך <math>M_j</math> תחילה החותם מייצר ומאמת מספר אקראי <math>R_j</math> ואיתו הוא מאמת את <math>M_j</math>. את <math>R_j</math> עצמו מאמתים בעזרת עץ אימות. מתחילים מ-<math>R_0</math> שהוא שורש העץ שנקרא מפתח ציבורי ומכל נקודת אימות <math>R_j</math> או <math>L_j</math> בהתאמה אפשר לאמת שני ערכים חדשים במקרה של צד ימין <math>(L_{2j+1},R_{2j+1})</math> ובמקרה של צד שמאל <math>(L_{2j},R_{2j})</math>. בדרך זו נוצר עץ שגדל כלפי מטה ככל שנדרשות יותר חתימות כמתואר בתרשים. כל צומת מאמת את הצמתים הבנים. מכל צומת נתון קיים "מסלול אימות משורשר" לשורש <math>R_0</math>. החתימה כוללת שני חלקים מלבד המסר עצמו. 
*הערכים <math>R_j</math> ו-<math>L_j</math> המקיימים:
::<math>L_j = \begin{cases} f^{-1}_{R_j}(L_{j/2}), & \mbox{if }j\mbox{ is even} \\f^{-1}_{R_j}(R_{j-1/2}), & \mbox{if }j\mbox{ is odd} \end{cases}</math>

::וכן המאמתים <math>A_j</math> שרק החותם יכול היה לחשב, אך כל אחד יכול לבדוק בקלות. את המאמתים הוא בוחר כך:
::<math>A_j = \begin{cases} (1,R_1,L_1), & \mbox{if }j =1 \\ (j,R_j,L_j,A{\lfloor j/2\rfloor }), & \mbox{if }j > 1 \end{cases}</math>
*פונקציית אימות אטומית של המסר <math>M_j</math> על ידי <math>R_j</math>.

החתימה היא הערכים <math>(M_j,A_j,g^{-1}_{m_j}(R_j))</math>. ואימות החתימה מתבצע בשני שלבים, תחילה מאמתים את <math>R_j</math> על ידי הפונקציות הציבוריות <math>f_i</math> ואז מאמתים את המסמך על ידי הפונקציות <math>g_i</math>. לפיכך הזמן הדרוש לחישוב חתימה הוא <math>O(k)</math> ואורכה הכולל הוא <math>O(\log(j)\cdot k)</math> כאשר <math>k</math> הוא פרמטר ביטחון המייצג את אורך החתימה בסיביות. שים לב שגם אלגוריתם GMR נקרא תלוי זיכרון כיוון שכל חתימה תלויה בחתימות קודמות (כל <math>R_j</math> תלוי באימות שלו על ידי ערכים קודמים)

===עץ אימות נטול זיכרון===
ב-2004 הציע עודד גולדרייך שני שיפורים משמעותיים לאלגוריתם האמור כדי להופכו לאלגוריתם נטול זיכרון. ראשית הוא הציע שכל צומת (שאינו עלה) בעץ יכיל חתימה חד-פעמית על ערך הגיבוב של המפתח הציבורי של הצמתים הבנים שלו. המפתח הסודי יהיה גרעין התחלתי אקראי אשר ישמש לבניית העץ כולו באמצעות מחולל פסאודו-אקראי. מעצם הגדרתו של מחולל כזה אם מתחילים מגרעין התחלתי קבוע, תמיד יתקבל רצף זהה, עובדה זו מסייעת בשחזור כל עלה רק כאשר הוא נדרש ואין צורך לבנות את כל העץ בזיכרון. שנית הוא הציע במקום לנהל מעקב אחרי החתימות שהשתמשו בהם באמצעות מונה כלשהו, לבחור עלה באופן שערכו נגזר מהמסר, מייצגים את ערך הגיבוב של המסר כמספר כלשהו באורך <math>n</math> סיביות ואז המספר הזה משמש כאינדקס לבחירת העלה המתאים לחתימה. בשיטה זו חתימה אחת תכיל את כל המפתחות הציבוריים של כל החתימות החד-פעמיות של הצמתים במסלול מהעלה לשורש העץ, את כל המפתחות הציבוריים של הצמתים האחים לאורך המסלול וכן את החתימה החד-פעמית של המסר עצמו. 

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

לסיכום מפתח החתימה הפרטי באורך <math>k</math> סיביות, חישוב החתימה על המסמך דורש <math>2k</math> מפתחות ו-<math>k</math> חתימות. את מפתחות החתימה של כל הצמתים במסלול אין צורך לצרף לחתימה על המסמך כי אפשר לחשב אותם מהמפתחות הציבוריים. אך בכל זאת החסרון הוא שחתימה חד-פעמית אחת היא באורך <math>k^2</math> מפתחות הציבוריים. שילוב של שיטת גולדרייך עם חתימת וינטרניץ מגיע לאורך חתימה של 1 מגה בית במקרה שפרמטר הביטחון הוא <math>k=256</math>. 

אלגוריתם SPHINCS-256 משלב כמעט את כל הטכניקות המתוארות בנוסף לכמה שיטות חדשות כדי להפוך חתימה חד-פעמית לחתימה דיגיטלית רב-פעמית נטולת זיכרון ויעילה, עם ביטחון ברמה של <math>2^{128}</math> ועם מפתחות באורך 1 קילו בית וחתימה באורך 41 קילו בית.

==תקנים==
NIST הכינו טיוטה לתקן חדש לחתימה דיגיטלית מבוססת גיבוב הנחשבת בטוחה נגד קריפטואנליזה קוונטית (כאשר הדבר יהיה רלוונטי), היא מהירה ויעילה המשלבת כמה רעיונות ביניהם <math>\text{WOTS}^+</math> שהוא וריאציה של חתימת וינטרניץ, XMSS ו-<math>\text{XMSS}^{MT}</math>. בהתבסס על הצעה של Mecgrew ו-Curcio.

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

*
קטגוריה:חתימה דיגיטלית