MQV

MQV (קיצור של Menezes-Qu-Vanstone) הוא פרוטוקול שיתוף מפתח קריפטוגרפי עם אימות, שפותח ב-1998 על ידי אלפרד מנזס וסקוט ונסטון מאוניברסיטת ווטרלו, מינגהו קו מחברת Certicom, בשיתוף עם לורי לאו וג'רי סולינס מה-NSA. פרוטוקול MQV מבוסס על פרוטוקול דיפי-הלמן, הוא היעיל ביותר מסוגו וניתן להפעילו בכל חבורה ציקלית סופית, במיוחד בחבורת עקום אליפטי (במקרה זה מסומן בקיצור ECMQV). כמו כן קיימות שתי וריאציות נוספות של הפרוטוקול; העברת מפתח מאומת במהלך יחיד, המתאים לסביבה בה רק צד אחד מקוון וכן העברת מפתח בשלושה מהלכים המספק אימות דו צדדי.

הפרוטוקול מפורט בתקן SEC 1 של איגוד SECG (שנוסד על ידי סרטיקום) ושולב בתקן IEEE P1363, בתקנים ANSI X9.63, X9.42 וכן RFC-5656 של IETF. כמו כן נכלל על ידי NSA בחבילה הקריפטוגרפית Suit B לפי המלצות NIST SP 800-56A. ייתכן שכמה מגרסאות הפרוטוקול מוגנות בפטנט. גרסאות מתקדמות של הפרוטוקול אטרקטיביות במיוחד להצפנת תקשורת אלחוטית ברשתות מקומיות כמו IEEE 802.11 או לטווחים בינוניים כמו WiMAX, כאשר משתמשי הקצה הם בדרך כלל מכשירים המוגבלים במשאבים וברוחב פס.

==רקע==
===פרוטוקול שיתוף מפתח===

מאז המצאת המפתח הציבורי על ידי דיפי והלמן ופתרון בעיית הפצת המפתחות פותחו מספר פרוטוקולים קריפטוגרפיים להעברת מפתח סודי. כללית קיימים שני סוגים של שיתוף או הקמה (Key establishment) של מפתחות הצפנה; פרוטוקול שיתוף מפתח (Key agreement) שבו שני משתתפים או יותר מסכמים ביניהם על מפתח סודי כך שכל אחד מהם תורם את חלקו להקמתו במידה שווה, לעומת "העברת מפתח" (Key transport) שבו צד אחד מייצר ומעביר מפתח סודי למשתתפים האחרים, בעוד שהם אינם בהכרח תורמים להקמתו ואין להם שליטה עליו.

החסרון בפרוטוקול דיפי הלמן במתכונתו המקורית שהוא אינו מספק אימות זהויות ולכן חשוף להתקפת אדם באמצע. אפשר להוסיף מרכיב אימות על ידי חתימה דיגיטלית או תעודת מפתח ציבורי החתומה על ידי רשות מאשרת. משיקולי יעילות נעשו מאמצים לפתח פרוטוקולים המספקים אימות עקיף כחלק אינטרגלי ללא צורך בתהליכים נפרדים ובהתערבות צד שלישי. אפשר לחלק את מרכיב האימות לשני סוגים, שיתוף מפתח מאומת שבו צד אחד משתף ומאמת מפתח עם צד אחר, כך שהוא מקבל אישור לזהותו של המשתתף האחר (כיוון אחד) ונקרא בקיצור AK וכן "שיתוף מפתח מאומת עם אישור", שבנוסף מאשר את זהות השרת כלפי הלקוח (דו כיווני) שנקרא בקיצור AKC (קיצור של Authenticated Key agreement with Confirmation).

