CKKS – הבדלי גרסאות
תוכן שנמחק תוכן שנוסף
אין תקציר עריכה |
החלפות (, הייתה , דוגמה', בדרך כלל, (על ידי , הווקטור, לעיתים, זיכרון, אחר כך, בהינתן, בעיית , להיעזר, פופולרי, פורמלי, לבעיית ) יתום |
||
שורה 1:
ב[[קריפטוגרפיה]], '''CKKS''' היא שיטת [[הצפנה הומומורפית]]
for Arithmetic of Approximate Numbers | author1=Jung Hee Cheon |author2=Andrey Kim | |author3=Miran Kim |author4=Yongsoo Song| publisher=Springer, Cham | journal=International Conference on the Theory and Application of Cryptology and Information Security |year=2017}}}}, Kim, Kim, Cheon ו-Song.
באופן כללי הצפנה הומומורפית (Homomorphic Encryption) היא שיטת הצפנה המאפשרת לבצע חישוב מסוים על מסרים מוצפנים שתוצאתו היא מסר מוצפן אחר השקול לתוצאה שהייתה מתקבלת מהצפנת פעולת החישוב האמורה על המסרים המקוריים. למשל חיבור של ההצפנה של X עם ההצפנה של Y יתן את ההצפנה של X+Y. סְכֶמַת הצפנה הומומורפית היא "מלאה" (Fully Homomorphic Encryption) אם היא מאפשרת לבצע ''כל'' חישוב רצוי על הצפנים באופן יעיל.
[[קובץ:Homomorphic Encryption Setup.jpg|300px|ממוזער|שמאל|הענן מקבל שני צפנים, מחבר אותם ושולח את הצופן המחובר בחזרה. פענוח הצופן המוחזר יתן את סכום הערכים שהוצפנו במקור.]]
שיטת CKKS פורסמה לראשונה במאמר משנת 2017,
Homomorphic Encryption | author1=Jung Hee Cheon |author2=Kyoohyung Han |author3=Andrey Kim | |author4=Miran Kim |author5=Yongsoo Song| publisher=Springer, Cham | journal=Annual International Conference on the Theory and Applications of Cryptographic Techniques |year=2018}}}}
Homomorphic Encryption | author1=Hao Chen |author2=Ilaria Chillotti |author3=Yongsoo Song| publisher=Springer, Cham | journal=Annual International Conference on the Theory and Applications of Cryptographic Techniques |year=2019}}}}. פרסומים נוספים הציגו דרכים שונות לשפר את הביצועים והדיוק של סְכֶמַת ה-CKKS המקורית, וכיום הסְכֶמָה ממומשת ברוב הספריות המציעות שירותי הצפנה הומומורפית, כמו HEAAN (הראשונה להציע מימוש של CKKS), Palisade, SEAL, HElib, ועוד (ראו ברשימת הקישורים למטה).
==המרכיבים העיקריים של סכמת CKKS==
ההסבר להלן נועד לתת הבנה כללית על שיטת CKKS ואינו מוצג באופן מתמטי
כמו בשיטות הצפנה הומומורפיות אחרות, CKKS מבצעת חישובים על וקטורים גדולים של [[מספר מרוכב|מספרים מרוכבים]] בבת-אחת, למשל בספרית SEAL ניתן להצפין ווקטור של עד 16,384 איברים. במקרה של CKKS המספרים שבווקטור המוצפן הם [[מספר מדומה|מספרים מדומים]]. כל הצפנה מצפינה ווקטור אחד שכזה ופעולות החישוב מבוצעות על הצפנה בודדת או על זוג הצפנות כשהפעולה מבוצעת איבר-איבר. למשל חיבור של שני צפנים עם 16,384 איברים יתן הצפנה חדשה של וקטור עם 16,384 איברים שבו כל איבר הוא סכום האיברים התואמים בווקטורים של ההצפנות המחוברות. ישנן גם פעולות הפועלות על הצפנה בודדת, כמו למשל פעולת הרוֹטַציָה המסובבת את איברי
סְכֶמַת CKKS מחזיקה את ההצפנות בצורה של [[פולינום|פולינומים]], ובאופן מדויק יותר של פולינומים ב[[חוג מנה|חוג המנה]] מעל [[פולינום ציקלוטומי]] עם מקדמים שלמים בחוג השאריות מודולו q כלשהו. כך, כל החישובים ההומומורפים המבוצעים על ההצפנות הם חיבורים והכפלות של פולינומים מעל חוג המנה הזה. במילים פשוטות יותר אולי, אם במהלך החישוב מתקבל מקדם פולינום גדול מ-q אז יש להשאיר רק את השארית שלו אחרי חלוקה ב-q, ואם מתקבל פולינום הגדול מפולינום המנה אז יש להשאיר רק את השארית של הפולינום כולו אחרי חלוקה שלו בפולינום המנה.
תהליך ההצפנה פותח בשלב ה'''קידוד''' שבו הווקטור עם המספרים המרוכבים המיועדים להצפנה מקודד כפולינום עם מקדמים שלמים. שלב הקידוד נועד בעיקר לאפשר את שלבי ההצפנה והחישוב הבאים בתור, ואשר פועלים כאמור על פולינומים, ואינו מבטיח את סודיות הנתונים המקודדים כלל וכלל. כל הסודיות של הצופן מושגת בשלב ההצפנה הבא לאחר שלב הקידוד.
===שלב הקידוד המוקדם ופתיחת הקידוד הסופי===
סְכֶמָה שהוגדרה להצפין וקטורים עם n איברים תקודד את הווקטור כפולינום עם 2n מקדמים שלמים (כלומר מדרגה 2n-1). הפולינום המקודד הוא הפולינום (היחידי) שכאשר מציבים בו את 2n [[שורש יחידה|שורשי היחידה הפרימיטיבים]] המרוכבים מסדר 4n מקבלים את n האיברים שבמערך המוצפן, ועוד n איברים השווים ל[[שדה המספרים המרוכבים|צמודים]] (conjugates) של אותם איברים מוצפנים. בגלל התכונות המיוחדות של שורשי היחידה ניתן למצוא ביעילות את הפולינום המקודד (בעזרת שיטות המבוססות על [[התמרת פורייה]]). כאשר רוצים "לפתוח" את הקוד, כלומר להמיר בחזרה את הפולינום לווקטור של מספרים מרוכבים, ניתן להציב את n שורשי היחידה הפרימיטיבים הראשונים בתוך הפולינום ולקבל את n האיברים של הווקטור (אין צורך להציב את שאר n שורשי היחידה בשלב זה, כי הצבתם תוביל באופן מיותר לקבלת הצמודים של n האיברים המפוענחים). גם שלב זה ניתן להאצה בעזרת שיטות המבוססות על התמרת פורייה.
'''
<math>(\frac{\sqrt{2}}{2},\frac{\sqrt{2}}{2}), (-\frac{\sqrt{2}}{2},\frac{\sqrt{2}}{2}), (-\frac{\sqrt{2}}{2},-\frac{\sqrt{2}}{2}), (\frac{\sqrt{2}}{2},-\frac{\sqrt{2}}{2})</math>. ניתן לראות שאמנם החזקה ה-8 של מספרים אלה היא 1, וששאר שורשי היחידה מסדר 8 (1, 1-, i, i-) אינם פרימיטיבים כייוון שהחזקה הקטנה ביותר שלהם המביאה אותם ל-1 הינה קטנה מ-8. כמו כן כשמציבים בפולינום את שורש היחידה הראשון <math>(\frac{\sqrt{2}}{2},\frac{\sqrt{2}}{2})</math> מקבלים את הערך המוצפן <math>3+4i</math>, וכשמציבים את שורש היחידה השלישי <math>(-\frac{\sqrt{2}}{2},-\frac{\sqrt{2}}{2})</math> מקבלים את הערך המוצפן <math>2-i</math>. כשמציבים את שורשי היחידה השני והרביעי מקבלים את הערכים הצמודים לערכים אלה. כמו כן, כיוון ששורשי היחידה כמובן גלויים לכל, הרי שאין צורך במפתח סודי כדי לפתוח את הפולינום המקודד ולקבל בחזרה את הערכים המוצפנים, וכפי שנאמר שלב הקידוד אינו תורם לבטיחות של סכמת ההצפנה.
הבעיה בפולינום
===הצפנה ופיענוח===
ב-CKKS המפתח הפרטי '''sk''' הוא פולינום (מעל חוג המנה שתואר למעלה) שבו המקדמים הם ערכים שלמים אקראיים ו"קטנים". למשל ברוב הספריות המממשות את CKKS כל המקדמים של sk הם 0, 1, או 1-. הפולינום שהתקבל בשלב הקידוד שתואר למעלה משמש כמסר המוצפן (ה-plaintext). ההצפנה של מסר (כלומר פולינום) m הוא זוג של פולינומים (a,b) כך ש <math> a + b * sk = m + e </math>, כאשר e הוא רעש קטן אקראי (החיבורים והכפלים המופיעים כאן הם פעולות על פולינומים מעל חוג המנה כפי שתואר למעלה). כלומר, מי שמחזיק בזוג הפולינומים של ההצפנה וגם ב-sk יכול בקלות לבצע את החישוב הנ"ל ולפענח את המסר המקורי m, עם רעש קטן.
השגיאה שבהצפנה היא חיונית ומוכנסת באופן מכוון כיוון שבלעדיה יהיה קל מדי לפענח את הצופן גם בלי sk. השגיאה הופכת את
===ביצוע חישובים הומומורפים על ההצפנות===
המטרה של סְכֶמַת הצפנה הומומורפית היא כאמור לאפשר חישוב על הנתונים המוצפנים בעזרת ביצוע חישובים על ההצפנות בלבד.
קל לראות למשל שאם
<math> a1 + b1 * sk = m1 + e1 </math> וגם
<math> a2 + b2 * sk = m2 + e2 </math> אז גם
<math> (a1+a2) + (b1+b2) * sk = (m1+m2) + (e1+e2) </math>.
במילים אחרות אם (a1,b1) מצפין את m1 ו- (a2,b2) מצפין את m2, אז (a1+a2,b1+b2) מצפין את m1+m2, והרעש גדל להיות עד סכום הרעשים של ההצפנות המחוברות. כך גם קל לראות שאם (a,b) מצפין את m, ו-w הוא מספר מרוכב כלשהו אז (a,b)*w מצפין את w*m. הכפלה של זוג הצפנות היא מורכבת מעט יותר ונעזרת במפתח פומבי נוסף שהונפק מראש למען מטרה זו. הכפלה גם מגדילה את הרעש שבתוצאה במידה ניכרת יותר, היא איטית יותר לחישוב, וגם יוצרת בעיות בתחזוקת הסְקָאלָה כפי שיתואר בסעיף הבא. לכן
מסר שהוצפן מורכב כאמור מזוג פולינומים, אך במהלך החישוב, מספר הפולינומים בהצפנה יכול לגדול. למשל אחרי כפל של ההצפנה (a1,b1) עם ההצפנה (a2,b2) תתקבל הצפנה (a3,b3,c3) המורכבת מ-3 פולינומים. כדי לפענח הצפנה שכזאת יש לחשב את
<math>a3+b3*sk+c3*sk^2</math>. באופן דומה ניתן גם להחזיק הצפנות עם מספר גדול יותר של רכיבים פולינומיים. הבעיה היא שמספר הרכיבים ילך ויגדל אחרי כל חישוב מכפלה, ויכביד על דרישות
==תחזוקת הסקאלה של הצופן ו-Bootstrap==
כפי שתואר למעלה, להצפנה צמודה סְקָאלָה מתאימה שמציינת את הפקטור שיש לחלק בו כדי לקבל את המסר המוצפן בסוף תהליך הפענוח ופתיחת הקוד. למשל את המסר שערכו 0.32 ניתן לייצג כמספר השלם 32 עם סְקָאלָה של 100, או באופן שקול גם כמספר השלם 320,000 עם סקאלה של 1,000,000. כשמכפילים זוג מספרים עם סקאלות, יש להכפיל גם את הסקאלות. כך למשל 32 עם סְקָאלָה של 100 (כלומר 0.32) מוכפל ב-4 עם סקאלה 1000 (כלומר 0.004) נותן 128 עם סקאלה 100,000 (כלומר 0.00128).
הבעיה היא שהחישובים על ההצפנות הם כאמור מודולארים מעל חוג שאריות של מספר q כלשהו, ולכן יש להקפיד שהערכים המוצפנים לא יחרגו מגבול זה. לכן מדי פעם יש להקטין את הסקאלה
בעיה קשה יותר הקשורה בתחזוקת הסקאלה, היא שמסתבר שאחרי rescale שמחלק את הערך ואת הסקאלה במידה כלשהי, נדרש לחלק גם את q (כלומר את הגבול העליון של הערכים) באותה המידה. כך
==אופטימיזציות מקובלת ל CKKS==
החישובים ההומומורפים המבוצעים
Approximate Homomorphic Encryption | author1=Jung Hee Cheon |author2=Kyoohyung Han |author3=Andrey Kim | |author4=Miran Kim |author5=Yongsoo Song| publisher=Springer, Cham | journal=International Conference on Selected Areas in Cryptography |year=2018}}}} המאפשרות ביצועים סבירים לחישובים שימושיים כמו [[למידת מכונה]] עם [[רשת עצבית|רשתות ניורונים]] מוצפנות, שירותי מסד נתונים מוצפן ועוד. אלה כוללות בין השאר:
* יצוג המקדמים הענקיים של הפולינומים
* יצוג הפולינומים רבי המקדמים בעזרת התמרת NTT (Number Theoretic Transform). זוהי התמרה של פולינומים עם מקדמים בחוג השלמים עם שארית, הדומה להתמרת פורייה ואשר מאפשרת כָּמוֹהָ
==קישורים חיצוניים==
שורה 70:
{{קריפטוגרפיה}}
{{ערך יתום}}
[[קטגוריה:מפתח ציבורי]]
|