הצפנת פליאיי

הצפנת פֵּלִיאֵי (באנגלית: Paillier Encryption) היא סכימת הצפנה אסימטרית הסתברותית הומומורפית וחתימה דיגיטלית שהומצאה ב-1999 על ידי פסקל פליאיי (Pascal Paillier) לשעבר מחברת GEMPLUS לוקסמבורג. הצפנת פליאיי הומצאה בהשראת סכימות הצפנה הסתברותית כמו בלום גולדווסר והיא מבוססת על פונקציה חד-כיוונית עם דלת צונחת שנגזרת מבעיה בתורת המספרים הנקראת בעיית השאריות הפריקות (Composite Residuosity Class Problem) מודולו <math>\textstyle n^2</math> כאשר <math>n</math> מכונה "מספר RSA" (כפולה של שני ראשוניים שונים שווים בגודלם בקירוב).

==רקע מתמטי==
הבסיס התאורטי של המערכת הוא, בהינתן שלם <math>n=pq </math> כאשר <math>p</math> ו-<math>q</math> ראשוניים גדולים, שווים באורכם בקירוב והחבורה <math>\mathbb{Z}_n\times \mathbb{Z}_n^*\simeq \mathbb{Z}_{n^2}^*</math>, השלם <math>z</math> ייקרא שארית <math>n</math>-ית (ממעלה <math>n</math>) מודולו <math>n^2</math> אם קיים שלם <math>y\in \mathbb{Z}_{n^2}^*</math> המקיים
:<math>z=y^n\text{ mod }n^2</math>. 
קבוצת השאריות ה-<math>n</math>-יות היא תת-חבורה כפלית <math>\mathbb{Z}_{n^2}^*</math>. לכל <math>z</math> כזה קיימים בדיוק <math>n</math> שורשים ממעלה <math>n</math>. בעיית ההכרעה האם שלם נתון הוא שארית <math>n</math>-ית או לא, המסומנת בקיצור <math>\text{CR}[n]</math> (קיצור של Composite Residuosity) נחשבת לבעיה קשה ולא ידוע על אלגוריתם יעיל שיכול לבצעה בזמן פולינומי. סדר החבורה <math>\mathbb{Z}_{n^2}^*</math> הוא <math>n\phi(n)</math> כאשר <math>\phi(n)</math> היא פונקציית אוילר של <math>n</math>. 

הפונקציה <math>\mathcal{E}_g(x,y)</math> המוגדרת על ידי
:<math>(x,y)\mapsto g^xy^n\text{ mod }n^2</math> 
עבור <math>x\in \mathbb{Z}_n</math> ו-<math>y\in \mathbb{Z}_n^*</math> היא פונקציה חד-חד-ערכית ועל מעל החבורה <math>\mathbb{Z}_{n^2}^*</math> ביחס לבסיס <math>g\in \mathcal{B}</math> נתון. <math>g</math> הוא אלמנט מסדר <math>\alpha\cdot n</math> עבור מחלק <math>\alpha</math> כלשהו של <math>\phi</math>. הקבוצה <math>\mathcal{B}</math> היא קבוצת כל האלמנטים מסדר <math>n\alpha</math> עבור <math>\alpha=1,...,\phi </math> (לדוגמה אפשר לבחור <math>g=n+1</math> כש-<math>\alpha=1</math>). 

אפשר לראות שהפונקציה <math>w=\mathcal{E}_g(x,y)</math> הפיכה. כדי להפוך את הפונקציה מגדירים את <math>L(u)=(u-1)/n</math> שהיא פונקציה מעל תת-חבורה כפלית של השלמים מודולו <math>n^2</math> המקיימים <math>u\equiv 1\text{ mod }n</math>. שחזור הערכים <math>x,y</math> מתוך <math>w=\mathcal{E}_g(x,y)</math> מתבצע על ידי
:<math>x=\left ( \frac{L(w^{\phi}\text{ mod }n^2)}{L(g^{\phi}\text{ mod }n^2)} \right ) \text{ mod }n</math>
:<math>y=(wg^{-x})^{1/n}\text{ mod }n</math>

במקום <math>\phi </math> של <math>n</math> אפשר לעבוד עם פונקציית קרמייקל שהיא <math>\lambda(n)=\text{lcm}(p-1,q-1)</math>. זהו האקספוננט של חבורת אוילר ו-<math>\text{lcm}</math> היא כפולה משותפת מינימלית. שימו לב שלפי משפט קרמייקל עבור כל אלמנט <math>w\in \mathbb{Z}_{n^2}^*</math> מתקיים <math>w^\lambda\equiv 1\text{ mod }n</math> וכן <math>w^{n\lambda}\equiv 1\text{ mod }n^2</math>. בהמשך ייעשה שימוש ב-<math>\lambda</math> בכל המקומות בהן הופיעה פונקציית אוילר.

