הצפנה הומומורפית

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

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

## הגדרה
בהינתן סכמת הצפנה עם פונקציית הצפנה E_{pk}(m) שמצפינה את המסר m עם המפתח הפומבי pk ופונקציית פענוח D_{sk}(c) המפענחת את המסר המוצפן c עם המפתח הפרטי sk. נסמן ב־M את מרחב ההודעות וב־C את מרחב ההודעות־המוצפנות של הסכמה. סכמת הצפנה תיקרא *הומומומורפית ביחס לפונקציה <math>f:M^n:\rightarrow M</math> ב־<math>n</math> משתנים* אם לסכמה קיימת פונקציית הערכה V(pk, f, c_1, \dots, c_n) כך שלכל n הצפנות c_1,\dots,c_n\in C של הודעות m_1,\dots ,m_n\in M מתקיים כי V(pk, f, c_1, \dots, c_n) מוציאה כפלט צופן c שהוא הצפנה של f(m_1,\dots ,m_n) באמצעות E_{pk}(m). ופירושו שניתן לבצע חישוב על המסר המוצפן ותוצאתו תהיה הצפנה של תוצאת החישוב על המסר טרם ההצפנה.

ברוב המקרים יש דרישה כחלק מההגדרה שהסכמה תהיה בטוחה סמנטית.

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

דוגמאות להומומורפיזם חלקי:
*צופן קיסר הוא הומומורפי (כצופן סימטרי) ביחס לפעולת השרשור: אפשר קודם לשרשר שתי מחרוזות ואז להסיט אותן או שאפשר להסיט כל אחת בנפרד ואז לשרשר. התוצאה זהה.
*RSA הומומרפי ביחס לכפל. המסר x מוצפן עם המפתח (e,n) כ-E(x) = x^e\ \bmod\ n ולכן:
*:E(x_1) \cdot E(x_2) = x_1^e x_2^e \;\bmod\; n = (x_1x_2)^e \;\bmod\; n = E(x_1 \cdot x_2)
*:לצופן אל-גמאל תכונת הומומורפיות זהה.
*הצפנת גולדווסר מיקאלי הומומורפית ביחס לחיבור.

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

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

בשנת 2009 הוכיח קרייג ג'נטרי, דוקטורנט באוניברסיטת סטנפורד וחוקר בקבוצת ווטסון בחברת IBM, בעבודת הדוקטורט שלו שהצפנה כזו קיימת. הסכמה היא הצפנה מבוססת סריגים ומתבססת על הנחות בנוגע לסריגים אידיאליים. הבנייה התחלקה לשני שלבים עיקריים:
#ראשית בנה ג'נטרי הצפנה הומומורפית מלאה לעומק קבוע (Levelled FHE), הצפנה שהומומורפית לכל פונקציה שניתנת לחישוב על ידי מעגל בעומק נתון מראש, במקרה הנוכחי - יכולת להעריך כל פולינום עד למעלה מסוימת. ההגבלה על העומק נוצרה מכך שסכמת ההצפנה כללה החדרת רעש למסר המוצפן, כך שיכולת השחזור אפשרית רק לבעלי סוד מסוים שהוא המפתח הפרטי. בסכמות כאלה הרעש גדל בסדר גודל מסוים בכל שלב במעגל ולכן פלט של מעגל בעומק גבוה מדי יהיה עם יותר מדי רעש ולא יהיה ניתן לשחזור.
#לאחר בניית הסכמה הזו, הגדיר ג'נטרי והוכיח את תהליך ה־Bootstrapping. פריצת הדרך של ג'נטרי נבעה מהתייחסותו אל תהליך הפענוח כאל עוד פונקציה שניתנת להערכה באופן הומומורפי על המסר המוצפן. מכאן, מרגע שהמסר המוצפן מכיל כמות גבוהה של רעש, כל שיש לעשות הוא להריץ הומומורפית את סכמת הפענוח, בעזרת פרסום הצפנה של המפתח הפרטי, וכך לקבל הצפנה של המסר המוצפן המפוענח - נניח שלאחר מספר פעולות הומומורפיות התקבל המסר המוצפן C=E_{pk}\left(M\right) שמכיל רעש רב. אנחנו נרצה לקבל הצפנה חדשה של M עם רעש חדש וקטן יחסית, את זאת נוכל לקבל על ידי הפעלת פונקציית הפענוח - E_{pk}\left(M\right)\rightarrow E_{pk}\left(D_{sk}\left(E_{pk}\left(M\right)\right)\right)
 . בצורה פורמלית - סכמת הצפנה תיקרא ניתנת ל־Bootstrapping אם היא הומומורפית לכל מעגל בעומק לכל היותר D+1, כאשר D הוא עומק המעגל של פונקציית הפענוח של הסכמה. כעת לאחר כל מספר פעולות הומומורפיות וכאשר הרעש גדל, מפעילים הומומורפית את פוקנציית הפענוח וממשיכים.

הבנייה של ג'נטרי ורעיון ה־Bootstrapping הביאו לפריחה בתחום. בשנים שעברו מאז פרסום עבודתו פורסמו סכמות הצפנה רבות (כמו TFHE, CKKS, BGV, ואחרים) המבוססות על רעיונות דומים שמנסות להתגבר על חלק מהחסרונות בבנייתו. כיום רוב הסכמות מתבססות על הנחת הקושי הנובעת מ־Learning With Errors של עודד רגב, שהיא הנחת קושי מקובלת יותר בניגוד להתבססות על סריגים אידיאליים. בנוסף, הסכמות היום יעילות יותר, אך עדיין לא יעילות מספיק לשימוש המוני.

## ראו גם
* CKKS

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

* 

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

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