עקום 25519

בקריפטוגרפיה, עקום 25519 (באנגלית: Curve25519) הוא כינוי לעקום אליפטי מסוים המיועד לשימוש ביחד עם פונקציית דיפי-הלמן בעקום אליפטי (בקיצור ECDH), כחלק מפרוטוקול שיתוף מפתח המבוסס על דיפי-הלמן. העקום מספק ביטחון ברמה של 128 סיביות (גודל מפתח של 256 סיביות) ומהירות ביצוע גבוהה במיוחד. זהו אחד מהעקומים המהירים ביותר הקיימים כיום, הוא אינו מוגן בפטנט וקוד הייחוס שלו הוא נחלת הכלל. העקום פופולרי מאוד כיום ונמצא בשימוש מעשי נרחב ביישומי אבטחה רבים, במיוחד באבטחת מסרים מיידיים. עקום 25519 פותח ב-2005 על ידי דניאל ברנשטיין שקרא לו בתחילה פונקציית DH. מאוחר יותר הציע לקרוא לעקום בשם זה בשל מבנהו המסתמך על המספר הראשוני 2 255 − 19 {\displaystyle 2^{255}-19} ופונקציית דיפי הלמן נקראה X25519 בהתאם. יתרונות עקום 25519 הם: מהירות מאוד גבוהה על מגוון מעבדים נפוצים. הגנה מפני התקפת תיזמון. פעולות הכפל והחיבור צורכות זמן קבוע. מפתחות סודיים ומפתחות ציבוריים קצרים, רק 32 בתים (256 סיביות). אימות מפתח מיותר. אין צורך לוודא שהמפתח תקף. מימוש קצר בתוכנה. העקום Curve25519 הוא עקום מונטגומרי מעל ההרחבה הריבועית של השדה הראשוני המוגדר על ידי המספר הראשוני 2 255 − 19 {\displaystyle 2^{255}-19} יחד עם נקודת בסיס קבועה x = 9 {\displaystyle x=9} ונוסחתו היא: y 2 = x 3 + 486662 x 2 + x {\displaystyle y^{2}=x^{3}+486662x^{2}+x} . פרוטוקול דיפי הלמן בעקום זה משתמש בגרסה "דחוסה", שבה מתייחסים רק לקואורדינטה x {\displaystyle x} של הנקודה, מה שמאפשר להשתמש באלגוריתם סולם מונטגומרי (המתואר להלן) כדי לבצע כפל נקודות בעקום תוך שימוש במה שקרוי קוארודינטות פרויקטיביות. עקום זה הוא גרסה מפותלת של עקום אליפטי ממשפחת עקומי אדוארד שהם עקומים אליפטיים מיוחדים הנקראים על שם המתמטיקאי הרולד אדוארד שחקר אותם ב-2007. עקום אדוארד מפותל מעל השדה K {\displaystyle \mathbb {K} } שהמציין שלו אינו 2 הוא מישור אפיני המוגדר על ידי המשוואה: E E a , d : a x 2 + y 2 = 1 + d x 2 y 2 {\displaystyle E_{E_{a,d}}:ax^{2}+y^{2}=1+dx^{2}y^{2}} כאשר a {\displaystyle a} ו- d {\displaystyle d} הם אלמנטים שונים של K {\displaystyle \mathbb {K} } . אם a = 1 {\displaystyle a=1} מתקבל עקום אדוארד. עקום זה שקול בירציונלית לעקום מונטגומרי שהוא סוג אחר של עקום אליפטי שהיתרון שלו הוא ביכולת לבצע חישובי כפל וחיבור נקודות ביעילות בייצוג פרויקטיבי. בשיטה זו הנקודה P = ( x , y ) {\displaystyle P=(x,y)} מיוצגת על ידי ( X : Z ) {\displaystyle (X:Z)} כאשר x = X / Z {\displaystyle x=X/Z} (לדוגמה יכול להיות Z = 1 {\displaystyle Z=1} ). בשיטת ייצוג זו הנקודה מאבדת מידע בשל העובדה שהקואורדינטה y {\displaystyle y} אינה משתתפת בחישובים לכן לא יהיה הבדל בין P {\displaystyle P} ל- − P {\displaystyle -P} , אך יתרונה הוא בכך שכפל נקודות הופך להיות קל ולצורך חישובי דיפי-הלמן צריך רק את הקואורדינטה x {\displaystyle x} . לפי נוסחת מונטגומרי נדרשים בדיוק 4 ריבועים, כפל אחד ב- ( A − 2 ) / 4 {\displaystyle (A-2)/4} , בנוסף ל-5 פעולות כפל נוספות ו-8 פעולות חיבור/חיסור. האלגוריתם פועל כדלהלן. בהינתן מספר ראשוני p ≥ 5 {\displaystyle p\geq 5} ושלם A {\displaystyle A} כך ש- A 2 − 4 {\displaystyle A^{2}-4} אינו מספר ריבועי מודולו p {\displaystyle p} . ויהי E : y 2 = x 3 + A x 2 + x {\displaystyle E:y^{2}=x^{3}+Ax^{2}+x} עקום אליפטי מעל השדה F p {\displaystyle F_{p}} . יהי X : E ( F p 2 ) → { O } ∪ F p 2 {\displaystyle X:E(F_{p^{2}})\rightarrow \{{\mathcal {O}}\}\cup F_{p^{2}}} כדלהלן: X ( O ) = O , X ( x , y ) = x {\displaystyle X({\mathcal {O}})={\mathcal {O}},X(x,y)=x} (הסמל O {\displaystyle {\mathcal {O}}} מייצג את הנקודה באינסוף). בהינתן x , z ∈ F p {\displaystyle x,z\in F_{p}} כאשר ( x , z ) ≠ ( 0 , 0 ) {\displaystyle (x,z)\neq (0,0)} השוויון הבא מתקיים: אז X ( 2 Q ) = x 2 / z 2 {\displaystyle X(2Q)=x_{2}/z_{2}} עבור כל Q ∈ E ( F p 2 ) {\displaystyle Q\in E(F_{p^{2}})} כך שמתקיים X ( Q ) = x / z {\displaystyle X(Q)=x/z} . כאן הביטוי x / z {\displaystyle x/z} פירושו המנה של x {\displaystyle x} ו- z {\displaystyle z} בשדה F p {\displaystyle F_{p}} אם z ≠ 0 {\displaystyle z\neq 0} . אם x = 0 {\displaystyle x=0} התוצאה היא O {\displaystyle {\mathcal {O}}} וכן אם x = z = 0 {\displaystyle x=z=0} התוצאה אינה מוגדרת. בעקום 25519 לכל משתמש מפתח סודי באורך 32 בתים ומפתח ציבורי באורך 32 בתים. כל זוג משתמשים משתפים "סוד" באורך 32 בתים שממנו הם יכולים לייצר מפתחות לאימות והצפנה של חילופי המסרים ביניהם. העקום 25519 ונקודת הבסיס 9 הם פרמטרים ציבוריים וידועים לכל, כולל למתקיפה פוטנציאלית. המפתח הפרטי של אליס הוא השלם a {\displaystyle a} שיכול להיות כל מחרוזת אקראית של 32 בתים והמפתח הפרטי של בוב הוא b {\displaystyle b} . אליס שולחת לבוב את המפתח הציבורי שלה Curve 25519 ( a , 9 ) {\displaystyle {\text{Curve}}25519(a,9)} . הפונקציה Curve 25519 {\displaystyle {\text{Curve}}25519} מקבלת שלם כלשהו n {\displaystyle n} ונקודה Q {\displaystyle Q} בעקום 25519 ומחזירה את n Q {\displaystyle nQ} . בוב שולח לאליס את המפתח הציבורי שלו Curve 25519 ( b , 9 ) {\displaystyle {\text{Curve}}25519(b,9)} . הסוד המשותף הוא: Curve 25519 ( a , Curve 25519 ( b , 9 ) ) = Curve 25519 ( b , Curve 25519 ( a , 9 ) ) {\displaystyle {\text{Curve}}25519(a,{\text{Curve}}25519(b,9))={\text{Curve}}25519(b,{\text{Curve}}25519(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++‎ ועוד רבים. בין הפרוטוקולים, האפלקציות ומערכות ההפעלה המשתמשים בעקום זה נמנים: Viber וואטסאפ iOS מדמה מסוף PuTTY. OpenBSD Google Allo פרוטוקול סיגנל Tor OpenSSH Messenger של פייסבוק Threema (תוכנת מסרים מיידיים) Cryptocat (תוכנת צ'אט) GNU Privacy Guard תחליף ל-OpenPGP DNSCrypt הביטחון של העקום הזה נחשב גבוה, כלומר לא קיימת דרך לחשיפת הסוד המשותף מתוך שני המפתחות הציבוריים שהיא טובה יותר מכוח גס בסיבוכיות של 2 128 {\displaystyle 2^{128}} . הבעיה הכללית עליה הוא מבוסס, בעיית דיפי הלמן בעקום אליפטי נחקרה באופן אינטנסיבי מזה כשני עשורים והותקפה רבות על ידי מתמטיקאים, אנליסטים והאקרים ללא הצלחה. עקום 25519 מכיל מספר תכונות שמעניקות לו יתרון, הסדר שלו הוא מעל 2 255 {\displaystyle 2^{255}} , הוא אינו מכיל מאפיינים אלגבריים ייחודיים שניתנים לניצול לקיצור ההתקפה נגדו. האלגוריתמים הידועים כמו אלגוריתם רו או אלגוריתם קנגורו של פולרד ואלגוריתם פוליג-הלמן יעילים רק נגד עקומים מסדר ראשוני נמוך יותר ולכן אינם פרקטיים נגד עקום 25519. היתרון של עקום 25519 הוא באופן המימוש שלו. אפשר לנצל את יחידת הנקודה הצפה בקיצור FPU של המעבד כדי להאיץ ביצועים של פעולות כפל וחיבור בסיסיות באופן משמעותי. הסיבה לבחירה של הראשוני 2 255 − 19 {\displaystyle 2^{255}-19} נובעת בגלל היכולת לייצג אלמנטים של השדה בצורה פולינומית ולבצע חיבור וכפל במהירות. הפולינומים נבחרו כך שיענו על שני מאפיינים חשובים, שהמעלה שלהם תהיה נמוכה (לכל היותר 9) כך שיהיו פחות מקדמים שצריך לכפול כחלק מהכפל בפולינומים וכן, כל מקדם הוא כפולה קטנה של 2 ⌈ 25.5 i ⌉ {\displaystyle 2^{\lceil 25.5i\rceil }} . ביתר פירוט הפולינומים עם מספר מופחת של מקדמים קטנים הם מהצורה: u 0 + u 1 x + u 2 x 2 + ⋯ + u 9 x 9 {\displaystyle u_{0}+u_{1}x+u_{2}x^{2}+\cdots +u_{9}x^{9}} כאשר u i {\displaystyle u_{i}} הוא כפולה שלמה של 2 ⌈ 25.5 i ⌉ {\displaystyle 2^{\lceil 25.5i\rceil }} . u i / 2 ⌈ 25.5 i ⌉ ∈ { − 2 25 , − 2 25 + 1 , . . . , − 1 , 0 , 1 , . . . , 2 25 − 1 , 2 25 } {\displaystyle u_{i}/2^{\lceil 25.5i\rceil }\in \{-2^{25},-2^{25}+1,...,-1,0,1,...,2^{25}-1,2^{25}\}} כאן הפולינום ∑ i u i x i {\displaystyle \textstyle \sum _{i}u_{i}x^{i}} מייצג את השלם u 0 + u 1 + ⋯ + u 9 {\displaystyle u_{0}+u_{1}+\cdots +u_{9}} שהוא בעצם פיצול של שלם באורך 256 סיביות לעשרה שלמים באורך 26 סיביות כל אחד בקירוב, כדי שיתאימו באורכם לאוגרי הנקודה הצפה המצויים בכל מעבד. כל שלם באורך 256 סיביות ניתן לטעינה בתשעה אוגרים. בדרך כלל במעבדים מודרניים אוגרים אילו מצויים בשפע. השימוש בבסיס 25.5 ולא בבסיס 25 או 26 נובע מסיבות של יעילות כדי להימנע מחילוק ארוך במקדמים x 10 {\displaystyle x^{10}} ו- x 11 {\displaystyle x^{11}} וכן להימנע מכפל המקדמים ב- 2 5 ⋅ 19 {\displaystyle 2^{5}\cdot 19} במקום ב-19. חיבור/חיסור שני פולינומים של עקום 25519 מודולו 2 255 − 19 {\displaystyle 2^{255}-19} מצריך 10 פעולות חיבור/חיסור של מספרי נקודה צפה (fp). כל פעולת חיבור/חיסור צורכת 10 פקודות fp בסיסיות, בלולאה הראשית של הפונקציה Curve25519 מתבצעים בסך הכול 20,400 פקודות fp. פעולת כפל צורכת 100 פקודות fp עבור כפל ו-81 פקודות fp עבור חיבור. המקדמים הגבוהים x 10 , x 11 , . . . , x 18 {\displaystyle x^{10},x^{11},...,x^{18}} לאחר תוצאת הכפל מצומצמים מודולו 2 255 x 10 − 19 {\displaystyle 2^{255}x^{10}-19} . למשל המקדם x 18 {\displaystyle x^{18}} מוכפל ב- 19 ⋅ 2 255 {\displaystyle 19\cdot 2^{255}} ומחובר למקדם x 8 {\displaystyle x^{8}} . כל צמצום דורש פקודת fp אחת לכפל ופקודת fp אחת לחיבור. החלק הגבוה (הכפולה הקרובה ביותר לחזקה של 2) של כל מקדם מחוסר ומחובר למקדם שלפניו. כל העברה כזו צורכת בסך הכול 4 פקודות fp. כך שלצורך הצמצום המודולרי נדרשים עוד כ-60 פקודות fp. כתיבת הקוד עדיפה באסמבלי כדי להימנע מתקורה מיותרת שעלולה לקרות ביישום בשפת C. ראוי לציין שכאשר מחשב קוונטי לשימוש כללי בקנה מידה גדול יהיה מעשי, ניתן יהיה לפתור את בעיית דיפי הלמן בעקום 25519 ובעקומים אליפטיים אחרים בקלות רבה ולכן הפרוטוקול לא יהיה בטוח לשימוש במקרה כזה. הפונקציה Curve25519 היא בעצם כפל סקלרי של הקואורדינטה x ∈ F p {\displaystyle x\in F_{p}} מעל העקום E ( F p 2 ) {\displaystyle E(F_{p^{2}})} , כאשר p {\displaystyle p} הוא המספר הראשוני 2 255 − 19 {\displaystyle 2^{255}-19} ו- E {\displaystyle E} הוא העקום האליפטי y 2 = x 3 + 486662 x 2 + x {\displaystyle y^{2}=x^{3}+486662x^{2}+x} . ביתר פירוט, השדה F p 2 {\displaystyle \mathbb {F} _{p^{2}}} מוגדר כקבוצת כל האלמנטים ( Z / ( 2 255 − 19 ) ) [ 2 ] {\displaystyle (Z/(2^{255}-19))[{\sqrt {2}}]} . תהי הפונקציה X 0 : E ( F p 2 ) → F p 2 {\displaystyle X_{0}:E(\mathbb {F} _{p^{2}})\rightarrow \mathbb {F} _{p^{2}}} מוגדרת כדלהלן: X 0 ( O ) = 0 , X 0 ( x , y ) = x {\displaystyle X_{0}({\mathcal {O}})=0,X_{0}(x,y)=x} . במילים אחרות X 0 {\displaystyle X_{0}} היא פונקציה שממירה נקודה בעקום לאלמנט בשדה (פשוט על ידי נטילת הקואורדינטה x {\displaystyle x} והתעלמות מהקואורדינטה y {\displaystyle y} ). תהי הפונקציה X : E ( F p 2 ) → { O } ∪ F p 2 {\displaystyle X:E(\mathbb {F} _{p^{2}})\rightarrow \{{\mathcal {O}}\}\cup \mathbb {F} _{p_{2}}} המוגדרת כדלהלן: X ( O ) = O , X ( x , y ) = x {\displaystyle X({\mathcal {O}})={\mathcal {O}},X(x,y)=x} . המפתח הציבורי והמפתח הפרטי מומרים ממחרוזות בתים לאלמנטים של השדה לפי סדר בתים קטן. במילים אחרות כל שלם s ∈ { 0 , 1 , . . . , 2 256 − 1 } {\displaystyle s\in \{0,1,...,2^{256}-1\}} מיוצג כך: s = ( s  mod  256 , ⌊ s / 256 ⌋  mod  256 , . . . , ⌊ s / 256 31 ⌋  mod  256 ) {\displaystyle s=(s{\text{ mod }}256,\lfloor s/256\rfloor {\text{ mod }}256,...,\left\lfloor s/256^{31}\right\rfloor {\text{ mod }}256)} . קבוצת כל המפתחות הציבוריים האפשריים היא { q : q ∈ { 0 , 1 , . . . , 2 256 − 1 } } {\displaystyle \{q:q\in \{0,1,...,2^{256}-1\}\}} . קבוצת כל מפתחות הפרטיים היא { n : n ∈ 2 254 + 8 { 0 , 1 , 2 , 3 , . . . , 2 251 − 1 } } {\displaystyle \{n:n\in 2^{254}+8\{0,1,2,3,...,2^{251}-1\}\}} . הפונקציה Curve25519 מוגדרת כך: Curve 25519 : { Curve25519  secret key } × { Curve25519  public key } → { Curve25519  public key } {\displaystyle {\text{Curve}}25519:\{{\text{Curve25519 }}{\text{secret key}}\}\times \{{\text{Curve25519 }}{\text{public key}}\}\rightarrow \{{\text{Curve25519 }}{\text{public key}}\}} . בהינתן n {\displaystyle n} ו- q {\displaystyle q} קיים שלם ייחודי s ∈ { 0 , 1 , 2 , . . . , 2 255 − 20 } {\displaystyle s\in \{0,1,2,...,2^{255}-20\}} כך שמתקיים s = X 0 ( n Q ) {\displaystyle s=X_{0}(nQ)} עבור כל Q ∈ E ( F p 2 ) {\displaystyle Q\in E(\mathbb {F} _{p^{2}})} כאשר X 0 ( Q ) = q  mod  2 255 − 19 {\displaystyle X_{0}(Q)=q{\text{ mod }}2^{255}-19} . לסיום הפונקציה Curve 25519 ( n , q ) {\displaystyle {\text{Curve}}25519(n,q)} מחזירה את s {\displaystyle s} האמור. הפונקציה Curve25519  {\displaystyle {\text{Curve25519 }}} בפסאודו קוד הבא מבוססת על סולם מונטגומרי. היא מקבלת את השלם k {\displaystyle k} (שהוא הסוד הפרטי של המשתמש) ואת הקואורדינטה u {\displaystyle u} (מקבילה ל- x {\displaystyle x} בעקום מונטגומרי) של הנקודה הקבועה P {\displaystyle P} בעקום 25519 ומחזירה את x 2 {\displaystyle x_{2}} שהוא הקואורדינטה x {\displaystyle x} של הכפל הסלקרי k P {\displaystyle kP} . הסמל ≫ {\displaystyle \gg } כאן מייצג הזזה ימינה (shift right) ברמת סיביות,  AND {\displaystyle {\text{ AND}}} הוא וגם והסמל ⊕ {\displaystyle \oplus } הוא XOR. הפונקציה ConditionalSwap ( s , a , b ) {\displaystyle {\text{ConditionalSwap}}(s,a,b)} היא פונקציית החלפה שמקבלת פרמטר בוליאני s {\displaystyle s} ומחליפה בין ערכי a {\displaystyle a} ו- b {\displaystyle b} בתנאי ש- s {\displaystyle s} שווה אמת. הפונקציה חייבת להיות מיושמת באופן כזה שההחלפה תהיה קבועה תמיד כדי לסכל התקפת ערוץ צדדי. אפשר ליישם זאת על ידי הוספת מסכת אחדים לפי s {\displaystyle s} , למשל mask ( s ) = 0 − s {\displaystyle {\text{mask}}(s)=0-s} , אם s = 0 {\displaystyle s=0} התוצאה תהיה כאילו לא בוצעה החלפה. אם dummy {\displaystyle {\text{dummy}}} הוא משתנה מקומי, אז ההחלפה מתבצעת בשלושה מהלכים ללא תנאי כך: dummy = mask ( s )  AND  ( a ⊕ b ) {\displaystyle {\text{dummy}}={\text{mask}}({\text{s}}){\text{ AND }}(a\oplus b)} a = a ⊕ dummy {\displaystyle a=a\oplus {\text{dummy}}} b = b ⊕ dummy {\displaystyle b=b\oplus {\text{dummy}}} אתר האינטרנט הרשמי של עקום 25519 A state-of-the-art Diffie-Hellman function 25519 naming