פרוטוקול דיפי-הלמן

בקריפטוגרפיה, פרוטוקול דיפי־הלמן (Diffie-Hellman) הוא פרוטוקול שיתוף המפתח הראשון, שהוצע על ידי ויטפילד דיפי ומרטין הלמן ב־1976 כדי לפתור את בעיית הפצת המפתחות. הפרוטוקול מאפשר לשני משתתפים שלא נפגשו מעולם ואינם חולקים ביניהם סוד משותף כלשהו מראש, להעביר אחד לשני מעל גבי ערוץ פתוח (שאינו מאובטח) סוד כלשהו כך שאיש מלבדם אינו יודע מהו. הסוד יכול להיות, בהקשר של פרוטוקול תקשורת מאובטח, מפתח הצפנה. 

פרוטוקול דיפי־הלמן מתמודד עם בעיית הפצת המפתחות על ידי פונקציה חד-כיוונית. בעזרת הפונקציה ניתן להכין מפתח שיחה ארעי (באנגלית: ephemeral key) שיהיה משותף גם לצד השני של השיחה, ולאחר מכן התקשורת יכולה להיות מוצפנת באמצעות מפתח זה עם צופן סימטרי לפי בחירה כמו AES. בגמר השימוש בו המפתח מושמד. אם כל המפתחות בפרוטוקול הם חד־פעמיים ולא חוזרים להשתמש בהם שוב, הרי שהפרוטוקול מספק סודיות מושלמת קדימה במובן שמרגע שהמפתח הושמד אין שום דרך לשחזר אותו, אפילו אם בעתיד תתגלה דרך יעילה לפצח את הפרוטוקול.
<div class=mw-content-ltr align=center>
<math>\begin{align}K&\equiv A^b\bmod p\equiv(g^a\bmod p)^b\bmod p\\&\equiv g^{ab}\bmod p\equiv(g^b\bmod p)^a\equiv B^a\bmod p\end{align}</math>
</div>

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

==היסטוריה ורקע==
פרוטוקול דיפי הלמן הוצג ב־1976 על ידי ויטפילד דיפי ומרטין הלמן במאמר "כיוונים חדשים בהצפנה"<sup>[*]</sup>, המהווה ציון דרך בתולדות ההצפנה המודרנית. במאמר הציגו דיפי והלמן רעיון מהפכני לאותה עת - המפתח הפומבי. הם הראו איך אפשר לפתור את בעיית העברת מפתח הידועה מבלי שהמשתתפים ייאלצו להיפגש כלל. כמו כן הראו לראשונה כיצד ניתן ליישם חתימה דיגיטלית בעזרת מפתח פומבי. הרעיונות שהציגו הובילו לאחר מכן להמצאות נוספות בתחום זה, כמו RSA, צופן אל-גמאל, חתימת אל-גמאל וכן DSA. במרץ 2016 הודיעה ACM שדיפי והלמן הם חתני פרס טיורינג לשנת 2015 עבור עבודתם זו.

==תיאור הפרוטוקול==
הכנה חד־פעמית: 
להלן תיאור הפרוטוקול בשדה ראשוני. המשתתפים בפרוטוקול אליס ובוב מסכמים ביניהם באופן גלוי על מספר ראשוני <math>p</math> גדול כך שפתרון בעיית הלוגריתם הבדיד בחבורה הכפלית <math>\mathbb{F}_p^*</math> יהיה קשה. ויוצר <math>g</math> של <math>\mathbb{F}_p^*</math> (דוגמה בהמשך). אם <math>p</math> ראשוני לשדה <math>\mathbb{F}_p</math> יש <math>\phi(p-1)</math> יוצרים כאשר <math>\phi</math> היא פונקציית אוילר. בחירת יוצר יכולה להתבצע תוך דגימה אקראית והסיכויים גבוהים למצוא יוצר תוך מספר ניסיונות קצר. אליס בוחרת ערך אקראי סודי <math>a</math> כאשר <math>0<a<p-1</math> ומחשבת את <math>A=g^a\bmod p</math> אותו היא שולחת לבוב. באופן דומה בוב בוחר ערך אקראי סודי <math>b</math> כאשר <math>0<b<p-1</math> ומחשב את <math>B=g^b\bmod p</math> אותו הוא שולח לאליס. בהינתן <math>a,B</math> אליס מחשבת את המפתח המשותף <math>K=B^a\equiv(g^b)^a\,(\!\bmod p)</math> וכן בוב באמצעות הערכים <math>b,A</math>, מחשב את <math>K=A^b\equiv(g^a)^b\,(\!\bmod p)</math>. כעת הם משתפים ביניהם את המפתח הסודי <math>K</math> בצורה בטוחה. 