בסיום הפרוטוקול יכולים המשתתפים הלגיטימיים להיות סמוכים ובטוחים שמלבדם אין איש יודע מהו המפתח הסודי המשותף. בעיקרון אפשר להשתמש בו כמפתח הצפנה להצפנת ההתקשרות ביניהם. מטעמי ביטחון מומלץ לא להשתמש בו ישירות אלא לגזור ממנו מפתח אחר באמצעות פונקציית גזירת מפתח (Key derivation function) בקיצור KDF. המפתח הסודי המשותף שנגזר בסופו של דבר נקרא מפתח שיחה, כשמו הוא נועד להתקשרות אחת או מספר התקשרויות מוגבל כשלאחריהן מושמד.

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

===מאפיינים===
פרוטוקול שיתוף מפתח קריפטוגרפי בטוח אמור להתמודד עם התקפות פסיביות, שבהן התוקף מנסה לנחש את המידע הסודי על ידי התבוננות בחילופי המהלכים. ההנחה היא שמסרי הפרוטוקול מועברים בערוץ הפתוח שניתן לציתות על ידי כל גורם עם ציוד מתאים. וכן נגד התקפות אקטיביות בהן התוקף יכול גם ל'הזריק', ליירט, למחוק, לשנות ואו לשכפל מסרים. ביתר פירוט הפרוטוקול אמור לסכל את ההתקפות הבאות:
*מפתח ידוע (known-key); הפרוטוקול ייוותר בטוח נוכח מצב שבו נחשפו לעיני התוקף מפתחות שיחה אחרים (שנוצרו בעבר על ידי הפרוטוקול).
*שמירת סודיות קדימה (forward secrecy) או סודיות מושלמת קדימה; גם אם מפתח ארוך-טווח של אחד המשתתפים נחשף, הדבר לא ישפיע על סודיות מפתחות שיחה שנוצרו לפני החשיפה.
*מניעת התחזות (impersonation); במצב שבו המפתח הפרטי של אחד המשתתפים ידוע לתוקף לא יתאפשר לו לעשות בו שימוש כדי להתחזות לאחרים כלפי משתמש זה (ברור שבמקרה כזה התוקף מסוגל להתחזות למשתמש הלגיטימי הזה כלפי אחרים כיוון שהמפתח הפרטי מייצג בעצם את זהותו, אך ההפך אינו מחויב המציאות ואף רצוי למנוע).
*שיתוף לא ידוע (unkown key-share); התוקף לא יצליח לגרום למשתתף אחד לשתף איתו מפתח סודי בעוד שהלה סבור בטעות ששיתף מפתח עם מישהו אחר (כלומר צד אחד מאמין נכון שהוא משתף מפתח עם מישהו שהוא מכיר בעוד שהצד השני למעשה משתף בלא ידיעתו מפתח עם התוקף וסבור שהוא מישהו אחר).
*שליטה; אף אחד מהצדדים לא יוכל לאלץ את מפתח השיחה שיהיה ערך כלשהו לפי בחירתו.
*יעילות; מספר המהלכים צריך להיות המינימלי האפשרי וכן תעבורת רשת נמוכה (סך כל הסיביות ששודרו).


