בקריפטוגרפיה, עקום 25519 (באנגלית: Curve25519) הוא כינוי לעקום אליפטי מסוים המיועד לשימוש ביחד עם פונקציית דיפי-הלמן בעקום אליפטי (בקיצור ECDH), כחלק מפרוטוקול שיתוף מפתח המבוסס על דיפי-הלמן. העקום מספק ביטחון ברמה של 128 סיביות (גודל מפתח של 256 סיביות) ומהירות ביצוע גבוהה במיוחד. זהו אחד מהעקומים המהירים ביותר הקיימים כיום, הוא אינו מוגן בפטנט וקוד הייחוס שלו הוא נחלת הכלל.

העקום פופולרי מאוד כיום ונמצא בשימוש מעשי נרחב ביישומי אבטחה רבים, במיוחד באבטחת מסרים מיידיים. עקום 25519 פותח ב-2005 על ידי דניאל ברנשטיין שקרא לו בתחילה פונקציית DH[1]. מאוחר יותר הציע לקרוא לעקום בשם זה בשל מבנהו המסתמך על המספר הראשוני 225519 ופונקציית דיפי הלמן נקראה X25519 בהתאם[2].

יתרונות עקום 25519 הם:

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

מבנה מתמטי

העקום Curve25519 הוא עקום מונטגומרי מעל ההרחבה הריבועית של השדה הראשוני המוגדר על ידי המספר הראשוני 225519 יחד עם נקודת בסיס קבועה x=9 ונוסחתו היא:

y2=x3+486662x2+x.

פרוטוקול דיפי הלמן בעקום זה משתמש בגרסה "דחוסה", שבה מתייחסים רק לקואורדינטה x של הנקודה, מה שמאפשר להשתמש באלגוריתם סולם מונטגומרי (המתואר להלן) כדי לבצע כפל נקודות בעקום תוך שימוש במה שקרוי קוארודינטות פרויקטיביות. עקום זה הוא גרסה מפותלת של עקום אליפטי ממשפחת עקומי אדוארד שהם עקומים אליפטיים מיוחדים הנקראים על שם המתמטיקאי הרולד אדוארד שחקר אותם ב-2007. עקום אדוארד מפותל מעל השדה 𝕂 שהמציין שלו אינו 2 הוא מישור אפיני המוגדר על ידי המשוואה:

EEa,d:ax2+y2=1+dx2y2

כאשר a ו-d הם אלמנטים שונים של 𝕂. אם a=1 מתקבל עקום אדוארד. עקום זה שקול בירציונלית לעקום מונטגומרי שהוא סוג אחר של עקום אליפטי שהיתרון שלו הוא ביכולת לבצע חישובי כפל וחיבור נקודות ביעילות בייצוג פרויקטיבי. בשיטה זו הנקודה P=(x,y) מיוצגת על ידי (X:Z) כאשר x=X/Z (לדוגמה יכול להיות Z=1). בשיטת ייצוג זו הנקודה מאבדת מידע בשל העובדה שהקואורדינטה y אינה משתתפת בחישובים לכן לא יהיה הבדל בין P ל-P, אך יתרונה הוא בכך שכפל נקודות הופך להיות קל ולצורך חישובי דיפי-הלמן צריך רק את הקואורדינטה x.

נוסחת חיבור וכפל של מונטגומרי

לפי נוסחת מונטגומרי נדרשים בדיוק 4 ריבועים, כפל אחד ב-(A2)/4, בנוסף ל-5 פעולות כפל נוספות ו-8 פעולות חיבור/חיסור. האלגוריתם פועל כדלהלן. בהינתן מספר ראשוני p5 ושלם A כך ש-A24 אינו מספר ריבועי מודולו p. ויהי E:y2=x3+Ax2+x עקום אליפטי מעל השדה Fp. יהי X:E(Fp2){𝒪}Fp2 כדלהלן: X(𝒪)=𝒪,X(x,y)=x (הסמל 𝒪 מייצג את הנקודה באינסוף). בהינתן x,zFp כאשר (x,z)(0,0) השוויון הבא מתקיים:

x2=(x2z2)2=(xz)2(x+z)2,
z2=4xz(x2+Axz+z2)
=((x+z)2(xz)2)((x+z)2+A24((x+z)2(xz)2))

אז X(2Q)=x2/z2 עבור כל QE(Fp2) כך שמתקיים X(Q)=x/z. כאן הביטוי x/z פירושו המנה של x ו-z בשדה Fp אם z0. אם x=0 התוצאה היא 𝒪 וכן אם x=z=0 התוצאה אינה מוגדרת.

פונקציית דיפי-הלמן