אליס ובוב שידרו זה לזה את הערכים <math>A=g^a,B=g^b</math> (מודולו <math>p</math>) בהתאמה. המידע שהשיגה המצותתת איב שהאזינה למהלכי הפרוטוקול (כמתואר בתרשים), כולל את הערכים: <math>g,p,A,B</math>. כאשר הערכים <math>a</math> או <math>b</math> לא שודרו כלל. כדי לחשוף את המפתח המשותף עליה לחשב את <math>K\equiv A^b\equiv B^a\equiv g^{ab}\,(\!\bmod p)</math>. בעיה זו (חישוב <math>g^{ab}</math> מתוך <math>g^a,g^b</math> מודולו <math>p</math>), נקראת בעיית דיפי־הלמן (להלן), אם הערכים נבחרו בקפידה, הדעה הרווחת היא שאין לה פתרון קל.

כמו כן, אם איב מסוגלת לחשב את <math>a</math> מתוך הערך <math>g^a</math>, היא יכולה לחשוף את ה'סוד' של אליס ובוב. חישוב <math>a</math> מתוך <math>g^a</math> נקרא בעיית הלוגריתם הבדיד ואף היא נחשבת לבעיה קשה. מי שיכול לפתור את בעיית הלוגריתם הבדיד באופן יעיל, בוודאי יכול לפתור גם את בעיית דיפי־הלמן באופן יעיל. ההפך אינו ידוע, טרם נמצאה הוכחה לכך שהיכולת לפתור את בעיית דיפי־הלמן שקולה ליכולת לפתור את בעיית הלוגריתם הבדיד.

מסרי הפרוטוקול:
#<math>\text{Alice}\longrightarrow\text{Bob}:\quad A=g^a\bmod p</math>
#<math>\text{Alice}\longleftarrow\text{Bob}:\quad B=g^b\bmod p</math>

פעולות הפרוטוקול:
#אליס בוחרת שלם אקראי סודי <math>a</math> כאשר <math>1\le a\le p-2</math> ושולחת לבוב את מסר 1 לעיל.
#בוב בוחר שלם אקראי סודי <math>\ b</math> כאשר <math>1\le b\le p-2</math> ושולח לאליס את מסר 2 לעיל.
#בוב מקבל את <math>A</math> ומחשב את המפתח המשותף <math>K=A^b\bmod p</math>.
#אליס מקבלת את <math>B</math> ומחשבת את המפתח המשותף <math>K=B^a\bmod p</math>.

כאמור כל הפעולות מבוצעות מודולו המספר הראשוני <math>p</math>. החישוב המודולרי הכרחי לצורך בטיחות הפרוטוקול כיוון שבלעדיו, אליס משדרת את השלם <math>g^a</math>, כאשר <math>g</math> ידוע לכל. במקרה הזה בעיית הלוגריתם הבדיד קלה מאוד לפתרון, מכיוון שמספר הספרות העשרוניות הדרושות לכתיבת <math>g^a</math> קרוב למספר הספרות של <math>g</math> כשהוא מוכפל בנעלם <math>a</math>. כדי למצוא את <math>a</math> די לחלק את מספרי הספרות זה בזה. מאידך חישוב <math>a</math> מתוך השארית לאחר חילוק <math>g^a</math> ב־<math>p</math> אינו קל.

