CKKS – הבדלי גרסאות
תוכן שנמחק תוכן שנוסף
אין תקציר עריכה |
אין תקציר עריכה |
||
שורה 3:
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 | 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}}}} {{הערה|שם=CKKS-BS2|{{Citation | title=Improved Bootstrapping for Approximate
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==
ההסבר להלן נועד לתת הבנה כללית על שיטת CKKS ואינו מוצג באופן מתמטי פורמאלי. כמו בשיטות הצפנה הומומורפיות אחרות, CKKS מבצעת חישובים על וקטורים גדולים של [[מספר מרוכב|מספרים מרוכבים]] בבת-אחת, למשל בספרית SEAL ניתן להצפין ווקטור של עד 16,384 איברים. במקרה של CKKS המספרים שבווקטור המוצפן הם [[מספר מדומה|מספרים מדומים]]. כל הצפנה מצפינה ווקטור אחד שכזה ופעולות החישוב מבוצעות על הצפנה בודדת או על זוג הצפנות כשהפעולה מבוצעת איבר-איבר. למשל חיבור של שני צפנים עם 16,384 איברים יתן הצפנה חדשה של וקטור עם 16,384 איברים שבו כל איבר הוא סכום האיברים התואמים בווקטורים של ההצפנות המחוברות. ישנן גם פעולות הפועלות על הצפנה בודדת, כמו למשל פעולת הרוֹטַציָה המסובבת את איברי הוקטור המוצפן במספר התזוזות הרצוי.
סְכֶמַת CKKS מחזיקה את ההצפנות בצורה של [[פולינום|פולינומים]], ובאופן מדויק יותר של פולינומים ב[[חוג מנה|חוג המנה]] מעל [[פולינום ציקלוטומי]] עם מקדמים שלמים בחוג השאריות מודולו q כלשהו. כך, כל החישובים ההומומורפים המבוצעים על ההצפנות הם חיבורים והכפלות של פולינומים מעל חוג המנה הזה. במילים פשוטות יותר אולי, אם במהלך החישוב מתקבל מקדם פולינום גדול מ-q אז יש להשאיר רק את השארית שלו אחרי חלוקה ב-q, ואם מתקבל פולינום הגדול מפולינום המנה אז יש להשאיר רק את השארית של הפולינום כולו אחרי חלוקה שלו בפולינום המנה.
===שלב הקידוד המוקדם ופתיחת הקידוד הסופי===
תהליך ההצפנה פותח בשלב הקידוד שבו הווקטור עם המספרים המרוכבים המיועדים להצפנה
'''דוגמא''': נניח שהווקטור המוצפן הוא באורך n=2, וכולל את זוג המספרים המרוכבים <math>3+4i</math>, <math>2-i</math>. הפולינום שמקודד זוג מספרים זה (יחד עם שני הצמודים שלהם <math>3-4i</math>, <math>2+i</math>) הוא <math>\ \frac{1}{4}(10+4\sqrt{2}x+10x^2+2\sqrt{2}x^3) </math>. ארבעת שורשי היחידה הפרימיטיבים מסדר
<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>.
הבעיה בפולינום שבדוגמא הוא שהמקדמים שלו אינם שלמים, כפי שנדרש ע"י הסְכֶמָה. לכן מכפילים את כל המקדמים בפקטור גדול מספיק ומעגלים את התוצאה. ככל שהפקטור גדול יותר, כך מאבדים פחות דיוק בשלב העיגול. למשל בדוגמא למעלה, אם נכפיל את המקדמים בפקטור 64 ונעגל, נקבל את הפולינום <math>\ 160+91x+160x^2+45x^3 </math>, שכל מקדמיו שלמים כנדרש. כמובן, שאם נפתח את הקידוד החדש ע"י הצבת שורשי היחידה נקבל ערכים גדולים פי 64, ולכן יש לקפיד ולחלק את הערכים הסופיים ב-64 בסוף שלב פתיחת הקידוד. בדוגמא למעלה הערכים המוצפנים כללו רכיבים שלמים (3, 4, 2, 1-), אבל שיטת הקידוד תעבוד גם כאשר הערכים המוצפנים כוללים רכיבים שאינם שלמים. צריך רק להקפיד ולהשתמש
===הצפנה ופיענוח===
CKKS היא סְכֶמַת הצפנה עם [[מפתח ציבורי]], כלומר מפתח ציבורי מאפשר לכל מי שמחזיק בו להצפין מידע, אך רק מי שמחזיק במפתח הפרטי יכול אח"כ לפענח את הצופן. במקרה של סכמות הצפנה הומומורפיות כמו CKKS, המפתח הפומבי מאפשר בנוסף לכך גם לבצע חישובים מעל ההצפנות (אך לא לגלות את תוצאת החישובים הללו). ב-CKKS המפתח הפרטי '''sk''' הוא פולינום (מעל חוג המנה שתואר למעלה) שבו המקדמים הם ערכים שלמים אקראיים ו"קטנים". למשל ברוב הספריות המממשות את CKKS כל המקדמים של sk הם 0, 1, או 1-.
הפולינום שהתקבל בשלב הקידוד שתואר למעלה משמש כמסר המוצפן (ה-plaintext). ההצפנה של מסר (כלומר פולינום) m הוא זוג של פולינומים (a,b) כך ש <math> a + b * sk = m + e </math>, כאשר e הוא רעש קטן אקראי (החיבורים והכפלים המופיעים כאן הם פעולות על פולינומים מעל חוג המנה כפי שתואר למעלה). כלומר, מי שמחזיק בזוג הפולינומים של ההצפנה וגם ב-sk יכול בקלות לבצע את החישוב הנ"ל ולפענח את המסר המקורי m, עם רעש קטן. השגיאה שברעש היא חיונית ומוכנסת באופן מכוון להצפנה כיוון שבלעדיה יהיה קל מדי לפענח את הצופן גם בלי sk. השגיאה הופכת את בעית הפענוח לבעיה קשה (השקולה לבעית [[Learning With Errors]] של [[עודד רגב (מדען מחשב)|עודד רגב]]). המפתח הפומבי '''pk''' מכיל מספיק מידע כדי לאפשר בקלות מציאת זוג פולינומים (a,b) שכאלה בהנתן m, והוא מכיל בתוכו
===ביצוע חישובים הומומורפים על ההצפנות===
שורה 36 ⟵ 37:
<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 פולינומים. כדי לפענח הצפנה שכזאת יש לחשב את
שורה 42 ⟵ 43:
==תחזוקת הסקאלה של הצופן ו-Bootstrap==
כפי שתואר למעלה, להצפנה
הבעיה היא שהחישובים על ההצפנות הם כאמור מודולארים מעל חוג שאריות של מספר q כלשהו, ולכן יש להקפיד שהערכים המוצפנים לא יחרגו מגבול זה. לכן מדי פעם יש להקטין את הסקאלה ע"י בצוע פעולת rescale הכוללת בין השאר את חלוקת הערך יחד עם הסקאלה שלו במספר כלשהו. כך כאמור את היצוג "320,000 עם סקאלה של 1,000,000" ניתן להחליף ביצוג השקול של "32 עם סקאלה של 100". בדוגמא הזו פעולת ה-rescale היתה מדויקת, אך בד"כ החלוקה הכלולה בפעולת ה-rescale גם דורשת עיגול הגורר אחריו רעש תואם. לכן הפרקטיקה המקובלת היא לדחות את פעולת ה-rescale עד כמה שניתן, כדי לחסוך בפעפוע השגיאה שיגביר את הרעש בהמשך החישוב. פעולת ה-rescale היא גם לעתים נחוצה כדי לאפשר חיבור בין הצפנות. בניגוד לכפל אשר ניתן לבצע בין זוג הצפנות בעלות סקאלות שונות (כמו בדוגמא למעלה), הרי שאי אפשר לחבר בין זוג הצפנות שכזה. לשם כך יש להקדים לפעולת החיבור את פעולת ה-rescale שתביא את הסקאלה של המחובר עם הסקאלה הגבוהה להיות שווה לסקאלה של המחובר השני.
בעיה קשה יותר הקשורה בתחזוקת הסקאלה, היא שמסתבר שאחרי rescale שמחלק את הערך ואת הסקאלה במידה כלשהי, נדרש לחלק גם את q (כלומר את הגבול העליון של הערכים) באותה המידה. כך בדוגמא שהובאה למעלה פעולת ה -rescale חילקה את הערך ואת הסקאלה שלו ב-10,000, ולכן אם q היה נניח מלכתחילה 1,000,000, הרי שאחרי ה-rescale הערך של q יקטן ל-100 ויגביל מאוד את החישוב בהמשך. לכן בד"כ מתחילים עם q גדול מאוד (למשל <math>2^{800}</math>), אבל בכל זאת אחרי מספיק מכפלות התקרה של q תרד נמוך מדי כדי לאפשר את המשך החישוב. כדי לאפשר חישוב בלתי מוגבל (כלומר סְכֶמַת הצפנה הומומורפית
==אופטימיזציות מקובלת ל CKKS==
החישובים ההומומורפים המבוצעים ע"י CKKS כוללים כאמור פעולות חיבור וכפל של פולינומים. פולינומים אלה בד"כ כוללים אלפים רבים של מקדמים, והמקדמים עצמם גם כן בד"כ גדולים מאוד. כך, החישוב ההומורמופי הוא איטי בכמה סדרי גודל יחסית לחישוב המקביל על הנתונים המקוריים שלא תחת הצפנה. מאז הפרסום המקורי של השיטה ב-2017 הוצעו ומומשו מספר אופטמיזציות ל-CKKS{{הערה|שם=CKKS-2|{{Citation | title=A Full RNS Variant of
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). זוהי התמרה של פולינומים עם מקדמים בחוג השלמים עם שארית, הדומה להתמרת פורייה ואשר מאפשרת כָּמוֹהָ להעזר באלגוריתם דמוי [[FFT]] כדי להאיץ את הפעולה של מכפלת זוג פולינומים מסיבוכיות <math>O(N^2)</math> לסיבוכיות <math>O(N\cdot\log{N})</math>.
|