אפשר לממש את פרוטוקול MQV בתת-חבורה של החבורה הציקלית <math>\mathbb{Z}_p^*</math> מסדר ראשוני, למשל המפתח הפרטי הוא השלם <math>x</math> והציבורי הוא <math>X=g^x\text{ mod }p</math> כאשר <math>g</math> יוצר של השדה. במקרה זה המפתחות צריכים להיות בגודל של מעל 2000 ספרות בינאריות לעומת זאת יש יתרון ביישום הפרוטוקול בעקום אליפטי מכיוון שהוא מציע ביטחון זהה עם מפתח קצר משמעותית (בין 160 ל-512 סיביות נכון לשנת 2015). מסיבה זו תיאור הפרוטוקול מתמקד בעקום אליפטי. מניחים שהפרמטרים הציבוריים של העקום ידועים לכל המשתתפים. וכן כל מפתח ציבורי <math>Q</math> (שהוא נקודה בעקום) מאומת ונבדק שהוא עומד בהגדרות המערכת. בבדיקה מוודים ש:
:<math>Q</math> אינו שווה <math>\mathcal{O}</math> (הנקודה באין סוף).
:הקואורדינטות <math>x_Q,y_Q</math> הם אלמנטים של השדה <math>\mathbb{F}_q</math>.
:<math>Q</math> מקיים את משוואת העקום.
:<math>nQ=\mathcal{O}</math>
הבדיקה האחרונה יקרה במונחי מחשוב ולכן נוטים בדרך כלל להימנע ממנה. אפשר במקום זאת לוודא שהמפתח המשותף <math>K</math> שהופק בסיום הפרוטוקול הוא נקודה בתת-חבורה הנוצרת על ידי <math>P</math> כלומר <math>\{\mathcal{O},P,2P,...,(n-1)\cdot P\}</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>d_A</math> והמפתח הציבורי <math>Q_A=d_AP</math> (תוצאת כפל סקלארי של נקודת הבסיס <math>P</math> ב-<math>d_A</math>) מסומנת בקיצור <math>A^{(d_A,Q_A)}</math> והמשתתף <math>B</math> עם מפתחות <math>d_B,Q_B</math> בהתאמה, רוצים לשתף ביניהם סוד <math>K</math>, תחילה הם מחליפים ביניהם מפתחות ציבוריים ואז מחלצים את הסוד המשותף כדלהלן:
<div class="mw-content-ltr">
{|align="center"
|-
| align="right"| <math>A^{(d_A,Q_A)}</math> || || <math>B^{(d_B,Q_B)}</math>
|-
| || <math>\xrightarrow{\qquad\qquad Q_A\qquad\qquad}</math> ||
|-
| || <math>\xleftarrow{\qquad\qquad Q_B\qquad\qquad}</math> ||
|-
| <math>K=d_AQ_B</math> || || <math>K=d_BQ_A</math>
|}</div>

היות שמתקיים <math>K=d_AQ_B=d_Ad_BP=d_Bd_AP=d_BQ_A</math>, הסוד המשותף הוא הנקודה <math>K</math>.

==פרוטוקול MQV==
במקור הוצעו שלוש וריאציות של הפרוטוקול; שיתוף במהלך יחיד כך שרק צד אחד מקוון, בשני מהלכים עם אימות חד כיווני ובשלושה מהלכים עם אימות דו כיווני. יהי <math>f</math> פרמטר ביטחון של הפרוטוקול (אורך <math>n</math> בסיביות), כלומר <math>f=\left\lfloor\text{log}_2n\right\rfloor+1</math>. אם <math>R</math> נקודה כלשהי בעקום <math>\overline{R}</math> הוא פונקציה שממפה נקודה בעקום למספר שלם כדלהלן; <math>\overline{R}=(\overline{x}\text{ mod }2^{\left\lceil f/2\right\rceil})+2^{\left\lceil f/2\right\rceil}</math> כאשר <math>\overline{x}</math> הוא השלם המייצג את הקואורדינטה <math>x</math> של הנקודה <math>R</math>. כדי לטשטש אינטראקציה אפשרית בין הפונקציה לבין העקום האליפטי (שעלולה לפתוח פתח להתקפת התנגשות) יש כאלו שממליצים להשתמש בפונקציית גיבוב.
===פרוטוקול 1 - שיתוף מפתח עם אימות בשני מהלכים===
<div class="mw-content-ltr">
{|align="center"
|-
| align="right" |<math>A^{(d_A,Q_A)}\qquad </math> || || <math>B^{(d_B,Q_B)}\qquad </math>
|-
| || <math>\xrightarrow{\qquad \qquad R_A\qquad\qquad }</math> ||
|-
| || <math>\xleftarrow{\qquad \qquad R_B\qquad\qquad }</math> ||
|-
| <math>s_A=(r_A+\overline{R}_Ad_A)\text{ mod }n</math> || || <math>s_B=(r_B+\overline{R}_Bd_B)\text{ mod }n</math>
|-
| <math>K=h\cdot s_A\cdot (R_B+\overline{R}_BQ_B)</math> || || <math>K=h\cdot s_B\cdot (R_A+\overline{R}_AQ_A)</math>
|}
</div>