===דוגמה במספרים קטנים=== 
לצורך הדגמה בלבד, נניח שהוסכם על המספר הראשוני <math>p=1187</math> ויוצר <math>g=429</math> של החבורה הכפלית <math>\mathbb{F}_{1187}^*</math>. בחירת יוצר היא מלאכה קלה כפי שיוסבר להלן. מהלכי הפרוטוקול הם:

:אליס בוחרת ערך סודי <math>a=546</math> ומחשבת את <math>A=429^{546}\bmod1187=574</math>.
:בוב בוחר ערך סודי <math>b=358</math> ומחשב את <math>B=429^{358}\bmod1187=101</math>.
:מסר 1: אליס שולחת לבוב את המספר <math>574</math>.
:מסר 2: בוב שולח לאליס את המספר <math>101</math>.

:אליס מחשבת את המפתח המשותף:
::<math>K=101^{546}\bmod1187=730</math>,
:בוב מחשב את המפתח המשותף:
::<math>K=574^{358}\bmod1187=730</math>
:כעת בידי שניהם מפתח <math>K=730</math>.

===מציאת יוצר של החבורה הציקלית===
בחירת יוצר קלה ביותר אם ידועים הגורמים הראשוניים של סדר החבורה במקרה של הדוגמה לעיל <math>p-1=1186</math>. היות ש־<math>1187=2\cdot593+1</math> כאשר <math>593</math> ראשוני. לפי תורת החבורות היוצר יכול להיות כל ערך המקיים: <math>g^{r_i}\bmod p-1)\ne1</math> עבור כל הגורמים <math>r_i</math> של <math>p-1</math>. כלומר <math>429^2=211</math> וכן <math>429^{593}=429</math> מודולו <math>1186</math>, על כן <math>429</math> יכול לשמש כיוצר (ההסתברות שמספר אקראי יצור את החבורה היא <math>\frac{\phi(n)}{n}</math> (כאשר <math>\phi(n)</math> פונקציית אוילר). במקרה זה היות שהגורמים הם <math>p-1=2q</math> מזה נובע כי <math>\phi(p-1)=q-1</math>, לכן ההסתברות שמספר מסוים הוא יוצר היא <math>\frac{q-1}{2q}\approx\frac12</math>).

===פרוטוקול דיפי־הלמן בעקום אליפטי===
פרוטוקול דיפי־הלמן בעקום אליפטי נקרא בקיצור ECDH אנלוגי לפרוטוקול דיפי הלמן המתואר לעיל. נתונים פרמטרי התחום של העקום לפי הגדרות התקן: <math>(q,a,b,P,n,h)</math>, העקום האליפטי הוא <math>E(\mathbb{F}_q)</math> כאשר <math>q</math> הסדר של השדה <math>\mathbb{F}_q</math> וכן <math>a,b</math> מקדמים של משוואת העקום, <math>P</math> היא נקודת הבסיס, <math>n</math> הסדר הראשוני של נקודת הבסיס, <math>h</math> פקטור משלים כך שמתקיים <math>\textstyle n=\frac{|E|}{h}</math> ו־<math>|E|</math> מייצג את מספר הנקודות בעקום <math>E</math>.

המשתתפת אליס בוחרת מפתח סודי שהוא שלם אקראי <math>a</math> והמפתח הציבורי שלה יהיה <math>A=aP</math> (תוצאת כפל סקלארי של הנקודה <math>P</math> ב־<math>a</math>). בוב בוחר מפתח סודי וציבורי <math>(b,B=bP)</math> באותה דרך. כעת אם הם רוצים לשתף ביניהם את הסוד <math>K</math> הם פועלים כדלהלן:

#אליס שולחת לבוב את הנקודה <math>A</math>.
#בוב שולח לאליס את הנקודה <math>B</math>.
#אליס מחשבת את המפתח המשותף שהוא הנקודה בעקום <math>K=aB</math>.
#בוב מחשב את המפתח המשותף באופן דומה <math>K=bA</math>.

