חישוב רב-משתתפים בטוח

חישוב רב־משתתפים בטוח (באנגלית: Secure multi-party computation; בקיצור SMPC או MPC), הוא ענף בקריפטוגרפיה העוסק בשיטות לחישוב פונקציה מוסכמת של קלטים ממשתתפים שונים באופן שהקלטים עצמם נשארים סודיים וזאת מבלי להיעזר בצד שלישי. בניגוד לקריפטוגרפיה רגילה בין משתתפים שסומכים זה על זה כשהפרוטוקול אמור להגן עליהם מפני גורמים חיצוניים, במודל זה המשתתפים לא בהכרח סומכים זה על זה והפרוטוקול אמור להגן על המשתתפים עצמם זה מזה במידה וחלקם או רובם בלתי הגונים או מושחתים.

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

==היסטוריה==
חישוב רב־משתתפים נחשב לאחד היעדים החשובים ביותר של הקריפטוגרפיה המודרנית ולו היסטוריה ארוכה. החל עם עבודתו של אנדרו יאו, בתחילת שנות ה-80 של המאה ה-20, שהציע פרוטוקול לשני משתתפים שנקרא בקיצור 2PC. הפרוטוקול תואר בצורת משל הנקרא בעיית המיליונרים שהיא בעיה בוליאנית. שני מיליונרים רוצים לדעת מי מהם יותר עשיר מבלי לחשוף את הונם האישי. במקרה זה הקלט הוא הונם האישי והפלט הוא סיבית אחת. הוא הציע פתרון המבוסס על מעגל בוליאני מעוות. לאחר מכן הציעו עודד גולדרייך, סילביו מיקאלי ואבי ויגדרזון הרחבה של הפרוטוקול ליותר משתתפים, המבוסס על חלוקת סוד והוכחה באפס ידיעה, מה שהפך במרוצת הזמן למודל כללי ששימש כהשראה ובסיס לפרוטוקולים החדשים שבאו אחריו. מתוך כך התפתח ענף חדש בקריפטוגרפיה הנקרא חישוב פונקציונלי בטוח בקיצור (SFE) או באופן כללי יותר קריפטוגרפיה פונקציונלית (בקיצור FE).

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

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

==תיאור כללי==
בעיית חישוב רב־משתתפים היא כדלהלן: ישנם <math>n</math> שחקנים המסומנים <math>P_1,P_2,P_3,...,P_n</math>, כל אחד מהם מחזיק במידע פרטי משלו המסומנים <math>x_1,x_2,x_3,...,x_n</math> בהתאמה. ונניח שהם הסכימו על פונקציה <math>y=f(x_1,x_2,x_3,...,x_n)</math> שהם רוצים לחשב על המידע הפרטי שלהם, אבל הם אינם סומכים זה על זה והם לא רוצים לחשוף או לשתף את המידע האישי שלהם. פתרון פשוט לבעיה האמורה יכול להיות הפרוטוקול הבא: השחקנים ימנו צד שלישי נאמן וימסרו לו את כל המידע הפרטי שלהם. הוא יחשב עבורם את הפונקציה <math>f</math> על המידע הפרטי ויפרסם את התוצאה. זהו הפתרון שננקט בפועל בימינו אבל יש בו חסרונות. לא תמיד האמון שניתן בצד השלישי מוצדק ובמיוחד ייתכנו סיטואציות מסוימות שבהן אי אפשר לסמוך על צד שלישי. פרוטוקול MPC אמור להחליף את הפונקציונליות של הצד השלישי, בשני היבטים חשובים:
# פרטיות. המידע המושג מהרצת הפרוטוקול אינו אמור לסייע לאף שחקן או קואליציה של שחקנים לא הגונים לגלות משהו אודות המידע הפרטי של שחקן אחר, מעבר למידע שנחשף באופן אינהרנטי כתוצאה מהפרוטוקול עצמו.
# נכונות. כל קואליציה של שחקנים בלתי הגונים המשתפים פעולה כדי להטות את תוצאת הפרוטוקול לא תוכל לכפות על שחקן הגון להוציא פלט לא נכון, במילים אחרות שחקן הגון יכול לסמוך על כך שפלט הפרוטוקול נכון אפילו בנוכחות שחקנים מושחתים.

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

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

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

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

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

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