====תיאור המהלכים====
#<math>A</math> מייצרת מספר אקראי <math>r_A</math> בטווח <math>[1,n-1]</math> ומחשבת את <math>R_A=r_AP</math> את התוצאה משדרת ל-<math>B</math>.
#<math>B</math> מייצר מספר אקראי <math>r_B</math> בטווח <math>[1,n-1]</math> ומחשב את <math>R_B=r_BP</math> ושולח את התוצאה ל-<math>A</math>.
#<math>A</math> מוודה את תקפות הערכים ומחשבת את <math>s_A=(r_A+\overline{R}_Ad_A)\text{ mod }n</math> ואת <math>K=h\cdot s_A\cdot (R_B+\overline{R}_BQ_B)</math>.
#אם אחד הערכים אינו תקף או ש-<math>K=\mathcal{O}</math> אז <math>A</math> מסיימת את הפרוטוקול בכישלון.
#<math>B</math> בודק תקפות באופן דומה, מחשב את <math>s_B=(r_B+\overline{R}_Bd_B)\text{ mod }n</math> ואת <math>K=h\cdot s_B\cdot (R_A+\overline{R}_AQ_A)</math>.
#הסוד המשותף הוא <math>K</math>.
כאמור לפי הצעה של מספר מומחים כדי למנוע את התקפת שיתוף לא ידוע (להלן) כדאי להשתמש בפונקציית KDF מוסכמת על <math>K</math> עם מידע משותף כלשהו שמכיל את זהות המשתתפים בפרוטוקול ולהשתמש בתוצאה האחרונה כמפתח שיחה. וכן מומלץ לכלול בכל המסרים של הפרוטוקול את זהות המשתתפים.

הפרוטוקול לא הוכח באופן פורמלי כבטוח אך לטענת המפתחים קיימת סברה היוריסטית שהוא מספק אימות הדדי של המפתח באופן עקיף וכן שהוא עמיד כנגד ההתקפות המתוארות לעיל; מפתח שיחה ידוע, שמירת סודיות קדימה, מניעת התחזות ושליטה. חשיפת המפתחות הזמניים אינה מסכנת את חשיפת המפתחות הפרטיים ארוכי הטווח של המשתתפים ולא את מפתח השיחה <math>K</math>. הערכים <math>s_A</math> ו-<math>s_B</math> משמשים למעשה כחתימה עקיפה של המשתתפים על המפתחות הציבוריים הזמניים שלהם <math>R_A</math> ו-<math>R_B</math> בהתאמה. אפשר לראות שהפרוטוקול נכון כי:
:<math>K=h\cdot s_A\cdot s_B\cdot P=h\cdot (r_Ar_B+r_Ad_B\overline{R}_B+r_Bd_A\overline{R}_A+d_Ad_B\overline{R}_A\overline{R}_B)P</math>
לעומת פרוטוקול דיפי הלמן הבסיסי שבו <math>K=r_Ar_BP</math>. כמו כן כדי לשפר יעילות הביטוי <math>\overline{R}</math> מנצל רק מחצית מסיביות הקואורדינטה <math>x</math> של הנקודה, זאת כדי להקל על פעולות הכפל הסקלארי בסעיפים 3 ו-5 והכפל ב-<math>h</math> נועד להבטיח שהסוד המשותף <math>K</math> יהיה נקודה בתת-חבורה מסדר <math>n</math> בעקום האליפטי. כמו כן היות שאת <math>r_AP</math> אפשר לחשב מראש יוצא שכל צד מבצע רק 1.5 פעולות כפל סקלארי און ליין.