הפרוטוקול נכון כי מתקיים <math>K=aB=a(bP)=baP=b(aP)=bA</math>. לכן הנקודה <math>K</math> בעקום האליפטי היא נקודה סודית המשותפת רק לשניהם, אותה הם יכולים להמיר למפתח הצפנה.

דוגמה במספרים קטנים. נניח שאליס ובוב הסכימו ביניהם על הפרמטרים המשותפים הבאים: 
#המספר הראשוני <math>q=3851</math>,
#מקדמי משוואת העקום <math>a=324, b=1287</math>,
#העקום האליפטי <math>E:Y^2=X^3+324X+1287</math>,
#והנקודה הציבורית <math>P=(920,303)</math> מעל <math>E(\mathbb{F}_{3851})</math>.

לצורך ההתקשרות ביניהם נניח שאליס בחרה את המפתח הסודי: <math>a=1194</math> ובוב בחר את המפתח הסודי <math>y=1759</math>, כעת לפי כללי האריתמטיקה בעקום האליפטי אליס מחשבת את:
:<math>A=1194P=(2067,2178)\in E(\mathbb{F}_{3851})</math>,
בוב מחשב את:
:<math>B=1759P=(3684,3125)\in E(\mathbb{F}_{3851})</math>.

אליס שולחת לבוב את <math>A</math> ובוב שולח לאליס את <math>B</math>. לבסוף, אליס מחשבת את:
:<math>aB=1194\cdot (3684,3125)=(3347,1242)\in E(\mathbb{F}_{3851})</math>,
בוב מחשב את:
:<math>bA=1759\cdot (2067,2178)=(3347, 1242)\in E(\mathbb{F}_{3851})</math>.
כעת הם משתפים ביניהם את הנקודה הסודית <math>K=(3347,1242)</math>. מקובל להתעלם מהקואורדינטה <math>y</math> ולקחת רק את <math>a=3347</math> כערך סודי משותף.

==בעיית דיפי־הלמן==
בעיית דיפי־הלמן - Diffie-Hellman problem בקיצור DHP היא בעיה מתמטית קשה שהועלתה לראשונה על ידי ויטפילד דיפי ומרטין הלמן בהקשר של קריפטוגרפיה. הסיבה לאטרקטיביות הבעיה היא העובדה שהיא מהווה על פניה, פונקציה חד-כיוונית. ויש עניין רב בקריפטוגרפיה בפונקציות חד־כיווניות כיוון שהן הבסיס המתמטי למרבית האלגוריתמים האסימטריים. פונקציה חד־כיוונית מאפשרת ביצוע תהליך הצפנה שהוא קל יחסית בכיוון אחד אבל קשה בכיוון ההפוך, דהיינו פענוח. אלא אם כן קיים מידע נסתר בידי המפענח שמקל על מלאכתו. המידע הנסתר קרוי מפתח פענוח או מפתח פרטי. 

בעיית דיפי־הלמן היא כדלהלן:

:נתונים ראשוני <math>\boldsymbol p</math>, יוצר <math>\boldsymbol g</math> של החבורה <math>\boldsymbol\mathbb{Z}^{*}_p</math> והערכים <math>\boldsymbol g^x</math> ו־<math>\boldsymbol g^y</math>, מצא את <math>\boldsymbol g^{xy}</math>?

באופן פורמלי <math>g</math> הוא יוצר של חבורה ציקלית (מעל שדה סופי מסדר ראשוני, שדה בינארי מורחב או מעל עקום אליפטי) והערכים <math>x</math> ו־<math>y</math> שלמים אקראיים כלשהם.