בעקום 25519 לכל משתמש מפתח סודי באורך 32 בתים ומפתח ציבורי באורך 32 בתים. כל זוג משתמשים משתפים "סוד" באורך 32 בתים שממנו הם יכולים לייצר מפתחות לאימות והצפנה של חילופי המסרים ביניהם. העקום 25519 ונקודת הבסיס 9 הם פרמטרים ציבוריים וידועים לכל, כולל למתקיפה פוטנציאלית. המפתח הפרטי של אליס הוא השלם a שיכול להיות כל מחרוזת אקראית של 32 בתים והמפתח הפרטי של בוב הוא b. אליס שולחת לבוב את המפתח הציבורי שלה Curve25519(a,9). הפונקציה Curve25519 מקבלת שלם כלשהו n ונקודה Q בעקום 25519 ומחזירה את nQ. בוב שולח לאליס את המפתח הציבורי שלו Curve25519(b,9). הסוד המשותף הוא:

Curve25519(a,Curve25519(b,9))=Curve25519(b,Curve25519(a,9))

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

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

היסטוריה ושימושים

עקום 25519 זכה לפופולריות רבה מאז פורסם, אולם ההתעניינות הגוברת בו החלה אחרי 2013 כשנודע שה-NSA שתלו דלת אחורית בעקום האליפטי DUAL EC DRBG שהיה חלק מתקן ההצפנה בעקום אליפטי של NIST. אף על פי שאין קשר ישיר ביניהם, החשיפה הגבירה את החשש בקרב המשתמשים מפני דלתות נוספות שייתכן נשתלו במרכיבים אחרים של התקן כמו העקומים הקבועים P-xxx. ברוס שנייר מגדולי הקריפטוגרפים בני זמננו התבטא פעם: "איני סומך יותר על העקומים הקבועים שלהם. אני מאמין שה-NSA ביצעו מניפולציות בעזרת הקשרים שלהם עם התעשייה". הוא גם ציין שה-NSA מסוגלים לפצח כל הצפנה באינטרנט (נכון ל-2013).

עקום 25519 הפך לתקן בפועל שהחליף את P-256 והוא בשימוש במגוון רחב של יישומים. החל מ-2014 פרוטוקול OpenSSH הטמיע את העקום כברירת מחדל בישומים מבוססי ECDH. ספריות קריפטוגרפיות רבות תומכות בעקום זה ביניהן: OpenSSL וכן Libgcrypt, Crypto++‎ ועוד רבים. בין הפרוטוקולים, האפלקציות ומערכות ההפעלה המשתמשים בעקום זה נמנים:

ביטחון ויעילות

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

היתרון של עקום 25519 הוא באופן המימוש שלו. אפשר לנצל את יחידת הנקודה הצפה בקיצור FPU של המעבד כדי להאיץ ביצועים של פעולות כפל וחיבור בסיסיות באופן משמעותי. הסיבה לבחירה של הראשוני 225519 נובעת בגלל היכולת לייצג אלמנטים של השדה בצורה פולינומית ולבצע חיבור וכפל במהירות. הפולינומים נבחרו כך שיענו על שני מאפיינים חשובים, שהמעלה שלהם תהיה נמוכה (לכל היותר 9) כך שיהיו פחות מקדמים שצריך לכפול כחלק מהכפל בפולינומים וכן, כל מקדם הוא כפולה קטנה של 225.5i. ביתר פירוט הפולינומים עם מספר מופחת של מקדמים קטנים הם מהצורה:

u0+u1x+u2x2++u9x9 כאשר ui הוא כפולה שלמה של 225.5i.
ui/225.5i{225,225+1,...,1,0,1,...,2251,225}

כאן הפולינום iuixi מייצג את השלם u0+u1++u9 שהוא בעצם פיצול של שלם באורך 256 סיביות לעשרה שלמים באורך 26 סיביות כל אחד בקירוב, כדי שיתאימו באורכם לאוגרי הנקודה הצפה המצויים בכל מעבד. כל שלם באורך 256 סיביות ניתן לטעינה בתשעה אוגרים. בדרך כלל במעבדים מודרניים אוגרים אילו מצויים בשפע. השימוש בבסיס 25.5 ולא בבסיס 25 או 26 נובע מסיבות של יעילות כדי להימנע מחילוק ארוך במקדמים x10 ו-x11 וכן להימנע מכפל המקדמים ב-2519 במקום ב-19.