דלת המלכודת היא הגורמים הראשוניים או <math>\lambda</math>. כאשר הגורמים הראשוניים של <math>n</math> לא ידועים שחזור <math>x</math> מתוך <math>\mathcal{E}_g(x,y)</math> ואפילו להכריע האם <math>x=0</math> ללא <math>\lambda</math> נחשבים לבעיה קשה תחת המודל הסטנדרטי של סיבוכיות חישובית, בהנחה שפירוק לגורמים של <math>n</math> אינו מעשי. האחרונה נקראת בעיית הכרעה של השאריות הפריקות ומסומנת בקיצור DCRA.

==סכימות הצפנה וחתימה דיגיטלית==
על בסיס הרעיון האמור הצפנת פליאיי פועלת כדלהלן. יהי <math>n=pq</math> ויהי <math>g\in\mathcal{B}</math>, אפשר למצוא ערך כזה על ידי בדיקה אם
:<math>\text{gcd}(L(g^\lambda\text{ mod }n^2),n)=1</math>. הפונקציה <math>\text{gcd}</math> מייצגת מחלק משותף מקסימלי.
הערכים <math>n</math> ו-<math>g</math> יהיו מפתחות ציבוריים ואילו <math>p</math> ו-<math>q</math> יהיו המפתחות הפרטיים (במקום המספרים הראשוניים אפשר לשמור את <math>\lambda</math>).
בהינתן מסר <math>m</math> הנמוך מ-<math>n</math> להצפנה בוחרים שלם אקראי <math>r<n</math> ומבצעים:
:<math>c=g^m\cdot r^n\text{ mod }n^2</math>

לפענוח:
:<math>m=\frac{L(c^{\lambda}\text{ mod }n^2)}{L(g^{\lambda}\text{ mod }n^2)}\text{ mod }n</math>

או <math>L(c^{\lambda}\text{ mod }n^2)\cdot L(g^{\lambda}\text{ mod }n^2)^{-1}</math> מודולו <math>n</math>. הסכימה נחשבת הסתברותית בגלל <math>r</math> והיא בטוחה סמנטית כנגד יריב פסיבי, בהנחה שבעיית <math>\text{CR}[n]</math> היא בעיה קשה ושקשה לפרק את <math>n</math> לגורמים. סיבוכיות ההצפנה היא מסדר גודל של <math>O(|n|^3)</math> בקירוב.

===דוגמה במספרים קטנים===
לצורך המחשה הראשוניים יהיו <math>q=331</math>, <math>p=149</math>. לכן <math>n=49319 </math> ו-<math>n^2=243236376</math>. הערך <math>\lambda=\text{lcm}(148,330)=24420</math>. הבסיס נקבע ל-<math>g=n+1=49320</math>.
:מפתח ציבורי: <math>49319</math>.
:מפתח פרטי: <math>24420</math>. 

לצורך הצפנת המסר <math>m=12345 </math> בוחרים מספר אקראי נניח <math>r=47026</math> ואז מחשבים את <math>c=49320^{12345}\cdot 47026^{49319}\text{ mod }2432363761=159515031</math>. 

הטקסט המוצפן הוא אם כן <math>c=159515031</math>.

לפענוח תחילה מחשבים את <math>L(49320^{12345}\text{ mod }2432363761)=27172</math> וכן <math>L(47026^{49319}\text{ mod }2432363761)=24420</math>. 

ההופכי הכפלי של <math>24420</math> מודולו <math>49319</math> הוא <math>27388</math> לכן <math>m=27172\cdot 27388\text{ mod }49319=12345</math>.

===פרמוטציה חד-כיוונית עם דלת מלכודת===
להלן סכימה לא הסתברותית המבוססת חלקית על RSA שנקראת פרמוטציה חד כיוונית עם דלת מלכודת כאשר דלת המלכודת היא <math>\lambda</math>. והיא מסתמכת על בעיית <math>\text{CR}[n]</math> בהנחה שפירוק לגורמים של <math>n</math> היא בעיה קשה. למרות התלות ב-RSA הסכימה ראויה לציון בשל העובדה שפרמוטציות חד כיווניות עם דלת מלכודת (דוגמת RSA ורבין) הן אובייקטים נדירים וחשובים בקריפטוגרפיה מודרנית. 

להצפנה:
:תחילה מפצלים את המסר המיועד להצפנה <math>m</math> בדרך הפיכה כלשהי לשני חלקים <math>m_1,m_2</math>. למשל <math>m=m_1+nm_2</math>.
:מחשבים את <math>c=g^{m_1}m_2^n\text{ mod }n^2</math>

