הצפנת רבין

צופן רבין הוא שיטת הצפנה אסימטרית וחתימה דיגיטלית, שהומצאה על ידי פרופסור מיכאל רבין (האוניברסיטה העברית בירושלים) בהיותו אורח במכון הטכנולוגי של מסצ'וסטס (MIT) ב-1979. אלגוריתם רבין מבוסס על בעיית שורש ריבועי מודולו שלם פריק והוא אלגוריתם הצפנת מפתח-פומבי הראשון שהוכח מתמטית כי פיצוחו קשה כפתרון בעיית פירוק לגורמים של מספר שלם הנחשבת כבעיה חישובית קשה. ביתר פירוט, שחזור טקסט המקור מתוך הטקסט המוצפן עבור טקסט מקור שנבחר באקראי שקול מבחינה חישובית לפירוק לגורמים. (זאת בניגוד לפונקציית-RSA, שלגביה לא ידועה הוכחה דומה). הוכח אף כי מציאת הסיביות הראשונות בטקסט המקור (LSB) שקול לפירוק לגורמים. בדומה ל-RSA גם בשיטה זו מכינים מודולוס   n {\displaystyle \ n} שהוא כפולה של שני מספרים ראשוניים גדולים   ( p , q ) {\displaystyle \ (p,q)} . ההצפנה היא פשוט העלאת המסר בריבוע (מודולו   n {\displaystyle \ n} ) ואילו פענוח הוא חישוב שורש ריבועי מודולו   n {\displaystyle \ n} . אם הגורמים הראשוניים של   n {\displaystyle \ n} אינם ידועים זו בעיה קשה שעליה מסתמכת ההצפנה. מאידך אם הגורמים הראשוניים ידועים קל לפתור אותה, כיוון שמודולו p {\displaystyle p} ומודולו q {\displaystyle q} יש למספר ריבועי שני שורשים, ולפי משפט השאריות הסיני יש בסך-הכול ארבעה שורשים מודולו n {\displaystyle n} . מתוכם על המקבל להחליט בדרך כלשהי איזה מהם תואם את המסר שהוצפן. זהו חסרונה העיקרי של הצפנת רבין. ישנן מספר דרכים להתמודד עם בעיה זו כמו הוספת יתירות מכוונת, כפי שיובהר להלן. בוחרים שני מספרים ראשוניים אקראיים   p {\displaystyle \ p} ו-   q {\displaystyle \ q} (שווים בגודלם בקירוב). מחשבים את   n = p q {\displaystyle \ n=pq} . המפתח הפומבי הוא   n {\displaystyle \ n} והמפתח הפרטי הוא הגורמים הראשוניים (   p , q {\displaystyle \ p,q} ). להצפנת המסר   m {\displaystyle \ m} מחשבים את:   c = m 2  mod  n {\displaystyle \ c=m^{2}{\mbox{ mod }}n} לפענוח יש לחשב תחילה את השורשים הריבועיים של   c {\displaystyle \ c} כלומר לפתור את   c ≡ m 2   ( mod  n ) {\displaystyle \ c\equiv m^{2}\ ({\mbox{mod }}n)} (באמצעות הגורמים הראשוניים של n {\displaystyle n} ). התוצאה היא ארבעה פתרונות אפשריים   m 1 , m 2 , m 3 , m 4 {\displaystyle \ m_{1},m_{2},m_{3},m_{4}} . מה שנותר למקבל זה, להחליט בדרך כלשהי איזה מהם הוא הנכון. הגרסה המקורית של אלגוריתם רבין כפי שהוצגה לראשונה על ידי רבין שונה במעט. ההצפנה היא:   c = m ( m + b )  mod  n {\displaystyle \ c=m(m+b){\mbox{ mod }}n} . כאשר   b {\displaystyle \ b} מהווה חלק מהמפתח הפומבי. בטיחות השיטה המתוארת זהה למקורית. שיטת ההצפנה של רבין מבוססת על הקושי של הוצאת שורש ריבועי מודולו מספר שלם, השקולה לפירוק שלו. כדי למצוא שורש ריבועי מודולו שלם פריק, די לפרק תחילה את המספר לגורמיו הראשוניים ואז לחשב את הפתרונות עבור כל אחד מהם. חישוב שורש ריבועי מודולו מספר ראשוני קל יחסית מבחינה חישובית (קיימים מספר אלגוריתמים יעילים למטרה זו). השיטה הישירה לחישוב שורש ריבועי של השלם   a {\displaystyle \ a} מודולו   p {\displaystyle \ p} (ראשוני כלשהו) היא כדלהלן: בוחרים שלם אקראי   b {\displaystyle \ b} הנמוך מ-   p {\displaystyle \ p} כאשר   b 2 − 4 a {\displaystyle \ b^{2}-4a} אינו שארית ריבועית מודולו   p {\displaystyle \ p} , כלומר:   ( b 2 − 4 a p ) = − 1 {\displaystyle \ \left({\frac {b^{2}-4a}{p}}\right)=-1} , כמחצית האלמנטים ב-   Z p {\displaystyle \ \mathbb {Z} _{p}} עונים על דרישה זו, כך שנדרשים בממוצע כשני ניסיונות כדי למצוא   b {\displaystyle \ b} מתאים. הערה: הסוגריים במשוואה מייצגים סימן לז'נדר, שהוא פונקציה מעל   p {\displaystyle \ p} ו-   a {\displaystyle \ a} שהטווח שלה הוא   [ 1 , 0 , − 1 ] {\displaystyle \ [1,0,-1]} המסמנים האם   a {\displaystyle \ a} הוא שארית ריבועית מודולו   p {\displaystyle \ p} או לא (קיימים אלגוריתמים פולינומיים לחישוב סימן לז'נדר). מגדירים את הפולינום   f ( x ) = x 2 − b x + a {\displaystyle \ f(x)=x^{2}-bx+a} בשדה   Z p [ x ] {\displaystyle \ \mathbb {Z} _{p}[x]} . מחשבים את   r = x ( p + 1 ) / 2  mod  f {\displaystyle \ r=x^{(p+1)/2}{\mbox{ mod }}f} . התוצאה היא   ( r , − r ) {\displaystyle \ (r,-r)} . הערה: בחשבון מודולורי מספר שלילי   − r {\displaystyle \ -r} מודולו   n {\displaystyle \ n} מיוצג כ-   − r + n = n − r {\displaystyle \ -r+n=n-r} . סיבוכיות האלגוריתם המתואר היא   O ( lg   p ) 3 ) {\displaystyle \ O({\mbox{lg}}\ p)^{3})} . על כן הדרך העדיפה היא לבחור מספרים ראשוניים בעלי מבנה ייחודי המקל על חישוב השורש הריבועי, כפי שמובא במאמר של רבין. אם   p {\displaystyle \ p} מקיים   p ≡ 3   ( mod  4 ) {\displaystyle \ p\equiv 3\ ({\mbox{mod }}4)} כלומר   4 | ( p + 1 ) {\displaystyle \ 4|(p+1)} כנ"ל לגבי   q {\displaystyle \ q} , חישוב השורשים הריבועיים יהיה קל יותר באופן משמעותי, כדלהלן: באמצעות אלגוריתם אוקלידס המורחב מוצאים שלמים   a {\displaystyle \ a} ו-   b {\displaystyle \ b} המקיימים את משוואת אוקלידס:   a p + b q = 1 {\displaystyle \ ap+bq=1} . מחשבים את   r = c ( p + 1 ) / 4  mod  p {\displaystyle \ r=c^{(p+1)/4}{\mbox{ mod }}p} . מחשבים את   s = c ( q + 1 ) / 4  mod  q {\displaystyle \ s=c^{(q+1)/4}{\mbox{ mod }}q} . מחשבים את   x = ( a p s + b q r )  mod  n {\displaystyle \ x=(aps+bqr){\mbox{ mod }}n} . מחשבים את   y = ( a p s − b q r )  mod  n {\displaystyle \ y=(aps-bqr){\mbox{ mod }}n} . התוצאה היא:   ± x {\displaystyle \ \pm x} ו-   ± y {\displaystyle \ \pm y} (מודולו   n {\displaystyle \ n} ). שימו לב שבידיעת r {\displaystyle r} ו- s {\displaystyle s} אפשר לפרק את n {\displaystyle n} לגורמים כמו שציין רבין, כי   gcd ( | r − s | , n ) {\displaystyle \ {\mbox{gcd}}(|r-s|,n)} שווה לאחד הגורמים של n {\displaystyle n} . נבחר את הראשוניים   p = 211 , q = 227 {\displaystyle \ p=211,q=227} , (שניהם שקולים ל-   3 {\displaystyle \ 3} מודולו   4 {\displaystyle \ 4} , במילים אחרות   4 | 212 {\displaystyle \ 4|212} וכן   4 | 228 {\displaystyle \ 4|228} ). אז   n = p q = 47897 {\displaystyle \ n=pq=47897} , כך שהמפתח הפרטי של אליס הוא   ( 211 , 227 ) {\displaystyle \ (211,227)} , והמפתח הפומבי הוא   47897 {\displaystyle \ 47897} . (את הגורמים של 47897 אפשר למצוא בזמן קצר, אבל דוגמה זו ממחישה את עיקרי השיטה). בוב מעוניין להצפין את המסר   m = 23 {\displaystyle \ m=23} עבור אליס (למען הפשטות, נניח שהוא בוחר לבנות את המסר כמתואר להלן, כלומר משרשר את המסר פעמיים   m | | m = 2323 {\displaystyle \ m||m=2323} ), כדי להצפין את המסר הוא מחשב את   m 2  mod  n = 2323 2  mod  47897 = 31865 {\displaystyle \ m^{2}{\mbox{ mod }}n=2323^{2}{\mbox{ mod }}47897=31865} ושולח את   c = 31865 {\displaystyle \ c=31865} לאליס. כאשר אליס מקבלת את   c {\displaystyle \ c} היא מחשבת את השורשים הריבועיים שלו כדלהלן: מחשבת את   r = 31865 53  mod  211 = 209 {\displaystyle \ r=31865^{53}{\mbox{ mod }}211=209} , מחשבת את   s = 31865 57  mod  227 = 53 {\displaystyle \ s=31865^{57}{\mbox{ mod }}227=53} , מחשבת את משוואת אוקלידס   a p + b q   =   − 71 ⋅ 211 + 66 ⋅ 227 = 1 {\displaystyle \ ap+bq\ =\ -71\cdot 211+66\cdot 227=1} , מחשבת את   x = ( − 71 ⋅ 211 ⋅ 53 ) + ( 66 ⋅ 227 ⋅ 209 )  mod  47897 = 38189 {\displaystyle \ x=(-71\cdot 211\cdot 53)+(66\cdot 227\cdot 209){\mbox{ mod }}47897=38189} , מחשבת את   y = ( − 71 ⋅ 211 ⋅ 53 ) − ( 66 ⋅ 227 ⋅ 209 )  mod  47897 = − 45574 {\displaystyle \ y=(-71\cdot 211\cdot 53)-(66\cdot 227\cdot 209){\mbox{ mod }}47897=-45574} , כלומר   y = − 45574 + 47897 = 2323 {\displaystyle \ y=-45574+47897=2323} , אם כן, השורשים הריבועיים האפשריים של   31865 {\displaystyle \ 31865} מודולו   47897 {\displaystyle \ 47897} הם:   x = 38189 , y = 2323 , − x = 9708 , − y = 45574 {\displaystyle \ x=38189,y=2323,-x=9708,-y=45574} . אמנם אליס אינה יכולה לדעת מה שלח בוב אולם מהתבוננות בערכים שהתקבלו, קל לראות כי   y {\displaystyle \ y} נראה שונה מהיתר, בכך שהוא מורכב מערך שחוזר על עצמו פעמיים, משמע זהו הפתרון הנכון, על כן   m = y {\displaystyle \ m=y} . המשימה של תוקף פוטנציאלי, קרי שחזור   m {\displaystyle \ m} מתוך הטקסט המוצפן   c {\displaystyle \ c} היא בעיה קשה. למעשה בעיה זו נקראת בעיית שורש ריבועי מודולו שלם פריק. הבעיה הכללית מוגדרת כדלהלן: נתון שלם פריק   n {\displaystyle \ n} ו-   q ∈ Z n {\displaystyle \ q\in \mathbb {Z} _{n}} שהוא שארית ריבועית מודולו n {\displaystyle n} , מצא שלם   x {\displaystyle \ x} המקיים:   x 2 ≡ q   ( mod  n ) {\displaystyle \ x^{2}\equiv q\ ({\mbox{mod }}n)} . היכולת להוציא שורש ריבועי מודולו n {\displaystyle n} שקולה חישובית ליכולת לפרק את n {\displaystyle n} לגורמים. על כן, כל עוד בעיית פירוק לגורמים נותרת בעיה קשה, שיטת רבין תהיה בטוחה, בתנאי שהמודולוס הוא מספר גדול (כ-2,000 סיביות לפחות) כלומר מעבר ליכולת לפרקו לגורמים בזמן סביר. אם נסמן q = x 2 {\displaystyle q=x^{2}} (מודולו n {\displaystyle n} ) הוא 'שארית ריבועית'. משפט רבין אומר שאם אפשר למצוא שורש ריבועי של q {\displaystyle q} עבור 1% מכל השאריות הריבועיות ב- Z n {\displaystyle \mathbb {Z} _{n}} אזי אפשר לפרק לגורמים את n {\displaystyle n} בזמן פולינומי. ההוכחה היא, נניח שנתונה קופסה שחורה B {\displaystyle B} כך כאשר מזינים קלט q {\displaystyle q} מחזירה את השורש הריבועי שלו באחוז אחד מהמקרים, אזי אפשר לבצע את הניסוי הבא: בוחרים i {\displaystyle i} אקראי כלשהו ב- Z n {\displaystyle Z_{n}} ומזינים ל- B {\displaystyle B} את q = i 2 {\displaystyle q=i^{2}} (מודולו n {\displaystyle n} ) אם התוצאה אינה i {\displaystyle i} או − i {\displaystyle -i} אזי אפשר לפרק את n {\displaystyle n} בגלל העובדה שאם נתונים x , y ∈ Z n {\displaystyle x,y\in Z_{n}} כך שמתקיים x 2 ≡ y 2 {\displaystyle x^{2}\equiv y^{2}} אך x ≠ ± y {\displaystyle x\neq \pm y} (מודולו n {\displaystyle n} ) אזי Gcd ( n , x ± y ) {\displaystyle {\mbox{Gcd}}(n,x\pm y)} הוא גורם ראשוני לא טריוויאלי של n {\displaystyle n} . Gcd היא מחלק משותף מקסימלי. מספר הניסיונות הממוצע הוא 2, היות שכמחצית מהאלמנטים ב- Z n {\displaystyle Z_{n}} הם שורשים ריבועיים, מכאן שהסיכויים לפרק את n {\displaystyle n} הם 50%. לכן מספיק יהיה להוכיח שאפשר לפרוץ את הצפנת רבין רק ב-1% סיכויי הצלחה כדי לפרק את n {\displaystyle n} לגורמים ומכאן שאם פירוק לגורמים היא בעיה קשה, הצפנת רבין תהיה קשה גם היא. ההוכחה נכונה רק אם האלמנטים נבחרו באקראי. כלומר רק אם המסר שהוצפן נבחר באקראי בהסתברות שווה מתוך כל המסרים האפשריים. במציאות מסרים אינם לגמרי אקראיים, אם המסר הוא בעל יתירות מסוימת או מבנה מיוחד ייתכן שיהיה אפשר לנחש חלק ממנו או לקבל מידע מסוים לגביו למרות שחישוב שורש ריבועי מודולו n {\displaystyle n} היא בעיה קשה. למשל אפשר לנחש את הסיבית הנמוכה ביותר (LSB) באמצעות סימן יעקובי. לכן מעצם ההגדרה הצפנת רבין אינה בטוחה סמנטית. שיטת רבין מוכחת כבטוחה רק כנגד יריב פסיבי, אך פגיעה להתקפה אקטיבית שנקראת התקפת מוצפן-נבחר (שבה היריב מסוגל לבחור את הטקסט אותו הוא מעוניין להצפין). בהתקפה כזו היריב יכול לחשוף את הגורמים הראשוניים של   n {\displaystyle \ n} כדלהלן: היריב בוחר   m {\displaystyle \ m} אקראי כלשהו מחשב את   c = m 2  mod  n {\displaystyle \ c=m^{2}{\mbox{ mod }}n} ואז מבקש מהמקבל לפענח עבורו את   c {\displaystyle \ c} . מכיוון שהמקבל לא מכיר את   m {\displaystyle \ m} שנבחר על ידי התוקף יש סיכוי שהתוצאה שתוחזר לא תהיה   m {\displaystyle \ m} אלא אחת מהתוצאות האחרות האפשריות אם נקרא לתוצאה שהוחזרה   y {\displaystyle \ y} כאשר   y ≠ ± m {\displaystyle \ y\neq \pm m} אזי   gcd ( m − y , n ) {\displaystyle \ {\mbox{gcd}}(m-y,n)} הוא אחד הגורמים של   n {\displaystyle \ n} (הפונקציה gcd מייצגת מחלק משותף מרבי). בסוג כזה של התקפה מניחים כי התוקף מסוגל לדרוש מהצד המפענח (למשל שרת) לפענח עבורו כל מסר שידרוש. צופן רבין חשוף כמובן לאותן התקפות היעילות כנגד RSA. ניתן למנוע התקפות אילו על ידי בניית המסר באופן בטוח. השיטות הידועות לבניית מסרים (כמו OAEP) הנהוגות ב-RSA מתאימות גם להצפנת רבין. החסרון העיקרי של הצפנת רבין הוא בעובדה שתוצאת ההצפנה היא אחת מארבע אפשרויות (פתרונות שורש ריבועי מודולו   n {\displaystyle \ n} ), הבעיה היא לזהות איזו מהן היא הנכונה. ניתן בקלות להתגבר על מכשלה זו על ידי הוספת יתירות מסוימת למסר המקורי לפני ההצפנה. לדוגמה אם המסר המיועד להצפנה הוא מהצורה   m | | m {\displaystyle \ m||m} (|| מסמל שרשור) רוב הסיכויים שרק אחד מארבעת הפתרונות האפשריים יהיה בעל מבנה זה ועל כן ניתן יהיה לזהותו בקלות. שיטה זו תמנע את ההתקפות המתוארות. למשל אם התוקף יבקש לפענח את השורש הריבועי של   m 2 {\displaystyle \ m^{2}} שהוא עצמו הכין עם היתירות האמורה. המערכת תחזיר עבורו את   m {\displaystyle \ m} עצמו, עובדה שאין בה כל מידע חדש שעשוי לסייע לו בהתקפה. אולם יש לשים לב כי בשיטה זו ההוכחה כי הצפנת רבין שקולה לפירוק לגורמים לא תהיה תקפה. חתימה דיגיטלית רבין פונקציית הצפנה וחתימה דיגיטלית עמידה כפירוק לגורמים, פרופסור מיכאל רבין, המכון הטכנולוגי של מסצ'וסטס, 1979 On the hardness of the least-signficant bits of the RSA and Rabin functions – מאמר המראה כי גם לגלות את הסיביות הראשונות בשיטת רבין היא בעיה קשה כפירוק לגורמים