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

העקומה secp256k1: נקודות, חיבור ונקודת האינסוף

y² = x³ + 7 על גוף סופי. השיעור הזה מוסיף שני נקודות עם סרגל, מחוגה ואחר כך עם נוסחה.

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

המשוואה היא y² = x³ + 7. במונחים הכלליים שבהם נכתבות העקומות הללו, המקדמים a שווה לאפס ו-b שווה לשבע — והאפס הזה אינו פרט שולי: הוא מקצר את הנוסחאות הבאות והוא אחת הסיבות לכך שה-secp256k1 מהירה.

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

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

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

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

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

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

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

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

הפרמטרים המדויקים של secp256k1 פורסמו מאז 2000 ולא משתנים: הראשוני p, האפס, השבע, שתי הקואורדינטות של הגנרטור G שנכתבות עם שישים וארבע תווים כל אחת, והמספר n, שהוא כמה נקודות G מגיעות לפני שחוזרות לנקודה באינסוף.

התבנית מקובעת לשולחן העבודה, וכל אחד מודד נגדה.

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

אתה כבר יודע לסכם נקודות ולהכפיל נקודות. הכפלת נקודה במספר של 256 ביט היא חזרה על שתי הפעולות הללו, והשיעור הבא מראה כיצד עושים זאת בפחות משלוש מאות צעדים — ולמה הפירוק עדיין עולה 2^128.