לפענוח:
:תחילה <math>m_1=\frac{L(c^{\lambda}\text{ mod }n^2)}{L(g^{\lambda}\text{ mod }n^2)}</math>
:מחשבים את ערך הביניים <math>c'=cg^{-m_1}\text{ mod }n</math>
:<math>m_2=(c')^{n^{-1}\text{ mod }\lambda}\text{ mod } n</math>
:ואז המסר הוא <math>m=m_1+nm_2</math>.
אפשר להשתמש בכל תמורה פומבית מוסכמת שממפה את <math>m</math> לערכים <math>m_1,m_2</math>. יש לשים לב שהסכימה הזו אינה הסתברותית, כלומר אינה מערבת שימוש במספר אקראי.

===חתימה דיגיטלית===
לצורך חתימה דיגיטלית תהי <math>h : \mathbb{N}\rightarrow \{0,1\}^k</math> פונקציית גיבוב קריפטוגרפית של המסר שתסומן בקיצור <math>h(m)</math>. עבור המסר <math>m</math> החותם מחשב את החתימה <math>(s_1,s_2)</math> כדלהלן:
:<math>s_1=\frac{L(h(m)^{\lambda}\text{ mod }n^2)}{L(g^{\lambda}\text{ mod }n^2)}\text{ mod }n</math>
:<math>s_2=(h(m)g^{-s_1})^{1/n\text{ mod }\lambda}\text{ mod }n</math>

מקבל החתימה יכול לוודא את תקפותה על ידי הבדיקה שמתקיים
:<math>h(m)=g^{s_1}s_2^n\text{ mod }n^2</math>

===הצפנה מהירה===
סכימות כמו RSA סובלות מחסרון בכך שהפענוח דורש זמן ואינו יעיל במונחי מחשוב. מסיבה זו מערכת הצפנה אסימטרית תהיה אטרקטיבית אם הפענוח יהיה מסדר גודל כמעט ריבועי ביחס ל-<math>n</math>. להלן גרסה שונה מעט שבה סיבוכיות הפענוח היא בסדר גודל של <math>O(|n|^{2+\epsilon})</math> עבור <math>\epsilon > 0</math> קטן כלשהו. הרעיון הוא להגביל את מרחב הטקסט המוצפן <math>\mathbb{Z}_{n^2}^*</math> לתת קבוצה <math><g></math> מסדר נמוך יותר. מסיבות של ביטחון <math>\lambda</math> צריך להיות כפולה של ראשוני גדול. בהינתן הבסיס <math>g\in\mathcal{B}_{\alpha}</math> עבור <math>1\le\alpha\le\lambda</math> כלשהו, הסכימה היא כדלהלן.

הצפנה:
:בוחרים אלמנט אקראי <math>r</math> הנמוך מ-<math>n</math>.
: מחשבים את <math>c=g^{m+rn}\text{ mod }n^2</math>

פענוח:
:<math>m=\frac{L(c^{\alpha}\text{ mod }n^2)}{L(g^{\alpha}\text{ mod }n^2)}\text{ mod }n</math>

הפעם דלת המלכודת מסתמכת על ידיעת <math>\alpha</math> כמפתח סודי במקום <math>\lambda</math>. צוואר הבקבוק בפעולת הפענוח הוא הפעולה <math>c^{\alpha}\text{ mod }n^2</math> שסיבוכיותה היא בסדר גודל <math>O(|n|^2|\alpha|)</math> בלבד. אם <math>g</math> נבחר באופן כזה ש-<math>|\alpha|=\Omega(|n|^{\epsilon})</math> אז כל תהליך הפענוח יתבצע עם <math>O(|n|^{2+\epsilon})</math> פעולות בסיביות. זהו מאפיין חשוב בהשוואה למערכת אסימטריות אחרות. אולם יש לשים לב שבמקרה זה המערכת לא מסתמכת על בעיית <math>\text{CR}[n]</math> כיוון שכעת ידוע שהטקסט המוצפן שייך לקבוצה <math><g></math>. הבעיה האחרונה, דהיינו לחשב את <math>x,y</math> בהינתן <math>w\in <g></math> נקראת בעיית הלוגריתם הבדיד 'חלקית' וגם היא משוערת כבעיה קשה.

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

==יעילות==
לפי ההמלצות המקובלות הראשוניים <math>p</math> ו-<math>q</math> צריכים להיבחר באופן שיהיה קשה לפרק את <math>n</math> לגורמים. הבסיס <math>g</math> יכול להיבחר באקראי (בגרסה המהירה יידרש טיפול שונה למשל להעלות אלמנט בחזקת <math>\lambda/\alpha</math>). כדי לשפר ביצועים אפשר לאמץ את שיטת CRT כמו ב-RSA, כלומר כל החישובים יתבצעו מודולו <math>p^2</math> ו-<math>q^2</math> בהתאמה והתוצאה הסופית תהיה חישוב מערכת המשוואות המודולריות המתקבלת באמצעות משפט השאריות הסיני שהוא זניח יחסית לפעולה של העלאה בחזקה מודולרית. אם בוחרים <math>g</math> קטן (כמו <math>g=2</math>) כל עוד הוא מקיים את ההגדרות של הסכימה, יתקבל שיפור נוסף בביצועים בסדר גודל של <math>1/3</math>. יתרה מזו <math>g</math> יכול להיות קבוע מה שמאפשר חישוב מוקדם כדי להאיץ ביצועים. בכללות כל הערכים הקבועים וכן חישוב <math>r^n</math> או <math>g^{nr}</math> יכולים להתבצע מראש. בפענוח חישוב הפונקציה <math>L(u)=(u-1)/n</math> ניתן לביצוע במחיר פעולת כפל אחת מודולו <math>2^{|n|}</math> על ידי חישוב מוקדם של הקבוע <math>n^{-1}\text{ mod }2^{|n|}</math>. הקבועים <math>L(g^{\lambda}\text{ mod }n^2)^{-1}\text{ mod }n</math> או <math>L(g^{\alpha}\text{ mod }n^2)^{-1}\text{ mod }n</math> בגרסה המהירה ניתנים לחישוב מראש.

כדי לנצל את משפט השאריות הסיני (CRT) לשיפור ביצועים, יש להגדיר את הפונקציות <math>L_p</math> ו-<math>L_q</math> כדלהלן: <math>L_p(u)=(u-1)/p</math> וכן <math>L_q(u)=(u-1)/q</math> בהתאמה. פענוח יתבצע כעת עם הקבועים הבאים אותם מחשבים מראש:
:<math>h_p=L_p(g^{p-1}\text{ mod }p^2)^{-1}\text{ mod }p</math>
:<math>h_q=L_q(g^{q-1}\text{ mod }q^2)^{-1}\text{ mod }q</math>

ואז תהליך הפענוח הוא כדלהלן:
:<math>m_p=L_p(c^{p-1}\text{ mod }p^2)h_p\text{ mod }p</math>
:<math>m_q=L_q(c^{q-1}\text{ mod }q^2)h_q\text{ mod }q</math>
:<math>m=CRT(m_p,m_q)\text{ mod }n</math>

כאשר CRT היא מימוש של פתרון מערכת הקונגרואנציות לפי משפט השאריות הסיני. ובגרסה המהירה יש להחליף את <math>p-1</math> ו-<math>q-1</math> ב-<math>\alpha</math>.

===מאפיינים והרחבות===
הצפנת פליאיי הורחבה למספר כיוונים. איוון דמגרד הציע גרסה שבה המודולוס הוא מהצורה <math>n^s</math> במקום בחזקת 2. וכן הוצעה גרסה מבוזרת (סכמת סף - threshold cryptography) וכן הוצע מימוש ב-ECC.

===הומומורפיזם===
סכימות ההצפנת פליאיי <math>m\mapsto g^mr^n</math> וכן <math>m\mapsto g^{m+nr}</math>, מודולו <math>n^2</math> הן הומומורפיות מהחבורה הכפלית <math>(\mathbb{Z}_{n^2}^*,\times)</math> לחבורה החיבורית <math>(\mathbb{Z}_n,+)</math>. בניסוח פורמלי עבור כל <math>m_1,m_2\in\mathbb{Z}_n</math> ו-<math>k\in\mathbb{N}</math>, פונקציית הצפנה <math>E</math> ופונקציית פענוח <math>D</math> בהתאמה, מתקיים
:<math>D(E(m_1)E(m_2)\text{ mod }n^2)=m_1+m_2\text{ mod }n</math>
:<math>D(E(m)^k\text{ mod }n^2)=km\text{ mod }n</math>
:<math>D(E(m_1)g^{m_2}\text{ mod }n^2)=m_1+m_2\text{ mod }n</math>

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

===הסתרה עצמית===
הסתרה עצמית (self blinding) היא התכונה שכל טקסט מוצפן ניתן לשינוי לטקסט מוצפן אחר מבלי שהשינוי ישפיע על הטקסט המקורי, בניסוח פורמלי עבור כל <math>m\in \mathbb{Z}_n</math> ו-<math>r\in\mathbb{N}</math> מתקיים 
:<math>D(E(m)r^n\text{ mod }n^2)=m</math>
:או
:<math>D(E(m)g^{nr}\text{ mod }n^2)=m</math> במקרה של ההצפנה המהירה.

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

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

פליאיי