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

איפה ה-ECDSA נשבר: nonce חוזר ומפתחות משוחזרים

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

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

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

כתוב את השניים: s1 הוא ההפכי של k כפול הסכום של z1 עם r כפול d; s2 הוא ההפכי של k כפול הסכום של z2 עם r כפול d. הפחת אחד מהשני. החלקים עם r כפול d מתבטלים, כי הם זהים, ונשאר ש-s1 פחות s2 הוא ההפכי של k כפול z1 פחות z2. בידוד: k שווה ל-z1 פחות z2 חלקי s1 פחות s2. עם k ביד, חזור למשוואה הראשונה ובודד את d, שהוא s1 כפול k פחות z1, חלקי r.

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

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

המקרה המפורסם הראשון לא היה בביטקוין. ב-27 בדצמבר 2010, בכנס של Chaos Computer Club בברלין, הקבוצה fail0verflow הראתה שסוני חתמה על התוכנה של PlayStation 3 תמיד עם אותו k — ערך קבוע, שנכתב בקוד. שתי חתימות כלשהן הספיקו. המפתח שאישר את כל התוכנה של הקונסולה נגזר בפומבי, על הבמה.

בביטקוין, האסון המקביל הגיע באוגוסט 2013. תקלה במחולל המספרים האקראיים של אנדרואיד גרמה לאפליקציות לקבל את אותה זריעת אקראיות, וארנקים שחתמו על יותר מעסקה אחת חזרו על nonces מבלי שמשהו יצביע על בעיה. ב-11 באוגוסט, האתר bitcoin.org פרסם את האזהרה. מי שסרק את הבלוקצ'יין בחיפוש אחר ערכי r חוזרים כבר רוקן את הכתובות המושפעות.

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

ההגנה היא אלגנטית והיא התקן מאז 2013: להפסיק להגריל. התקן RFC 6979 מתאר כיצד לגזור k בצורה דטרמיניסטית, על ידי יישום HMAC על המפתח הפרטי והסיכום של ההודעה. ה-k נשאר בלתי צפוי למי שמחוץ, כי הוא תלוי במפתח הפרטי, אבל מפסיק להיות תלוי באיכות המחולל האקראי של המחשב. אותו מפתח שחותם על אותה הודעה תמיד יוצר את אותה חתימה — מה, בנוסף לבטיחות, הוא נוח לבדיקה.

החליפו את ההגרלה בתבנית: אותה תוצאה, תמיד, ללא תלות במזל.

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

כל חתימה מוסרת פיסה. כמה מאות מספיקות כדי להרכיב את התמונה.

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

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