כשמדברים על פרוטוקול חישוב רב־משתתפים בטוח בדרך כלל מנסחים אותו במונחים של מעגל אלקטרוני. ישנם שני סוגים: מעגל בוליאני ומעגל אריתמטי. למעשה עם מעגל בוליאני אפשר לבנות מעגל אריתמטי אבל הוא פחות יעיל. במעגל בוליאני של יאו המודל מורכב משני צדדים, צד <math>A</math> נקרא בונה מעגל וצד <math>B</math> נקרא מעריך. <math>A</math> מצפין או מערבל את המעגל ושולח אותו ל-<math>B</math>. בשלב זה <math>B</math> מקבל מפתח <math>X_a</math> המתאים לקלט של <math>A</math> שהוא הסיבית <math>a</math>. כדי לפענח את המידע <math>B</math> צריך להשיג גם את המפתח <math>Y_b</math> אך <math>b</math> חייב להיות מוסתר מ-<math>A</math>. כדי להשיג את המפתח מ-<math>A</math> באופן מוסתר הוא משתמש בפרוטוקול העברה עלומה שבו <math>A</math> מפיק שני קלטים <math>Y_0,Y_1</math> ו-<math>B</math> מגריל סיבית קלט אחת <math>b</math> ובסיום הפרוטוקול <math>B</math> השיג את <math>Y_b</math> מבלי ש-<math>A</math> יידע מהו <math>b</math>. הערבול של המעגל מתבצע כך: כאשר <math>A</math> רוצה להסתיר שער AND הוא מחשב ארבעה טקסטים מוצפנים:
:<math>C_{00}=E_{X_0,Y_0}(Z_0)</math>
:<math>C_{01}=E_{X_0,Y_1}(Z_0)</math>
:<math>C_{10}=E_{X_1,Y_0}(Z_0)</math>
:<math>C_{11}=E_{X_1,Y_1}(Z_1)</math>
אז הוא מבצע תמורה אקראית שלהם (מערבב אותם) ושולח את התוצאות ל-<math>B</math> שיכול לפענח רק את הטקסט המוצפן שמתאים למפתח <math>(X_a,Y_b)</math> ומזה הוא יכול לדעת מהו <math>Z_{a\land b}</math>. ההנחה היא ש-<math>B</math> יכול לזהות הבדל בין פענוח נכון לפענוח לא נכון, אפשר למשל להוסיף מספר קבוע של אפסים בסוף ההודעה לפני ההצפנה כך שבסבירות גבוהה רק המפתח הנכון יניב תוצאה שתכיל מספר קבוע של אפסים בסופה, לעומת זאת פענוח עם מפתח שגוי יניב תוצאה הנראית אקראית לגמרי. דרך אחרת יותר יעילה נקראת Point-and-permute שבה אם נתייחס לשער המוצפן כאל טבלה, אפשר לקבוע שחלק מסיביות המפתחות ישמשו כאינדקסים לשורה ועמודה. הפלט של השערים יכול לשמש כמפתח להצפנת השכבה הבאה של שערים וכן הלאה, או ש-<math>A</math> יכריז מהם <math>(0,Z_0),(1,Z_1)</math>. בכל אופן בדרך זו אפשר להצפין מעגל שלם בצורה שהמעריך יוכל לחשב את הפלט מבלי לדעת מהו הקלט. שזו המטרה של חישוב רב־משתתפים.

הפרוטוקול של יאו שתואר בתמצית בטוח רק במסגרת מודל שבו היריב פסיבי בלבד. הבעיה העיקרית היא ש-<math>A</math> יכול עקרונית לשלוח ל-<math>B</math> מעגל המחשב פונקציה אחרת ממה שהוסכם מראש מבלי ש-<math>B</math> יוכל לדעת זאת. כלומר במקרה כזה <math>A</math> הוא יריב אקטיבי שיכול לסטות ממהלכי הפרוטוקול. באופן כללי כדי להתאים את הפרוטוקול שיהיה בטוח גם נגד יריב אקטיבי אפשר להפעיל פרוטוקול משני שנקרא Cut-and-choose כמו בהוכחה באפס ידיעה. <math>A</math> ישלח ל-<math>B</math> מספר מרובה של עותקים של המעגל הבוליאני המעוות ו-<math>B</math> יבחר תת-קבוצה אקראית של מעגלים ש-<math>A</math> יצטרך "לפתוח" (לחשוף בפניו את המעגלים המקוריים המתאימים להם), אם הוא רואה בכל המקרים שהמעגלים מחשבים את הפונקציה המוסכמת אז סטטיסטית הוא יכול להיות משוכנע ש-<math>A</math> לא מרמה אותו ומנסה להגניב פונקציה אחרת.

