בינוני שיעור 4 4 דקות קריאה

חתימות דיגיטליות: להוכיח מבלי לחשוף

חתימה מראה שיש לך את המפתח מבלי להראות את המפתח - ואם היא יוצאת אותו דבר פעמיים, זה המפתח שנופל.

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

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

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

המנעול נפתח לעיני כולם, והמפתח לא הופיע בשום שלב.

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

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

החותם לא מחזיק רק את הדף האחרון: הוא מחזיק את כולם. החלפת דף שוברת את התפירה.

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

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

זה לא תיאוריה. בדצמבר 2010, בכנס של Chaos Computer Club בברלין, הקבוצה fail0verflow הראתה שסוני השתמשה ב-nonce קבוע כדי לחתום על התוכניות של PlayStation 3: המפתח שאישר את כל התוכנה של הקונסולה נגזר בפומבי. באוגוסט 2013, תקלה במחולל המספרים האקראיים של אנדרואיד גרמה לארנקי ביטקוין לחזור על nonces מבלי שאף אחד שם לב; הכתובות שנפגעו נשטפו על ידי מי שחיפש בבלוקצ'יין בדיוק את זה.

שתי חתימות זהות על מסמכים שונים: כך מפתח פרטי נופל.

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

אתה כבר יודע שמפתח פרטי הוא מספר, שהמפתח הציבורי נובע ממנו, שהכתובת נובעת מהציבורי ושהחתימה מוכיחה את הבעלות מבלי להראות דבר. נותרה השאלה שמחזיקה את כל זה: מדוע אף אחד לא פשוט מנסה את כל המספרים עד שהוא מוצא את שלך? בשיעור הבא, גודל של 2^256.