מתקדם שיעור 4 4 דקות קריאה

ECDSA שלב אחר שלב: כיצד מחושבת חתימה

עבור נונס, שני כפל ושני מספרים, r ו-s. השיעור הזה מחשב ומאמת חתימה שלמה.

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

נתחיל ממה שנכנס. ההודעה שנחתמת היא העסקה, מסוכמת על ידי SHA-256 ונקראת כמספר, שנקרא z. המפתח הפרטי הוא המספר d, והמפתח הציבורי הוא הנקודה Q, שהיא d כפול G. וישנו מרכיב שלישי, שנבחר באקראי בזמן אמת, ה-nonce k.

החתימה כוללת ארבעה שלבים. בחר k בין אחד ל-n פחות אחד. חשב את הנקודה k כפול G וקח את הקואורדינטה x שלה, מצומצמת מודולו n: זהו ה-r. חשב את s כהופכי של k כפול הסכום של z עם r כפול d, הכל מודולו n. החתימה היא הזוג r, s. אם r או s יוצאים אפס, בוחרים k אחר — מה שבפועל כמעט ולא קורה.

שים לב שהמפתח הפרטי d מופיע רק פעם אחת, בשורה השלישית, מעורבב עם z ומוגן על ידי הכפלה בהופכי של k. שום דבר ב-r או s לא מאפשר לבודד אותו — כל עוד k שונה בכל פעם, והשיעור הבא כולו עוסק במה שקורה כשזה לא כך.

האימות כולל שלושה שלבים, ומי שמאמת יש לו רק את העסקה, המפתח הציבורי Q והזוג r, s. חשב את ההופכי של s מודולו n. הכפל את z בו וקרא לזה u1; הכפל את r בו וקרא לזה u2. חבר את הנקודות u1 כפול G ו-u2 כפול Q. החתימה תקפה אם הקואורדינטה x של הנקודה שיצאה, מצומצמת מודולו n, שווה ל-r.

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

עכשיו ההחלפה שמסבירה הכל. הנקודה המחושבת באימות היא u1 כפול G ועוד u2 כפול Q. בהחלפת Q ב-d כפול G, זה הופך להופכי של s כפול הסכום של z עם r כפול d, כל זה כפול G. אבל s הוגדר בדיוק כהופכי של k כפול אותו סכום — אז ההופכי של s כפול הסכום הוא פשוט k. הנקודה שהאימות מייצר היא k כפול G: בדיוק הנקודה שהחותם חישב בשלב השני, והקואורדינטה x שלה הפכה ל-r שמשווים.

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

שלושה פרטים מעשיים סוגרים את הנושא.

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

הצל אומר איפה, לא אומר באיזו גובה.

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

שני דרכים הגיעו לאותו מקום. הכלל סגר אחד מהם.

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

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