חתימת למפורט

בקריפטוגרפיה, חתימת למפורט או חתימה דיגיטלית חד-פעמית של למפורט היא שיטה שהומצאה ב-1979 על ידי לזלי למפורט, המאפשרת לרתום כל פונקציה חד-כיוונית, בדרך כלל פונקציית גיבוב, לצורך חתימה דיגיטלית. יתרונותיה הם: פשטות, יעילות, אפשר להסתמך על אלגוריתמים קיימים ואין צורך לפתח חדשים, ביטחון השיטה כביטחון פונקציית הגיבוב שבבסיסה והיא נפרדת ממנה כך שניתן להחליף את פונקציית הגיבוב באחרת במידת הצורך. חסרונותיה הן כפי שמעיד שמה, ניתן לחתום עם מפתח פרטי יחיד אך ורק על מסמך אחד וכן החתימה יוצאת גדולה יחסית. לאור פוטנציאל ההתפתחות של המחשבים הקוונטיים, ביטחון שיטות החתימה הדיגיטלית הנמצאות בשימוש מעשי כיום; RSA ו-DSA נמצא בסכנה מוחשית. כאשר מחשב קוונטי סקילאבילי יופיע הם יצאו מכלל שימוש. זאת משום שהבעיות המתמטיות שעליהן ביטחונם מבוסס, שהן פירוק לגורמים ולוגריתם דיסקרטי, ניתנות לפתרון יעיל עם מחשב קוונטי. הדעה הרווחת, אם כי זה לא הוכח, שפונקציות גיבוב תמשכנה להיות בטוחות גם בעידן הפוסט-קוונטי. אם כי יידרשו מספר התאמות לאור העובדה שאלגוריתם גרובר מציע שיפור בפקטור ריבועי לבעיית חיפוש לא ממויין שיש לה השפעה על פונקציות חד-כיווניות באופן כללי. אף על פי ששיטת למפורט הוותיקה אינה פרקטית, חשיבותה התאורטית נותרה בעינה. ב-1979 פיתח רלף מרקל טכניקה לייעול החתימה החד-פעמית של למפורט באמצעות עץ גיבוב, כך שאימות חתימה על מסמכים מרובים נעשה עם מפתח ציבורי יחיד שהוא שורש העץ. שיטת מרקל עם חתימת וינטרניץ (להלן) מהווה שיפור משמעותי. במרוצת הזמן פותחו טכניקות לשיפור עץ מרקל כמו "עץ חיפוש פרקטלי" ועוד. שילוב כמה טכניקות מתקדמות יחד מניב אלגוריתמים יעילים למדי כמו SPHINCS, המהווים חלופה ראויה לאלגוריתמים הקיימים ומציעים ביטחון ברמה גבוהה גם מפני איום קריפטואנליזה קוונטית. חתימת למפורט-דיפי מתוך הספר Post-Quantum Cryptography מוגדרת כדלהלן: נתון שלם n {\displaystyle n} שהוא פרמטר ביטחון ופונקציה חד-כיוונית: f : { 0 , 1 } n → { 0 , 1 } n {\displaystyle f:\{0,1\}^{n}\rightarrow \{0,1\}^{n}} שניהם ציבוריים וידועים לכל מי שמעוניין לאמת את החתימה. הפונקציה f {\displaystyle f} מקבלת מחרוזת באורך n {\displaystyle n} מבצעת חישוב ומחזירה מחרוזת אחרת באורך n {\displaystyle n} באופן כזה שקשה להפוך אותה, כלומר בעוד שקל לחשב את y = f ( x ) {\displaystyle y=f(x)} יהיה קשה ביותר למצוא את x {\displaystyle x} בהינתן y {\displaystyle y} . כלומר לחשב את x = f − 1 ( y ) {\displaystyle x=f^{-1}(y)} . כמו כן ההנחה היא שקשה למצוא התנגשויות. למשל קשה למצוא x ′ ≠ x {\displaystyle x'\neq x} כך שמתקיים f ( x ) = f ( x ′ ) {\displaystyle f(x)=f(x')} . הפונקציה f {\displaystyle f} יכולה להיות כל צופן בלוקים כמו AES או פונקציית גיבוב תיקנית כמו SHA-2 או SHA-3 שמעצם הגדרתם הם מועמדים טובים לפונקציה חד-כיוונית (אם כי לא מוכחים). אם צופן הבלוקים אינו חד-כיווני, אין להשתמש בו בכל מקרה. תחילה לצורך הכנת מפתח החתימה X {\displaystyle X} החותם בוחר n {\displaystyle n} זוגות מחרוזות אקראיות באורך n {\displaystyle n} סיביות באמצעות מחולל פסאודו-אקראי בטוח, כך שהם נבחרו בהתפלגות אחידה: X = ( x n − 1 [ 0 ] , x n − 1 [ 1 ] , . . . , x 1 [ 0 ] , x 1 [ 1 ] , x 0 [ 0 ] , x 0 [ 1 ] ) ∈ R { 0 , 1 } ( n , 2 n ) {\displaystyle X=(x_{n-1}[0],x_{n-1}[1],...,x_{1}[0],x_{1}[1],x_{0}[0],x_{0}[1])\in _{R}\{0,1\}^{(n,2n)}} אפשר להתייחס ל- X {\displaystyle X} כאל טבלה או מטריצה בינארית בגודל n × 2 n {\displaystyle n\times 2n} כניסות. להכנת מפתח האימות הציבורי הוא מחשב את: Y = ( y n − 1 [ 0 ] , y n − 1 [ 1 ] , . . . , y 1 [ 0 ] , y 1 [ 1 ] , y 0 [ 0 ] , y 0 [ 1 ] ) ∈ { 0 , 1 } ( n , 2 n ) {\displaystyle Y=(y_{n-1}[0],y_{n-1}[1],...,y_{1}[0],y_{1}[1],y_{0}[0],y_{0}[1])\in \{0,1\}^{(n,2n)}} כך ש- y i [ j ] = f ( x i [ j ] ) {\displaystyle y_{i}[j]=f(x_{i}[j])} כאשר 0 ≤ i ≤ n − 1 {\displaystyle 0\leq i\leq n-1} וכן j ∈ { 0 , 1 } {\displaystyle j\in \{0,1\}} . במילים אחרות עבור כל כניסה ב- X {\displaystyle X} הוא מחשב את הפונקציה החד-כיוונית שלה ואת התוצאה מציב בכניסה המתאימה ב- Y {\displaystyle Y} . לכן לצורך הכנת החתימה החותם צריך לבצע בסך הכול 2 n {\displaystyle 2n} הפעלות של הפונקציה f {\displaystyle f} ואורך המפתחות X {\displaystyle X} ו- Y {\displaystyle Y} כל אחד הוא n × 2 n {\displaystyle n\times 2n} סיביות. את המפתח הציבורי הוא רושם אצל צד שלישי באופן כזה שכל אחד יוכל להשתכנע שהוא הבעלים. אם נתון המסמך D {\displaystyle D} באורך שרירותי עליו רוצים לחתום, מקובל לחתום על תמצית המסמך שהיא הרבה יותר קצרה במקום על המסמך עצמו. לצורך תיאור חתימת למפורט נניח שנתונה פונקציית גיבוב כלשהי g {\displaystyle g} (כמו SHA-2) המפיקה מהמסמך תמצית באורך n {\displaystyle n} סיביות d = g ( D ) {\displaystyle d=g(D)} . כעת d {\displaystyle d} היא מחרוזת בינארית באורך n {\displaystyle n} סיביות ( d n − 1 , . . . , d 0 ) {\displaystyle (d_{n-1},...,d_{0})} . החתימה הדיגיטלית על תמצית המסמך היא: σ = ( x n − 1 [ d n − 1 ] , . . . , x 1 [ d 1 ] , x 0 [ d 0 ] ) ∈ { 0 , 1 } ( n , n ) {\displaystyle \sigma =(x_{n-1}[d_{n-1}],...,x_{1}[d_{1}],x_{0}[d_{0}])\in \{0,1\}^{(n,n)}} σ {\displaystyle \sigma } היא רצף של n {\displaystyle n} מחרוזות בינאריות כל אחת באורך n {\displaystyle n} סיביות. במילים אחרות החותם חושף בפני המוודא את המפתחות הסודיים מהטבלה X {\displaystyle X} המתאימים לסיביות של d {\displaystyle d} . עבור כל זוג ערכים ( x i [ 0 ] , x i [ 1 ] ) {\displaystyle (x_{i}[0],x_{i}[1])} בוחרים אחד מהם לפי ערכה של הסיבית המתאימה d i {\displaystyle d_{i}} . תחילה ההנחה היא שהמאמת קיבל לידיו בדרך בטוחה את המפתח הציבורי Y {\displaystyle Y} של החותם באופן שניתן להוכיח את בעלותו (כמו באמצעות צד שלישי). כדי לוודא שהחתימה σ {\displaystyle \sigma } על התמצית d {\displaystyle d} תקפה הוא מחשב את: ( f ( σ n − 1 ) , . . . , f ( σ 0 ) ) = ( y n − 1 [ d n − 1 ] , . . . , y 0 [ d 0 ] ) {\displaystyle (f(\sigma _{n-1}),...,f(\sigma _{0}))=(y_{n-1}[d_{n-1}],...,y_{0}[d_{0}])} . במילים, הוא מחשב את כל הפונקציות f {\displaystyle f} של ערכי σ i {\displaystyle \sigma _{i}} ומשווה עם ערכי המפתח הציבורי המתאימים y i {\displaystyle y_{i}} . אם כולם זהים המשמעות היא שהחתימה אמיתית. אחרת ייתכן שהמסמך השתנה או שהחתימה מזויפת. תהליך אימות החתימה דורש n {\displaystyle n} הפעלות של הפונקציה f {\displaystyle f} . לכל מי שאינו מכיר את המפתח הפרטי X {\displaystyle X} יהיה מאוד קשה לחשב את החתימה על מסמך כלשהו ולטעון שהמסמך נחתם על ידי החותם הלגטימי, כלומר לזייף את החתימה. כי עבור כל סיבית עליו לחשב את המפתח הפרטי X i {\displaystyle X_{i}} של החותם המתאים למפתח האימות הציבורי Y i {\displaystyle Y_{i}} , שזה בעצם לחשב את הפונקציה ההופכית של f {\displaystyle f} ומעצם ההגדרה זו פעולה קשה. קל לראות שכדי לאמת את החתימה החותם חושף את המפתחות X i [ j ] {\displaystyle X_{i}[j]} המתאימים לסיביות המסר. אם החותם השתמש באותו מפתח כדי לחתום על מסרים נוספים, המידע שהצטבר בידי המאמת מאפשר לו לחתום על מסמך אחר שנגזר מהמסמכים החתומים שקיבל, גם אם המסמך לא בעל משמעות כלשהי. יוצא שהמאמת הצליח לזייף חתימה על מסמך שהחותם הלגיטמי לא חתם עליו. מסיבה זו אסור לחתום על מסמכים נוספים עם אותו מפתח. נתון n = 3 {\displaystyle n=3} ולמען הפשטות נניח שהפונקציה f : { 0 , 1 } 3 → { 0 , 1 } 3 {\displaystyle f:\{0,1\}^{3}\rightarrow \{0,1\}^{3}} מקבלת את x {\displaystyle x} באורך 3 סיביות ומחזירה את x + 1 {\displaystyle x+1} מודולו 8 (המודולו מבטיח שהתוצאה תישאר מספר שהייצוג הבינארי שלו באורך שלוש סיביות). ברור שהפונקציה הזו אינה בטוחה לשימוש כי קל להפוך אותה, היא מובאת כאן רק לשם המחשה. במציאות משתמשים בפונקציה חד-כיוונית קריפטוגרפית. וכן נתונה תמצית המסר d = ( 1 , 0 , 1 ) {\displaystyle d=(1,0,1)} . נניח שהחותם בחר את המפתח הפרטי: X = ( x 2 [ 0 ] , x 2 [ 1 ] , x 1 [ 0 ] , x 1 [ 1 ] , x 0 [ 0 ] , x 0 [ 1 ] ) = ( 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 ) ∈ { 0 , 1 } ( 3 , 6 ) {\displaystyle X=(x_{2}[0],x_{2}[1],x_{1}[0],x_{1}[1],x_{0}[0],x_{0}[1])={\begin{pmatrix}1&0&0&1&1&0\\1&0&1&1&0&1\\1&0&1&0&1&0\end{pmatrix}}\in \{0,1\}^{(3,6)}} כל זוג מפתחות x i [ 0 ] , x i [ 1 ] {\displaystyle x_{i}[0],x_{i}[1]} מיוצג על ידי זוג עמודות, למשל x 1 [ 0 ] = ( 0 , 1 , 1 ) = 3 , x 1 [ 1 ] = ( 1 , 1 , 0 ) = 6 {\displaystyle x_{1}[0]=(0,1,1)=3,x_{1}[1]=(1,1,0)=6} . כעת הוא מחשב את המפתח הציבורי: Y = ( y 2 [ 0 ] , y 2 [ 1 ] , y 1 [ 0 ] , y 1 [ 1 ] , y 0 [ 0 ] , y 0 [ 1 ] ) = ( 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 ) ∈ { 0 , 1 } ( 3 , 6 ) {\displaystyle Y=(y_{2}[0],y_{2}[1],y_{1}[0],y_{1}[1],y_{0}[0],y_{0}[1])={\begin{pmatrix}0&0&1&1&1&0\\0&0&0&1&1&1\\0&1&0&1&0&1\end{pmatrix}}\in \{0,1\}^{(3,6)}} למשל המפתח הפרטי x 2 [ 0 ] = ( 1 , 1 , 1 ) {\displaystyle x_{2}[0]=(1,1,1)} שהוא 7 בבסיס עשרוני. לכן המפתח הציבורי המקביל הוא y 2 [ 0 ] = f ( 7 ) = 7 + 1  mod  8 = ( 0 , 0 , 0 ) {\displaystyle y_{2}[0]=f(7)=7+1{\text{ mod }}8=(0,0,0)} . החתימה על d = ( d 2 , d 1 , d 0 ) = ( 1 , 0 , 1 ) {\displaystyle d=(d_{2},d_{1},d_{0})=(1,0,1)} היא: σ = ( σ 2 , σ 1 , σ 0 ) = ( x 2 [ 1 ] , x 1 [ 0 ] , x 0 [ 1 ] ) = ( 0 0 0 0 1 1 0 1 0 ) ∈ { 0 , 1 } ( 3 , 3 ) {\displaystyle \sigma =(\sigma _{2},\sigma _{1},\sigma _{0})=(x_{2}[1],x_{1}[0],x_{0}[1])={\begin{pmatrix}0&0&0\\0&1&1\\0&1&0\end{pmatrix}}\in \{0,1\}^{(3,3)}} כלומר החותם חושף את המפתחות הפרטיים (עמודות של X {\displaystyle X} ) המתאימים לערכי המסר, במקרה זה מימין לשמאל נבחרו העמודה הראשונה, הרביעית והחמישית בהתאמה. כדי לאמת את החתימה σ {\displaystyle \sigma } המאמת משתמש במפתח הציבורי Y {\displaystyle Y} . למשל החתימה השלישית שקיבל היא σ 2 = x 2 [ d 2 ] = ( 0 , 0 , 0 ) {\displaystyle \sigma _{2}=x_{2}[d_{2}]=(0,0,0)} וכן d 2 = 1 {\displaystyle d_{2}=1} . מה שנותר לו לבדוק שאכן מתקיים: y 2 [ d 2 ] = f ( x 2 [ d 2 ] ) = y 2 [ 1 ] {\displaystyle y_{2}[d_{2}]=f(x_{2}[d_{2}])=y_{2}[1]} ואכן f ( x 2 [ 1 ] ) = ( 0 , 0 , 0 ) + ( 0 , 0 , 1 )  mod  8 = ( 0 , 0 , 1 ) {\displaystyle f(x_{2}[1])=(0,0,0)+(0,0,1){\text{ mod }}8=(0,0,1)} . וכן לגבי כל הערכים האחרים. רק אם הבדיקה של כולם מסתיימת בהצלחה הוא יכול להיות בטוח שהחתימה אותנטית. לפי דוגמה זו נניח שהחותם חתם עם אותו מפתח על תמצית שני מסמכים שונים d 1 = ( 1 , 0 , 1 ) {\displaystyle d_{1}=(1,0,1)} ו- d 2 = ( 1 , 1 , 0 ) {\displaystyle d_{2}=(1,1,0)} כעת בידי המאמת המפתחות x 2 [ 1 ] , x 1 [ 0 ] , x 1 [ 1 ] , x 0 [ 0 ] , x 0 [ 1 ] {\displaystyle x_{2}[1],x_{1}[0],x_{1}[1],x_{0}[0],x_{0}[1]} אותם הוא השיג משילוב המידע משתי החתימות. כעת הוא יכול להשתמש במידע זה כדי לחתום על תמצית של מסמך אחר נניח d 3 = ( 1 , 1 , 1 ) {\displaystyle d_{3}=(1,1,1)} והחתימה תהיה לגיטימית כי בידיו למעשה מספיק מפתחות כדי לשכנע אחרים שהמסמך חתום על ידי הבעלים של X {\displaystyle X} בעוד שלמעשה הוא החותם. אולם יש לשים לב שהוא אינו יכול לחתום על תמצית מסמך d = ( 0 , 0 , 1 ) {\displaystyle d=(0,0,1)} כי חסר לו הערך x 2 [ 0 ] {\displaystyle x_{2}[0]} אותו לא קיבל מהחותם הלגיטימי. אם ברצונו לזייף חתימה על המסמך האמור עליו לחשב את x 2 [ 0 ] {\displaystyle x_{2}[0]} מתוך y 2 [ 0 ] {\displaystyle y_{2}[0]} שבידו כלומר להפוך את הפונקציה החד כיוונית, כל עוד היא בטוחה הדבר לא יעלה בידו. כלומר התוקף יכול לזייף חתימה רק עבור מסמכים מסוימים ולא עבור כל מסמך שירצה. אפשר לעקוף בעיה זו על ידי הוספת בדיקת זוגיות. רוברט וינטרניץ (Robert Steven Winternitz) הציע לקצר את מפתחות החתימה של אלגוריתם למפורט באופן משמעותי על חשבון עלייה בסיבוכיות זמן. הרעיון הוא לחתום על מספר סיביות של תמצית המסר בבת אחת. ההצעה של וינטרניץ הובאה לראשונה בתזה של רלף מרקל והיא פועלת כדלהלן: נתון פרמטר ביטחון n {\displaystyle n} ופונקציה חד כיוונית f {\displaystyle f} בדיוק כמו בחתימת למפורט, בנוסף נתון פרמטר w ≥ 2 {\displaystyle w\geq 2} המייצג את מספר הסיביות שאפשר לחתום עליהן בו-זמנית ושלושה פרמטרים נוספים t , t 1 , t 2 {\displaystyle t,t_{1},t_{2}} כך שמתקיים: t 1 = ⌈ n w ⌉ , t 2 = ⌈ ⌊ log 2   t 1 ⌋ w ⌉ , t = t 1 + t 2 {\displaystyle t_{1}=\left\lceil {\frac {n}{w}}\right\rceil ,t_{2}=\left\lceil {\frac {\lfloor {\text{log}}_{2}\ t_{1}\rfloor }{w}}\right\rceil ,t=t_{1}+t_{2}} . מפתח החתימה הוא: X = ( x t − 1 , . . . , x 1 , x 0 ) ∈ R { 0 , 1 } ( n , t ) {\displaystyle X=(x_{t-1},...,x_{1},x_{0})\in _{R}\{0,1\}^{(n,t)}} כלומר המפתח הפרטי מורכב מ- t {\displaystyle t} מחרוזות אקראיות באורך n {\displaystyle n} סיביות. מפתח האימות הציבורי הוא: Y = ( y t − 1 , . . . , y 1 , y 0 ) ∈ { 0 , 1 } ( n , t ) {\displaystyle Y=(y_{t-1},...,y_{1},y_{0})\in \{0,1\}^{(n,t)}} , באופן כזה שעבור כל ערכי x i {\displaystyle x_{i}} הערך המקביל הוא y i = f 2 w − 1 ( x i ) {\displaystyle y_{i}=f^{2^{w}-1}(x_{i})} . שים לב שבניגוד לחתימת למפורט כאן הפונקציה f {\displaystyle f} מופעלת באופן רקורסיבי (הפונקציה מופעלת שוב ושוב על התוצאה שלה) 2 w − 1 {\displaystyle 2^{w}-1} פעמים עבור כל x i {\displaystyle x_{i}} ובסך הכול מופעלת t ( 2 w − 1 ) {\displaystyle t(2^{w}-1)} פעמים. הרווח כאן הוא שהמפתחות X {\displaystyle X} ו- Y {\displaystyle Y} קצרים יותר, ליתר דיוק באורך t ⋅ n {\displaystyle t\cdot n} סיביות כל אחד. אם t {\displaystyle t} קטן הושג כאן שיפור משמעותי לעומת n ⋅ 2 n {\displaystyle n\cdot 2n} סיביות בחתימת למפורט. כמו בתהליך ההכנה לעיל, נתונה תמצית המסר d = g ( M ) = ( d n − 1 , . . . , d 1 , d 0 ) {\displaystyle d=g(M)=(d_{n-1},...,d_{1},d_{0})} באורך n {\displaystyle n} סיביות. תחילה מרפדים את d {\displaystyle d} באפסים מובילים לפי הצורך כדי שאורך המחרוזת יתחלק ב- w {\displaystyle w} ומחלקים את התוצאה ל- t 1 {\displaystyle t_{1}} מחרוזות ( b t − 1 , . . . , b t − t 1 {\displaystyle b_{t-1},...,b_{t-t_{1}}} ) באורך w {\displaystyle w} סיביות כל אחת. מתייחסים למחרוזות b i {\displaystyle b_{i}} כאל מספרים שלמים בטווח { 0 , 1 , . . . , 2 w − 1 } {\displaystyle \{0,1,...,2^{w}-1\}} ומחשבים ספרת ביקורת כך: c = ∑ i = t − t 1 t − 1 ( 2 w − b i ) {\displaystyle c=\sum _{i=t-t_{1}}^{t-1}(2^{w}-b_{i})} . היות ש- c ≤ t 1 2 w {\displaystyle c\leq t_{1}2^{w}} אורך הייצוג הבינארי של השלם c {\displaystyle c} אינו עולה על ⌊ log 2 ⁡ t 1 ⌋ + w + 1 {\displaystyle \lfloor \log _{2}t_{1}\rfloor +w+1} סיביות. מוסיפים ל- c {\displaystyle c} אפסים מובילים כנדרש כדי להשלימו למחרוזת באורך t 2 {\displaystyle t_{2}} כניסות באורך w {\displaystyle w} סיביות כל אחת b t 2 − 1 , . . . , b 0 {\displaystyle b_{t_{2}-1},...,b_{0}} . המחרוזת המורחבת המתקבלת משרשור המחרוזות d {\displaystyle d} ו- c {\displaystyle c} יחד, מומרת למערך שלמים b = b t − 1 , . . . , b t − t 1 , b t 2 − 1 , . . . , b 0 {\displaystyle b=b_{t-1},...,b_{t-t_{1}},b_{t_{2}-1},...,b_{0}} המכיל t 1 + t 2 {\displaystyle t_{1}+t_{2}} מספרים באורך w {\displaystyle w} סיביות כל אחד. לבסוף החתימה היא: σ = ( f b t − 1 ( x t − 1 ) , . . . , f b 1 ( x 1 ) , f b 0 ( x 0 ) ) {\displaystyle \sigma =(f^{b_{t-1}}(x_{t-1}),...,f^{b_{1}}(x_{1}),f^{b_{0}}(x_{0}))} . כלומר על כל x i {\displaystyle x_{i}} מפעילים את הפונקציה f {\displaystyle f} ברקורסיה b i {\displaystyle b_{i}} פעמים. במקרה הגרוע כגון אם המסר מכיל מחרוזת של אחדים, הכנת החתימה דורשת t ( 2 w − 1 ) {\displaystyle t(2^{w}-1)} הפעלות של הפונקציה f {\displaystyle f} ואורך החתימה הוא t ⋅ n {\displaystyle t\cdot n} סיביות. כאשר המאמת מקבל את תמצית המסמך d {\displaystyle d} והחתימה σ {\displaystyle \sigma } תחילה מכין את מערך השלמים b = b t − 1 , . . . , b 0 {\displaystyle b=b_{t-1},...,b_{0}} בדיוק כמו בהתליך החתימה ואז בודק אם מתקיים: ( f 2 w − 1 − b t − 1 ( σ n − 1 ) , . . . , f 2 w − 1 − b 1 ( σ 1 ) , f 2 w − 1 − b 0 ( σ 0 ) ) = ( y n − 1 , . . . , y 1 , y 0 ) {\displaystyle (f^{2^{w}-1-b_{t-1}}(\sigma _{n-1}),...,f^{2^{w}-1-b_{1}}(\sigma _{1}),f^{2^{w}-1-b_{0}}(\sigma _{0}))=(y_{n-1},...,y_{1},y_{0})} . ביתר פירוט, היות שאם החתימה תקפה מתקיים σ i = f b i ( x i ) {\displaystyle \sigma _{i}=f^{b_{i}}(x_{i})} מזה נובע ש- f 2 w − 1 − b i ( σ i ) = f 2 w − 1 ( x i ) = y i {\displaystyle f^{2^{w}-1-b_{i}}(\sigma _{i})=f^{2^{w}-1}(x_{i})=y_{i}} . לדוגמה אם w = 4 {\displaystyle w=4} מפתח האימות Y i {\displaystyle Y_{i}} הופק על ידי קריאה רקורסיבית לפונקציה f {\displaystyle f} בסך הכול 2 4 − 1 = 15 {\displaystyle 2^{4}-1=15} פעמים. כעת אם b i = 5 {\displaystyle b_{i}=5} החתימה על x i {\displaystyle x_{i}} היא σ i = f b i ( x i ) = f 5 ( x i ) {\displaystyle \sigma _{i}=f^{b_{i}}(x_{i})=f^{5}(x_{i})} מזה נובע ש- f 2 4 − 1 − b i ( σ i ) = f 10 ( f 5 ( x ) ) = f 15 ( x i ) = y i {\displaystyle f^{2^{4}-1-b_{i}}(\sigma _{i})=f^{10}(f^{5}(x))=f^{15}(x_{i})=y_{i}} . סיבוכיות האימות זהה לסיבוכיות החתימה. נניח שנקבעו הפרמטרים הבאים: n = 3 , w = 2 , t 1 = 2 , t 2 = 2 , t = 4 {\displaystyle n=3,w=2,t_{1}=2,t_{2}=2,t=4} . נתונה הפונקציה החד כיוונית f : { 0 , 1 } 3 → { 0 , 1 } 3 {\displaystyle f:\{0,1\}^{3}\rightarrow \{0,1\}^{3}} המחזירה עבור x {\displaystyle x} את ( x + 1 ) {\displaystyle (x+1)} מודולו 8 {\displaystyle 8} . נניח שהחותם בחר את המפתח: X = ( x 3 , x 2 , x 1 , x 0 ) = ( 1 0 0 1 1 0 1 1 1 0 1 0 ) ∈ { 0 , 1 } ( 3 , 4 ) {\displaystyle X=(x_{3},x_{2},x_{1},x_{0})={\begin{pmatrix}1&0&0&1\\1&0&1&1\\1&0&1&0\end{pmatrix}}\in \{0,1\}^{(3,4)}} חישוב המפתח הציבורי יהיה: Y = ( y 3 , y 2 , y 1 , y 0 ) = ( 0 0 1 0 1 1 1 0 0 1 0 1 ) ∈ { 0 , 1 } ( 3 , 4 ) {\displaystyle Y=(y_{3},y_{2},y_{1},y_{0})={\begin{pmatrix}0&0&1&0\\1&1&1&0\\0&1&0&1\end{pmatrix}}\in \{0,1\}^{(3,4)}} אם נתונה תמצית המסמך d = ( d 2 , d 1 , d 0 ) = ( 1 , 0 , 0 ) {\displaystyle d=(d_{2},d_{1},d_{0})=(1,0,0)} תחילה מוסיפים אפס בראש המחרוזת (משמאל) ומקבלים מחרוזת באורך 4 סיביות המחולקת לשני בלוקים באורך w = 2 {\displaystyle w=2} כדלהלן: d = 01   ‖   00 {\displaystyle d=01\ \|\ 00} ספרת הביקורת לפי הנוסחה לעיל היא c = ( 4 − 1 ) + 4 = 7 {\displaystyle c=(4-1)+4=7} שהוא "111" בייצוג בינארי. את המחרוזת הזו מרפדים באפס מוביל ומתקבלת מחרוזת באורך 4 סיביות המחולקת לשני בלוקים: c = 01   ‖   11 {\displaystyle c=01\ \|\ 11} כעת ממירים את ארבעת הבלוקים שהתקבלו למערך b {\displaystyle b} באורך 4 כניסות כאשר כל כניסה מכילה מספר שלם בין 0 ל-3 ומתקבל: b = ( b 3 , b 2 , b 1 , b 0 ) = ( 01   ‖   00   ‖   01   ‖   11 ) = ( 1 , 0 , 1 , 3 ) {\displaystyle b=(b_{3},b_{2},b_{1},b_{0})=(01\ \|\ 00\ \|\ 01\ \|\ 11)=(1,0,1,3)} את החתימה מחשבים על ידי הפעלה של הפונקציה f {\displaystyle f} על כל x i {\displaystyle x_{i}} במספר פעמים לפי הערך b i {\displaystyle b_{i}} . כלומר החתימה היא: σ = ( σ 3 , σ 2 , σ 1 , σ 0 ) = ( f ( x 3 ) , x 2 , f ( x 1 ) , f 3 ( x 0 ) ) = ( 0 0 1 1 0 0 0 1 0 0 0 1 ) ∈ { 0 , 1 } ( 3 , 4 ) {\displaystyle \sigma =(\sigma _{3},\sigma _{2},\sigma _{1},\sigma _{0})=(f(x_{3}),x_{2},f(x_{1}),f^{3}(x_{0}))={\begin{pmatrix}0&0&1&1\\0&0&0&1\\0&0&0&1\end{pmatrix}}\in \{0,1\}^{(3,4)}} (הערה: אם b i = 0 {\displaystyle b_{i}=0} הפירוש הוא שהפונקציה f {\displaystyle f} אינה מופעלת כלל, במקום זאת מעתיקים את x i {\displaystyle x_{i}} כמו שהוא). לאימות החתימה בודקים שמתקיים: ( f 2 ( σ 3 ) , f 3 ( σ 2 ) , f 2 ( σ 1 ) , σ 3 ) = ( 0 0 1 0 1 1 1 0 0 1 0 1 ) ∈ { 0 , 1 } ( 3 , 4 ) {\displaystyle (f^{2}(\sigma _{3}),f^{3}(\sigma _{2}),f^{2}(\sigma _{1}),\sigma _{3})={\begin{pmatrix}0&0&1&0\\1&1&1&0\\0&1&0&1\end{pmatrix}}\in \{0,1\}^{(3,4)}} . למשל היות ש- b 3 = 1 {\displaystyle b_{3}=1} בדיקת החתימה σ 3 {\displaystyle \sigma _{3}} מתבצעת על ידי חישוב הפונקציה f {\displaystyle f} שלה בדיוק 2 w − 1 − b 3 = 2 {\displaystyle 2^{w}-1-b_{3}=2} פעמים. לכן f 2 ( σ 3 ) = y 3 {\displaystyle f^{2}(\sigma _{3})=y_{3}} . בדומה לחתימת למפורט הבסיסית גם כאן אם החותם ישתמש באותו מפתח כדי לחתום על מסמכים נוספים נניח למשל שהוא חתם על תמצית המסמך d 1 = ( 1 , 0 , 0 ) {\displaystyle d_{1}=(1,0,0)} , d 2 = ( 1 , 1 , 1 ) {\displaystyle d_{2}=(1,1,1)} לכן לפי הדוגמה המובאת החתימות שהצטברו בידי המאמת הן: f ( x 3 ) , f 3 ( x 2 ) , x 2 , f ( x 1 ) , f 3 ( x 0 ) , x 0 {\displaystyle f(x_{3}),f^{3}(x_{2}),x_{2},f(x_{1}),f^{3}(x_{0}),x_{0}} . עם חתימות אילו הוא יכול לחתום על מסמך d 3 = ( 1 , 1 , 0 ) {\displaystyle d_{3}=(1,1,0)} . כלומר תוקף פוטנציאלי שמקבל מספר מרובה של חתימות על מסמכים שונים יכול להפיק חתימה שתראה אותנטית על מסמך אחר, גם אם לא בהכרח מסמך בעל משמעות כלשהי. בשל עובדה זו אין לחתום על מסמכים נוספים עם אותו מפתח. חתימת למפרוט וחתימת וינטרניץ אינן פרקטיות כמו שהן משתי סיבות. כל חתימה מתאימה רק למסמך אחד ולכן יש צורך לאחסן כמות גדולה של חתימות וכן לנהל מעקב אחר חתימות שכבר נעשה בהן שימוש. ומלבד זאת מפתחות החתימה והאימות גדולים מאוד. למשל בדוגמה שהובאה לעיל כדי לחתום על מסמך באורך שלוש סיביות נדרשו מפתחות חתימה ואימות באורך 12 סיביות כל אחד, שזה פי ארבעה מאורך המסמך עצמו. ביישומים מעשיים כגון חתימה על חבילות מידע ברשת האינטרנט או על קבצים של עדכוני תוכנה לא תיתכן חתימה כל כך גדולה. לשם השוואה חתימה דיגיטלית DSA על מסמך באורך 256 סיביות היא באורך לכל היותר 512 סיביות. מצד שני היות שתהליך החתימה עצמה מאוד יעיל ובטוח, המחקר עדיין בעיצומו לנסות למצוא דרכים לייעול חתימה דיגיטלית מבוססת פונקציית גיבוב כך שתהיה קומפקטית ויעילה במידת האפשר. עץ מרקל חתימה דיגיטלית פונקציית גיבוב קריפטוגרפית Constructing Digital Signatures from One Way Function, Leslie Lamport, Computer Science Laboratory, SRI International, 1979 Post-Quantum Cryptography, Bernstein, Daniel J., Buchmann, Johannes, Dahmen, Erik, Springer-Verlag, 2009 A Certified Digital Signature, Ralph C. Merkle, 1979