===פרוטוקול 2 - שיתוף מפתח עם אימות במהלך אחד===
המטרה היא ש-<math>A</math> ו-<math>B</math> ישתפו מפתח סודי על ידי מהלך יחיד מ-<math>A</math> ל-<math>B</math>. מצב זה רצוי במקרה שרק משתמש אחד מקוון כמו ביישומי דואר אלקטרוני. הפרוטוקול הוא כדלהלן:
<div class="mw-content-ltr">
{|align="center"
|-
| align="right" | <math>A^{(d_A,Q_A)}</math> || || <math>B^{(d_B,Q_B)}</math>
|-
| || <math>\xrightarrow{\qquad \qquad R_A\qquad\qquad }</math> ||
|-
| <math>s_A=(r_A+\overline{R}_Ad_A)\text{ mod }n</math> || || <math>s_B=(d_B+\overline{Q}_Bd_B)\text{ mod }n</math>
|-
| <math>K=h\cdot s_A\cdot (Q_B+\overline{Q}_BQ_B)</math> || || <math>K=h\cdot s_B\cdot (R_A+\overline{R}_AW_A)</math>
|}</div>

====פירוט המהלכים====
#<math>A</math> מייצרת מספר אקראי <math>r_A</math> בטווח <math>[1,n-1]</math> ומחשבת את <math>R_A=r_AP</math> ושולחת את התוצאה ל-<math>B</math>.
#<math>A</math> מחשבת את <math>s_A=(r_A+\overline{R}_Ad_A)\text{ mod }n</math> ואת <math>K=h\cdot s_A\cdot (Q_B+\overline{Q}_BQ_B)</math>.
#<math>B</math> מוודה תקפות ערכים ומחשב את <math>s_B=(d_B+\overline{Q}_Bd_B)\text{ mod }n</math> ואת <math>K=h\cdot s_B\cdot (R_A+\overline{R}_AQ_A)</math>.
#המפתח המשותף הוא <math>K</math>.
מטבע הדברים היות ש-<math>B</math> אינו תורם למהלכי הפרוטוקול בערך אקראי משלו, חסרים בפרוטוקול הגנה מפני התקפת מפתח ידוע ושמירת סודיות קדימה.

===פרוטוקול 3 - שיתוף מפתח מאומת עם אישור דו צדדי===
הגרסה הזו של פרוטוקול 1 מנצלת פרימיטיב קריפטוגרפי נוסף שמספק אימות כמו MAC כדי לבצע אימות ואישור דו צדדי. וכן בפרוטוקול הבא הערכים <math>\mathcal{H}_1</math> ו-<math>\mathcal{H}_2</math> הם פונקציית לגזירת מפתח. למשל אם הערך הוא <math>z</math> אפשר לממש פונקציית גיבוב בטוחה כמו SHA-2 של <math>z</math> כשהוא משורשר עם ערך נוסף, כך <math>\mathcal{H}_1=\text{SHA2}(01 \ \| \ z)</math> וכן <math>\mathcal{H}_2=\text{SHA2}(02 \ \| \ z)</math>.