==ביטחון==
ביטחון פרוטוקול דיפי־הלמן מסתמך על ההשערה שקשה לפתור את בעיית דיפי־הלמן או את בעיית הלוגריתם הדיסקרטי בחבורות מסוימות יותר מהעלאה בחזקה. מסיבה זו חשוב לבחור חבורה מתאימה כי בחבורות מסוימות פתרון הבעיות הללו עלול להיות טריוויאלי או קל במידה ניכרת. החבורות העיקריות הידועות כיום כבטוחות לשימוש הן חבורה כפלית המבוססת על:
*שדה סופי מסדר ראשוני גדול <math>\mathbb{Z}^{*}_p</math>
*שדה בינארי מורחב <math>\mathbb{F}_{2^m}</math>. כאשר <math>m</math> גדול.
*עקום אליפטי מעל שדה ראשוני.
 
הוכח שהקושי בפתרון בעיית הלוגריתם הבדיד תלוי בגורם הראשוני הגדול ביותר של סדר החבורה (אם סדר החבורה ראשוני, הכוונה לסדר החבורה פחות 1). בעיקרון שיטת כוח גס, דהיינו ניסוי כל האפשרויות עד למציאת פתרון אינה יעילה. קיימים אלגוריתמים מהירים שמוצאים פתרון בזמן קצר יותר מכוח גס. ניתן למנות כמה מהם: תחשיב אינדקסים, אלגוריתם רו של פולרד, אלגוריתם צעד-קטן צעד-גדול של דייוויד שנקס, אלגוריתם נפת שדה המספרים ועוד. האחרון נחשב לאלגוריתם הטוב ביותר לפתרון בעיית הלוגריתם הבדיד והוא פועל בזמן ריצה תת־מעריכי, מסדר גודל של <math>L_q[1/3,(64/9)^{1/3}]</math>. על כל פנים הממצאים בתחום עדיין לא שלמים. 

תקן SP 800-57 של NIST (גרסה 3 - יולי 2012) משווה בין החוזק של אלגוריתמים סימטריים ואלגוריתמים אסימטריים המקבילים להם. המלצות התקן גורסות שהראשוני <math>p</math> צריך להיות בגודל בין 1024 סיביות ל־15,360 סיביות בהתאם לחוזק אלגוריתמים סימטריים המקבילים (בין 80 סיביות ל־256 סיביות). למשל להשגת חוזק זהה לאלגוריתם AES עם מפתח בגודל 128 סיביות יש לבחור ראשוני באורך 3,072 סיביות. מעל קבוצת הנקודות בעקום אליפטי התקן ממליץ על טווח אורכים בין 160 ל־512 סיביות. הסיבה היא שהאלגוריתמים הטובים ביותר הידועים, אינם ישימים בעקום אליפטי.

פרוטוקול דיפי הלמן ניתן לשינוי באופן שיספק גם אימות זהויות, על ידי קביעת הערכים <math>g^x</math> ו־<math>g^y</math> מודולו <math>\ p</math> כמפתחות ציבוריים של כל משתמש ואז על ידי חתימה על המפתחות (באמצעות סרטיפיקט) ניתן להבטיח את שייכותם לכל משתמש בהתאמה. פרוטוקול MQV הוא דוגמה טובה להרחבה של פרוטוקול דיפי הלמן המספקת גם אימות זהויות עקיף.

פרוטוקול דיפי הלמן אינו מבטיח למשתתפים הגנה על אופן בחירת המפתח ואינו מונע שליטה חד צדדית. למעשה אחד הצדדים יכול בקלות להשפיע על אופן בחירת המפתח על ידי בחירת <math>\ x</math> או <math>\ y</math> קטנים במכוון. לדוגמה אם המעריך <math>x = 0</math> המפתח הסודי המשותף <math>K</math> יהיה <math>g^y</math>. באופן דומה הפרוטוקול פגיע במיוחד להתקפה הבאה: אם <math>\ p = Rq + 1</math> (כאשר <math>\ R</math> קטן כגון <math>\ R = 2</math> ו־<math>q</math> ראשוני), אזי <math>h= g^q = g^{(p - 1)/R}</math> הוא מסדר <math>\ R</math> (ואז <math>h= -1</math>). תוקף אקטיבי יכול להחליף את המסרים ששלחו המשתתפים בערכים <math>\ (g^x)^q</math> וכן <math>\ (g^y)^q</math> בהתאמה, בכך לגרום למפתח המשותף להיות <math>K = g^{xyq} = h^{xy}</math>. וכתוצאה <math>\ K</math> יהיה בטווח <math>\ 1</math> או <math>\ -1</math>. 

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