למעגל אריתמטי יש עדיפות במקרים מסוימים מהיבט של יעילות. מעגל זה בדרך כלל מיישמים עם פונקציית הצפנה הומומורפית חלקית מעל פעולת החיבור או פעולת הכפל, למשל אם <math>C_1=E(x)</math> וכן <math>C_2=E(y)</math> אז <math>C_1\otimes C_2=E(x+y)</math> כאשר הפעולה <math>\otimes</math> היא פעולה אריתמטית מודולו <math>p</math> כלשהו. במקרה כזה <math>A</math> יכול לשלוח ל-<math>B</math> את <math>C_1=E(a)</math> שבתורו ינצל את תכונת ההומורפיות של ההצפנה כדי לחשב את <math>C_2=E(ab-1)</math>. כעת <math>A</math> יכול לפענח את זה כדי לקבל את <math>s=ab-1</math> מודולו <math>p</math>. זהו מעין שיתוף סוד בין <math>A</math> ל-<math>B</math> מעל פעולת החיבור של <math>r</math> ו-<math>s</math> שהם הכפולה של הקלטים <math>a</math> ו-<math>b</math> כך שמתקיים <math>r+s=ab</math>.

==פרויקטים==
נכון לשנת 2019 קיימים מספר פרויקטים לחישוב רב־משתתפים בטוח לשימוש כללי, בהם:
* [https://www.cs.huji.ac.il/project/Fairplay/ Fairplay]. חישוב פונקציות בטוח (SFE) שהוקם בחסות האוניברסיטה העברית בירושלים. זוהי מערכת מפותחת המאפשרת חישוב מעגל בוליאני על ידי שנים או יותר שחקנים עם ביטחון פאסיבי.
* [http://viff.dk/ VIFF] תשתית המאפשרת יישום חישוב רב־משתתפים בטוח הכולל אפשרות לחישובים אריתמטיים כמו חיבור וכפל בהתבסס על שיתוף סוד פסידו-אקראי של שמיר. עם תמיכה למקביליות.
* [https://sharemind.cyber.ee/ Sharemind]. מערכת חישוב בטוח לשלושה משתתפים עם אפשרות לשחקן לא הגון פסיבי אחד לכל היותר. המערכת פותחה על ידי חברת Cybernetica מאסטוניה. הרעיון הוא במקום להחזיק במסד נתונים מרכזי לפזר את מסד הנתונים על פני מספר נקודות חישוב. הפרויקט מתמקד סביב הבעיה של שיתוף וניתוח של מידע ממקורות שונים.
* [https://github.com/encryptogroup/tasty TASTY]. פרויקט חישוב בטוח לשני משתתפים המאפשר חישובים בוליאניים ואריתמטיים עם ביטחון פאסיבי בלבד, הפועל על שילוב של מעגל בוליאני מעוות עם הצפנה הומומורפית.
* [https://galois.com/project/jana-private-data-as-a-service/ Jana]. מסד נתונים התומך בחישוב רב־משתתפים בטוח, שפותח על ידי חברת Galois מארצות הברית. מסד הנתונים פועל לפי מודל שנקרא Priavte Data as Service או בקיצור PDaaS למסד נתונים יחסי. הייחודיות במסד הנתונים הזה שהוא מאפשר לבצע חישובים וסטטיסטיקות על המידע המצוי במסד הנתונים מבלי לפענח אותו.
* [https://partisia.com/secure-simple-efficient/ Partisia] שהוקם על ידי חברה מדנמרק שנחשבת לחלוצה בתחום MPC. עיקר התמחותה הוא מכרזים מקוונים והיא יישמה לראשונה חישוב רב־משתתפים במכרז לסוכר.
* [https://www.unboundtech.com/ Unbound Tech]. חברה ישראלית המציעה תמיכה בשמירה על סודות ארגוניים כמו מפתחות הצפנה בכל סיטואציה בהתבסס על טכנולוגיות MPC.

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

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