<div class="mw-content-ltr">
{|align="center"
|-
| align="right" | <math>A^{(d_A,Q_A)}</math> || || <math>B^{(d_B,Q_B)}</math>
|-
| || <math>\xrightarrow{\qquad \qquad \qquad \qquad R_A\qquad\qquad \qquad \qquad }</math> ||
|-
| || <math>\xleftarrow{\qquad \qquad R_B,\text{MAC}_{k'}(2,B,A,R_B,R_A)\qquad \qquad \ }</math> ||
|-
| || <math> \xrightarrow{\quad \qquad \qquad \text{MAC}_{k'}(3,A,B,R_A,R_B)\qquad \qquad \quad }</math> ||
|-
| <math>s_A=(r_A+\overline{R}_Ad_A)\text{ mod }n</math> || || <math>s_B=(r_B+\overline{R}_Bd_B)\text{ mod }n</math>
|-
| <math>K=h\cdot s_A\cdot (R_B+\overline{R}_BQ_B)</math> || || <math>K=h\cdot s_B\cdot (R_A+\overline{R}_AQ_A)</math>
|-
| <math>k=\mathcal{H}_1(z)</math> || || <math>k=\mathcal{H}_1(z)</math>
|-
| <math>k'=\mathcal{H}_2(z)</math> || || <math>k'=\mathcal{H}_2(z)</math>
|}
</div>

====פירוט המהלכים====
#<math>A</math> מייצרת מספר אקראי <math>r_A</math> בטווח <math>[1,n-1]</math> ומחשבת את <math>R_A=r_AP </math> ושולחת את התוצאה ל-<math>B</math>.
#<math>B</math> מייצר מספר אקראי <math>r_B</math> בטווח <math>[1,n-1]</math>, מחשב את <math>R_B=r_BP</math> ושולח את התוצאה ל-<math>A</math>.
#<math>B</math> מחשב את <math>s_B=(r_B+\overline{R}_Bd_B)\text{ mod }n</math> ואת <math>K=h\cdot s_B\cdot (R_A+\overline{R}_AQ_A)</math>.
#<math>B</math> מחלץ את הערך <math>z</math> שהוא הקואורדינטה <math>x</math> של הנקודה <math>K</math> ומחשב את <math>k=\mathcal{H}_1(z)</math> ואת <math>k'=\mathcal{H}_2(z)</math>.
#<math>B</math> מחשב את <math>\text{MAC}_{k'}(2,B,A,R_B,R_A)</math> ושולח את תג האימות יחד עם <math>R_B</math> ל-<math>A</math>.
#<math>A</math> מחשבת את <math>s_A=(r_A+\overline{R}_Ad_A)\text{ mod }n</math> ואת <math>K=h\cdot s_A\cdot (R_B+\overline{R}_BQ_B)</math> ובודקת שהנקודה <math>K</math> תקינה.
#<math>A</math> מחלצת את הערך <math>z</math> שהוא פונקציה של הקואורדינטה <math>x</math> של הנקודה <math>K</math> ומחשבת את הערכים <math>k=\mathcal{H}_1(z)</math>, <math>k'=\mathcal{H}_2(z)</math>.
#<math>A</math> מחשבת את <math>\text{MAC}_{k'}(3,A,B,R_A,R_B)</math> ושולחת את התג ל-<math>B</math>.
#<math>B</math> מחשב את <math>\text{MAC}_{k'}(3,A,B,R_A,R_B)</math> ומוודה שהתוצאה זהה לתג שקיבל מ-<math>A</math>.
#מפתח השיחה הוא <math>k</math>.

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

===פרוטוקול HMQV===
ב-2005 פרסם הוגו קרווציק מאמר שבו הוא מבקר את ביטחון MQV תחת מודלים של ביטחון ידועים ומציין שהתגלו על ידו כמה חולשות בפרוטוקול. אף על פי שהפרוטוקול זכה לפופולריות רבה וה-NSA הכליל אותו ברשימה הנבחרת של אלגוריתמים שעברו בדיקה של קריפטאנליסטים מקצועיים, הרי שלא ניתנה הוכחה פורמלית לביטחונו במונחים של ביטחון סמנטי לפי מודל סיבוכיות סטנדרטי או במסגרת מודל אורקל אקראי. הוגו הציע לתקן את הליקויים שמצא על ידי אלגוריתם משופר משלו שנקרא HMQV שפועל עם פונקציית גיבוב ומציע יעילות דומה למקורי ועם ביטחון מוכח. אלפרד מנזס ביקר את ממצאיו של הוגו וטען כי HMQV אינו בטוח יותר ומציג התקפה ריאליסטית במודל קנטי-קרווציק שבה אפשר לחשוף את המפתח הפרטי של המשתתפים. וכן מצא לדבריו שגיאות קריטיות בהוכחות המתמטיות שהובאו על ידי קרווציק. התיקון שהציע מנזס נקרא HMQV-1 והוא גרסה מתוקנת שעמידה בפני ההתקפה המצוינת (אולם בשל התיקון אינה מהירה יותר מהמקורית). קרווציק הגיב על טענות מנזס במאמר משלו וסתר חלק מהן.

חלק מהוויכוח מתמקד סביב הבדיקה שנקראת G-test, כלומר במהלך הפרוטוקול המקורי בוצע הכפל ב-<math>h</math> כדי להבטיח שהתוצאה שייכת לתת-חבורה <math>G</math> מסדר <math>n</math> וכי לא נבחר בכוונה תחילה ערך מתת חבורה קטנה יותר שעלולה להפוך את הפרוטוקול ללא בטוח כי התוקף יכול להפעיל כוח גס אם ידוע לו שהמפתח נמצא בטווח אחר קטן משמעותית מהמצופה. ב-HMQV הבדיקה הזו הוסרה לטובת יעילות בטענה שאינה מוסיפה לביטחון האלגוריתם לפי מודל אורקל אקראי. על כל פנים, הוספת פונקציית גיבוב לפרוטוקול MQV כפי שהציע קרווציק מקובלת כיום כיוון שהיא יעילה למדי ואינה מסכנת את ביטחון הפרוטוקול.

====השוואת פרוטוקול HMQV לעומת MQV (בחבורה ציקלית רגילה)====
נתון פרוטוקול דיפי הלמן הבסיסי (שאינו מאומת), בו המשתתפת <math>\hat A</math> עם מפתח פרטי <math>a</math> והמפתח הציבורי <math>A=g^a</math> והמשתתף <math>\hat B</math> עם מפתחות <math>b,B=g^b</math> בהתאמה, רוצים לשתף ביניהם מפתח סודי <math>K</math> הם פועלים כך; <math>\hat A</math> שולחת ל-<math>\hat B</math> את <math>(\hat A, \hat B, A=g^a)</math> וכן <math>B</math> שולח ל-<math>A</math> את <math>(\hat B,\hat A,B=g^b)</math>. המפתחות <math>x</math> ו-<math>y</math> הם המפתחות הפרטיים הזמניים של <math>A</math> ו-<math>B</math> בהתאמה ואילו <math>X</math> ו-<math>Y</math> הם המפתחות הציבוריים המתאימים. בשני הפרוטוקולים <math>\hat A</math> ו-<math>\hat B</math> מריצים את פרוטוקול דיפי-הלמן הבסיסי ואז:
:<math>\hat A</math> מחשבת את <math>\sigma_{\hat A}=(YB^e)^{x+da}</math>,
:<math>\hat B</math> מחשב את <math>\sigma_{\hat B}=(XA^d)^{y+eb}</math>.

כעת שני המשתתפים מחלצים את הסוד המשותף <math>K=H(\sigma_{\hat A})=H(\sigma_{\hat B})</math>
{| class="wikitable"
|-
! פרוטוקול MQV !! פרוטוקול HMQV
|-
| <math>d=\overline{X} \ \overset{\underset{\mathrm{def}}{}}{=} \ 2^{\ell}+(X\text{ mod }2^{\ell})</math>,
<math>e=\overline{Y} \ \overset{\underset{\mathrm{def}}{}}{=} \ 2^{\ell}+(Y\text{ mod }2^{\ell})</math>
 || <math>d=\overline{H}(X,\hat B)</math>,
<math>e=\overline{H}(Y,\hat A)</math>
|}

==ביטחון==
הסברה היא שהפרוטוקול בטוח כנגד ההתקפות המצוינות לעיל; מפתחות ידועים, שמירת סודיות קדימה, התחזות ושליטה. בהנחה שבעיית הלוגריתם הדיסקרטי ובעיית דיפי-הלמן קשות לפתרון, אם כי לא ניתנה כל הוכחה פורמלית. מסרי הפרוטוקול זהים לפרוטוקול דיפי-הלמן הבסיסי מסיבה זו הוא בעל תפוקה ורוחב פס טובים יותר מדיפי-הלמן שאומת באמצעות חתימה דיגיטלית. אולם פרוטוקול MQV (גרסה 1) אינו מספק שמירת סודיות קדימה במובן החזק. כלומר לפי המפתחים התכונה הזו מתקיימת רק כאשר המשתתפים בפרוטוקול הגונים, כלומר מבצעים את מהלכי הפרוטוקול כראוי. בעוד שאם אחד מהם אינו הגון ייתכן שסודיות קדימה לא תושג. אפשר לנסח את המודל בשני אופנים. בראשון המפתח הפרטי הקבוע של אחד מהצדדים המשתתפים בפרוטוקול נחשף ובמודל החמור יותר כל המידע הפרטי של המשתתף נחשף. במקרה האחרון הפרוטוקול ייכשל. אם יוזם ההתקשרות נפרץ וכל המידע הפרטי שלו נחשף לתוקף לאחר תחילת ההתקשרות, אם החשיפה ארעה לפני שקיבל בחזרה את התגובה של המשתתף האחר הרי שהתוקף יכול להשיג את מפתח השיחה.

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

ב-2003 פרסמו פטר לידביטר ונייג'ל סמארט התקפה כנגד גרסת העקום האליפטי של הפרוטוקול: ECMQV (וכן כל פרוטוקול שיתוף מפתח מאומת מבוסס דיפי-הלמן שאינו עושה שימוש בחתימה דיגיטלית) באמצעות התקפת סריג שבה ניתן לחשוף את המפתח הפרטי ארוך הטווח של אחד המשתמשים כאשר חלק מהפרמטרים ידוע (כגון אם משתתף אחד הצליח לגלות חלק מסיביות ערך כלשהו המשמש את המשתתף השני בהכנת המפתח הארעי. גרעין התחלתי, Nonce, וקטור האתחול וכדומה. ערכים כאלו יכולים להתגלות לתוקף בדרכים אחרות כמו דליפה עקב יישום גרוע של האלגוריתם בתוכנה או בהתקפת ערוץ צדדי כמו קרינה אלקטרומגנטית וכדומה). בכל אופן לאחר מספר ריצות של הפרוטוקול, המשתתף יכול לחשוף את המפתח הפרטי של הצד השני ולהתחזות אליו. הממצאים מראים שביטחון הפרוטוקול מצטמצם ל-<math>O(q^{1/4})</math> ולא <math>O(q^{1/2})</math> כאשר <math>q</math> הוא סדר השדה.

===התקפת שיתוף לא ידוע===
פרוטוקול MQV (פרוטוקול 1) אינו פתור את בעיית "שיתוף לא ידוע" לעיל, כלומר אפשר לבצע התקפה של קליסקי כדלהלן: המצותת <math>E</math> מיירטת את מפתח הציבורי <math>R_A</math> המיועד ל-<math>B</math> ומחליפה אותו ב-<math>R_E=R_A+\overline{R}_AQ_A-P</math> מחשבת את <math>d_E=(\overline{R}_E)^{-1}\text{ mod }n</math> וכן את <math>Q_E=d_EP</math> ואז רושמת את המפתחות הללו אצל הרשות המאשרת כדי שיהיו תקפים ושולחת את <math>R_E</math> ל-<math>B</math>. המשתמש <math>B</math> מגיב במשלוח <math>R_B</math> ל-<math>E</math> והיא מעבירה אותו הלאה ל-<math>A</math> ללא שינוי. כעת <math>A</math> ו-<math>B</math> שיתפו את <math>K</math> בזמן ש-<math>B</math> משוכנע כל העת שהוא משתף מפתח עם <math>E</math> בעוד שלמעשה הוא שיתף מפתח עם <math>A</math>. ישנן שתי דרכים לפתור בעיה זו, האחת להוסיף את זהות המשתתפים לכל מהלכי הפרוטוקול והשנייה להוסיף מהלך שלישי כמו בפרוטוקול 3.

==הערות שוליים==

קטגוריה:קריפטוגרפיה