חיבור/חיסור שני פולינומים של עקום 25519 מודולו 225519 מצריך 10 פעולות חיבור/חיסור של מספרי נקודה צפה (fp). כל פעולת חיבור/חיסור צורכת 10 פקודות fp בסיסיות, בלולאה הראשית של הפונקציה Curve25519 מתבצעים בסך הכול 20,400 פקודות fp. פעולת כפל צורכת 100 פקודות fp עבור כפל ו-81 פקודות fp עבור חיבור. המקדמים הגבוהים x10,x11,...,x18 לאחר תוצאת הכפל מצומצמים מודולו 2255x1019. למשל המקדם x18 מוכפל ב-192255 ומחובר למקדם x8. כל צמצום דורש פקודת fp אחת לכפל ופקודת fp אחת לחיבור. החלק הגבוה (הכפולה הקרובה ביותר לחזקה של 2) של כל מקדם מחוסר ומחובר למקדם שלפניו. כל העברה כזו צורכת בסך הכול 4 פקודות fp. כך שלצורך הצמצום המודולרי נדרשים עוד כ-60 פקודות fp. כתיבת הקוד עדיפה באסמבלי כדי להימנע מתקורה מיותרת שעלולה לקרות ביישום בשפת C.

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

הפונקציה Curve25519

הפונקציה Curve25519 היא בעצם כפל סקלרי של הקואורדינטה xFp מעל העקום E(Fp2), כאשר p הוא המספר הראשוני 225519 ו-E הוא העקום האליפטי y2=x3+486662x2+x.

ביתר פירוט, השדה 𝔽p2 מוגדר כקבוצת כל האלמנטים (Z/(225519))[2]. תהי הפונקציה X0:E(𝔽p2)𝔽p2 מוגדרת כדלהלן: X0(𝒪)=0,X0(x,y)=x. במילים אחרות X0 היא פונקציה שממירה נקודה בעקום לאלמנט בשדה (פשוט על ידי נטילת הקואורדינטה x והתעלמות מהקואורדינטה y). תהי הפונקציה X:E(𝔽p2){𝒪}𝔽p2 המוגדרת כדלהלן: X(𝒪)=𝒪,X(x,y)=x.

המפתח הציבורי והמפתח הפרטי מומרים ממחרוזות בתים לאלמנטים של השדה לפי סדר בתים קטן. במילים אחרות כל שלם s{0,1,...,22561} מיוצג כך:

s=(s mod 256,s/256 mod 256,...,s/25631 mod 256).

קבוצת כל המפתחות הציבוריים האפשריים היא {q:q{0,1,...,22561}}. קבוצת כל מפתחות הפרטיים היא {n:n2254+8{0,1,2,3,...,22511}}. הפונקציה Curve25519 מוגדרת כך:

Curve25519:{Curve25519 secret key}×{Curve25519 public key}{Curve25519 public key}.

בהינתן n ו-q קיים שלם ייחודי s{0,1,2,...,225520} כך שמתקיים s=X0(nQ) עבור כל QE(𝔽p2) כאשר X0(Q)=q mod 225519. לסיום הפונקציה Curve25519(n,q) מחזירה את s האמור.

פסאודו קוד

הפונקציה Curve25519  בפסאודו קוד הבא מבוססת על סולם מונטגומרי. היא מקבלת את השלם k (שהוא הסוד הפרטי של המשתמש) ואת הקואורדינטה u (מקבילה ל-x בעקום מונטגומרי) של הנקודה הקבועה P בעקום 25519 ומחזירה את x2 שהוא הקואורדינטה x של הכפל הסלקרי kP.

Curve25519(k,u)
x1=x3=u
x2=z3=1
z2=0
s=0 // boolean
For t=254 Down to 0 do:
{
kt=(kt) AND 1
s=skt
(x2,x3)=ConditionalSwap(s,x2,x3)
(z2,z3)=ConditionalSwap(s,z2,z3)
A=x2+z2
B=x2z2
E=A2B2
C=x3+z3
D=x3z3
x3=(DA+CB)2
z3=x1(DACB)2
x2=A2B2
z2=E(A2+121665E)
}
(x2,x3)=ConditionalSwap(s,x2,x3)
(z2,z3)=ConditionalSwap(s,z2,z3)
Return x2(z2(p2))

הסמל כאן מייצג הזזה ימינה (shift right) ברמת סיביות,  AND הוא וגם והסמל הוא XOR. הפונקציה ConditionalSwap(s,a,b) היא פונקציית החלפה שמקבלת פרמטר בוליאני s ומחליפה בין ערכי a ו-b בתנאי ש-s שווה אמת. הפונקציה חייבת להיות מיושמת באופן כזה שההחלפה תהיה קבועה תמיד כדי לסכל התקפת ערוץ צדדי. אפשר ליישם זאת על ידי הוספת מסכת אחדים לפי s, למשל mask(s)=0s, אם s=0 התוצאה תהיה כאילו לא בוצעה החלפה. אם dummy הוא משתנה מקומי, אז ההחלפה מתבצעת בשלושה מהלכים ללא תנאי כך:

dummy=mask(s) AND (ab)
a=adummy
b=bdummy

קישורים חיצוניים

הערות שוליים