===התקפת אדם באמצע===

נניח שהמצותתת איב אינה רק צופה פאסיבית אלא ביכולתה ליירט ולשנות מסרים בעודם בדרכם ליעדם מבלי שהמתקשרים הלגיטימיים יבחינו בכך. מצב כזה אפשרי בכל ערוץ תקשורת שאינו מאומת באופן קריפטוגרפי. במקרה כזה איב יכולה לבצע התקפה הידועה בשם התקפת האדם באמצע באופן הבא: כזכור אליס מעוניינת לשלוח לבוב את המפתח הציבורי שלה <math>A=g^a</math> (כאשר <math>a</math> הוא המפתח הפרטי) ובוב מעוניין לשלוח לאליס את המפתח הציבורי שלו <math>B=g^b</math>. איב תחילה מכינה מפתחות משלה, נניח <math>E=g^e</math>, ואז כאשר הם מתקשרים ביניהם היא מיירטת את המסרים מאליס לבוב ומבוב לאליס ומחליפה אותם ב־<math>E</math>. כעת איב משתפת עם אליס ועם בוב בנפרד את המפתחות <math>A^e</math> ו־<math>B^e</math> בהתאמה בעוד שהם מאמינים כי הם שיתפו את המפתחות <math>B^a</math> ו־<math>A^b</math> בהתאמה, כמתואר בתרשים. 
התקפת אדם באמצע על פרוטוקול דיפי־הלמן

כעת אם אליס או בוב ישלחו זה לזה מסר מוצפן כלשהו עם מפתח ההצפנה <math>E^a</math> או <math>E^b</math> בהתאמה, איב יכולה ליירטו ולפענחו עם המפתח הפרטי המתאים שברשותה <math>A^e</math> או <math>B^e</math> בהתאמה. יתרה מזו, כדי שהמתקשרים הלגיטמיים לא יבחינו במתרחש היא חוזרת ומצפינה את המסר עם המפתח הפרטי שהיא שיתפה עם הצד השני ושולחת אותו ליעדו כאילו כלום לא קרה. כדי לסכל התקפה כזו על המתקשרים לאמת בדרך כלשהי את המסרים העוברים ביניהם, גם כדי להבטיח כי הגיעו מהמקור שהם סבורים וכן שהמסרים לא שונו באופן זדוני בדרכם ליעדם. מסיבה זו אימות והבטחת שלמות הם נושאים קריטיים באבטחת מידע. פרוטוקול MQV מספק מענה חלקי לבעיה. אפשר כמובן לחתום על כל המסרים עם החתימה הדיגיטלית המתאימה של כל צד.

==הכללות==
במקום לעבוד בחבורה הכפלית של המספרים מודולו הראשוני <math>p</math> (שהיא חבורת אוילר של <math>p</math>), אפשר לעבוד בכל חבורה ציקלית אחרת. השותפים צריכים לפרסם את החבורה <math>G</math> ואת האיבר <math>a</math>, ואז לחזור על התהליך כמתואר לעיל. הבעיות הניצבות בפני המאזין הסמוי נקראות 'בעיית דיפי־הלמן' ו'בעיית הלוגריתם הבדיד' בחבורה <math>G</math>, בהתאמה.

==ראו גם==
* MQV
* חתימה דיגיטלית
* מפתח ציבורי
* החלפת מפתחות קוונטית

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

* [http://crypto.csail.mit.edu/classes/6.857/papers/diffie-hellman.pdf "כיוונים חדשים בהצפנה"], מאמרם המפורסם של ויטפילד דיפי ומרטין הלמן, אוניברסיטת סטנפורד, קליפורניה (1976)
* 

קטגוריה:קריפטוגרפיה
קטגוריה:מפתח ציבורי