חתימה דיגיטלית רבין

אלגוריתם חתימה דיגיטלית רבין הוא מנגנון חתימה דיגיטלית עם שחזור, המבוסס על הצפנת מפתח פומבי של רבין. אלגוריתם רבין מבוסס על הפונקציה החד-כיוונית הנובעת מהקושי שבבעיית שורש ריבועי מודולו שלם פריק. האלגוריתם הומצא על ידי פרופסור מיכאל רבין (האוניברסיטה העברית בירושלים) במהלך ביקורו כפרופסור אורח, במכון הטכנולוגי של מסצ'וסטס בשנת 1979. אלגוריתם חתימה דיגיטלית של רבין דומה לאלגוריתם חתימה דיגיטלית RSA ובנוי ממודולוס   n = p q {\displaystyle \ n=pq} כאשר   p {\displaystyle \ p} ו-   q {\displaystyle \ q} הם ראשוניים (גדולים), אולם כאן המעריך הפומבי   e {\displaystyle \ e} הוא שלם זוגי קטן   e = 2 {\displaystyle \ e=2} (בגרסה בסיסית). המפתח הפרטי של החותם הוא צמד הגורמים   ( p , q ) {\displaystyle \ (p,q)} , המפתח הפומבי הוא   n {\displaystyle \ n} . החתימה על המסר היא בעצם השורש הריבועי של המסר (לאחר המרתו למספר שלם בדרך מוסכמת) ואילו אימות החתימה הוא הבדיקה שאכן ערך זה הוא שורש ריבועי. הבדיקה האם שלם כלשהו הוא שורש ריבועי מודולו   n {\displaystyle \ n} קלה למדי בעוד שהפעולה ההפוכה קרי, מציאת שורש ריבועי מודולו   n {\displaystyle \ n} קשה מאוד, אם הגורמים הראשוניים שלו אינם ידועים. מרחב החתימה של המסר מוגבל לקבוצה   Q n {\displaystyle \ Q_{n}} (קבוצת השאריות הריבועיות מודולו   n {\displaystyle \ n} ). כלומר המסר חייב לייצג מספר שלם כזה שקיים עבורו שורש ריבועי מודולו   n {\displaystyle \ n} . הבעיה היא שלא כל מסר עונה על דרישה זו, יכול להיות מסר שעבורו יהיה בלתי אפשרי לחשב שורש ריבועי מודולו   n {\displaystyle \ n} . ניתן להתגבר על בעיה זו על ידי שרשור ערך אקראי קטן כלשהו למסר בתקווה שהתוצאה תהיה מספר שקיים עבורו שורש ריבועי מודולו   n {\displaystyle \ n} . בממוצע מספר הניסיונות הדרושים עד שיימצא ערך כזה הוא 2. בשל חיסרון מהותי זה אלגוריתם רבין הבסיסי המתואר להלן אינו מעשי כל כך. להלן מתוארת גרסה משופרת של אלגוריתם רבין המבוססת על אלגוריתם ויליאמס (H. C. Williams) המבטלת בעיה זו. בדומה ל-RSA גם אלגוריתם חתימה דיגיטלית של רבין מחייב שימוש בפונקציית יתירות בשל קיומה של בעיה מהותית הקרויה Existential forgery, כיוון שכל שלם   s ∈ Z n ∗ {\displaystyle \ s\in \mathbb {Z} _{n}^{*}} הוא חתימה תקפה עבור המסר   s 2   mod  n {\displaystyle \ s^{2}\ {\mbox{mod }}n} , זאת ללא ידיעת המפתח הפרטי של החותם. בשל כך תוקף פוטנציאלי עלול לזייף ערך כלשהו ולטעון כי בידו חתימה תקפה עליו. אף על פי שלתוקף לא תהיה שליטה מלאה על תוכנו של המסר החתום, עובדה זו מהווה איום בלתי מבוטל. החותם מכין מודולוס   n = p q {\displaystyle \ n=pq} כאשר   p {\displaystyle \ p} ו-   q {\displaystyle \ q} הם ראשוניים שונים וגדולים (ראו להלן). המפתח הפומבי הוא   n {\displaystyle \ n} המפתח הפרטי הוא הצמד   ( p , q ) {\displaystyle \ (p,q)} . מחשבים את   m ¯ = R ( m ) {\displaystyle \ {\bar {m}}=R(m)} (כאשר   R {\displaystyle \ R} היא פונקציית יתירות בטוחה כלשהי, ראו להלן) מחשבים את השורשים הריבועיים של   m ¯  mod  n {\displaystyle \ {\bar {m}}{\mbox{ mod }}n} , התוצאות הן   s 1 , s 2 , s 3 , s 4 {\displaystyle \ s_{1},s_{2},s_{3},s_{4}} . בוחרים אחד מארבעת הערכים האמורים כחתימה תקפה על המסר. בהינתן המפתח הפומבי   n {\displaystyle \ n} והחתימה   s {\displaystyle \ s} בודקים כדלהלן: מחשבים את   m ¯ = s 2  mod  n {\displaystyle \ {\bar {m}}=s^{2}{\mbox{ mod }}n} . בודקים אם   m ¯ {\displaystyle \ {\bar {m}}} נמצא בטווח המתאים (כלומר נמצא בטווח של פונקציית היתירות). משחזרים את המסר   m = R − 1 ( m ¯ ) {\displaystyle \ m=R^{-1}({\bar {m}})} (כלומר על ידי הפעלת הפונקציה ההפוכה של פונקציית היתרות   R {\displaystyle \ R} ). הערה: לצורך אימות החתימה לא נדרש המסר המקורי כיוון שאלגוריתם החתימה מאפשר שיחזור המסר המקורי. יהיו הפרמטרים הבסיסיים:   p = 199 {\displaystyle \ p=199} ,   q = 223 {\displaystyle \ q=223} , שניהם שקולים ל-   3 {\displaystyle \ 3} מודולו   4 {\displaystyle \ 4} , ויהיה   n = p q = 44377 {\displaystyle \ n=pq=44377} . מפתח החתימה אם כן הוא   ( 199 , 223 ) {\displaystyle \ (199,223)} מפתח האימות הוא   44377 {\displaystyle \ 44377} . כדי לחתום על המסר   m = 9604 {\displaystyle \ m=9604} , החותם מחשב את השורשים הרבועיים של   9604 {\displaystyle \ 9604} שהם:   s 1 = 98 , s 2 = 5673 , s 3 = 44279 , s 4 = 38704 {\displaystyle \ s_{1}=98,s_{2}=5673,s_{3}=44279,s_{4}=38704} . החותם בוחר אחד מהם נניח   s 3 = 44279 {\displaystyle \ s_{3}=44279} . כדי לאמת את החתימה המאמת מחשב את   m ′ = s 2  mod  n = 44279 2  mod  44377 = 9604 {\displaystyle \ m'=s^{2}{\mbox{ mod }}n=44279^{2}{\mbox{ mod }}44377=9604} . כיוון ש-   m ′ = m {\displaystyle \ m'=m} החתימה מתקבלת. גודל הראשוניים הוא גורם עיקרי בבטיחות האלגוריתם, בשל העובדה שפירוק המודולוס לגורמיו (כלומר מציאת   p {\displaystyle \ p} ו-   q {\displaystyle \ q} ), בעצם פורצת את האלגוריתם לחלוטין. על כן חובה שהם יהיו גדולים מספיק כדי לסכל ניסיון כזה. יכולת פירוק מספרים גדולים מצויה כיום בקצב שיפור תמידי, עקב שיפורים טכנולוגיים והתפתחויות בתורת המספרים, בעיקר באלגוריתמים לפירוק לגורמים (כמו אלגוריתם נפת שדה המספרים). ובשל איחוד משאבים וכוחות מחשוב כלל עולמיים, היכולת הזו הולכת ומתעצמת. הערכה זהירה מניחה כי נכון להיום מודולוס בגודל 2048 סיביות, נמצא דרגה אחת מעל היכולת הנוכחית ועל כן בטוח לפחות למשך מספר שנים. כאמור פונקציית יתירות היא מרכיב קריטי באלגוריתם רבין. על כן ישנה חשיבות רבה בבחירת פונקציית יתירות בטוחה ככל האפשר. תקן איזו ISO/IEC 9796 מפרט פונקציה כזו. הרעיון הוא שימוש בפונקציה Shaddow function אשר מבצעת תמורה על שני חלקי כל בית במסר (ארבע סיביות כנגד ארבע סיביות) לפי טבלה קבועה. תוצאת הפונקציה משולבת בין בתי המסר לסירוגין. קיימות מספר שיטות הוספת יתירות עבור חתימה דיגיטלית. בשל החיסרון האמור לעיל, פותחה גרסה משופרת של אלגוריתם רבין המבוססת על אלגוריתם וויליאמס, שמאפשרת לבנות את המסרים כך שיענו על הדרישה האמורה באופן דטרמיניסטי, כלומר שלכל מסר אפשרי יהיה שורש ריבועי מודולו   n {\displaystyle \ n} . גרסה זו הושאלה מגרסת הצפנת מפתח פומבי שהציע לשיפור RSA שלדבריו מספקת בטיחות מוכחת. שיטה זו אומצה בתקן איזו ISO/IEC 9796. הרעיון של וויליאמס הוא שעבור כל שלם   x ∈ Q n {\displaystyle \ x\in Q_{n}} הערך   x ( n − p − q + 5 ) / 8  mod  n {\displaystyle \ x^{(n-p-q+5)/8}{\mbox{ mod }}n} הוא שורש ריבועי של   x {\displaystyle \ x} מודולו   n {\displaystyle \ n} . לכן אם   d = ( n − p − q + 5 ) / 8 {\displaystyle \ d=(n-p-q+5)/8} אזי   x 2 d ≡ x   ( mod  n ) {\displaystyle \ x^{2d}\equiv x\ ({\mbox{mod }}n)} . אם   x {\displaystyle \ x} אינו שארית ריבועית מודולו   n {\displaystyle \ n} אזי   x 2 d  mod  n = n − x {\displaystyle \ x^{2d}{\mbox{ mod }}n=n-x} . עובדה זו מאפשרת שיפור אלגוריתם החתימה של רבין כדלהלן. מרחב המסר המיועד לחתימה הוא   { m ∈ Z n : m ≡ 6   ( mod  16 ) } {\displaystyle \ \{m\in Z_{n}:m\equiv 6\ ({\mbox{mod }}16)\}} כמו כן   m {\displaystyle \ m} חייב להיות קטן מ-   ( n − 6 ) / 16 {\displaystyle \ (n-6)/16} . כאשר פונקציית היתירות היא:   R ( m ) = 16 m + 6 {\displaystyle \ R(m)=16m+6} . בוחרים ראשוניים   p {\displaystyle \ p} ו-   q {\displaystyle \ q} המקיימים   p ≡ 3   ( mod  8 ) {\displaystyle \ p\equiv 3\ ({\mbox{mod }}8)} וכן   q ≡ 7   ( mod  8 ) {\displaystyle \ q\equiv 7\ ({\mbox{mod }}8)} מחשבים את   n = p q {\displaystyle \ n=pq} . המפתח הפומבי הוא   n {\displaystyle \ n} . המפתח הפרטי הוא   d = ( n − p − q + 5 ) / 8 {\displaystyle \ d=(n-p-q+5)/8} . מחשבים את   m ¯ = R ( m ) = 16 m + 6 {\displaystyle \ {\bar {m}}=R(m)=16m+6} . מחשבים את סימן יעקובי J = ( m ¯ n ) {\displaystyle J=\left({\frac {\bar {m}}{n}}\right)} . אם   J = 1 {\displaystyle \ J=1} מחשבים את   s = m ¯ d  mod  n {\displaystyle \ s={\bar {m}}^{d}{\mbox{ mod }}n} . אם   J = − 1 {\displaystyle \ J=-1} מחשבים את   s = ( m ¯ / 2 ) d  mod  n {\displaystyle \ s=({\bar {m}}/2)^{d}{\mbox{ mod }}n} . החתימה על המסר היא   s {\displaystyle \ s} . הערה: מעשית הסיכוי ש-   J {\displaystyle \ J} יהיה שווה אפס נמוך ביותר מאחר שמשמעות הדבר היא ש-   gcd ( m ¯ , n ) {\displaystyle \ {\mbox{gcd}}({\bar {m}},n)} הוא אחד הגורמים הראשוניים של   n {\displaystyle \ n} . מחשבים את   m ′ = s 2  mod  n {\displaystyle \ m'=s^{2}{\mbox{ mod }}n} . אם   m ′ ≡ 6   ( mod  8 ) {\displaystyle \ m'\equiv 6\ ({\mbox{mod }}8)} אזי   m ¯ = m ′ {\displaystyle \ {\bar {m}}=m'} . אם   m ′ ≡ 3   ( mod  8 ) {\displaystyle \ m'\equiv 3\ ({\mbox{mod }}8)} אזי   m ¯ = 2 m ′ {\displaystyle \ {\bar {m}}=2m'} . אם   m ′ ≡ 7   ( mod  8 ) {\displaystyle \ m'\equiv 7\ ({\mbox{mod }}8)} אזי   m ¯ = n − m ′ {\displaystyle \ {\bar {m}}=n-m'} . אם   m ′ ≡ 2   ( mod  8 ) {\displaystyle \ m'\equiv 2\ ({\mbox{mod }}8)} אזי   m ¯ = 2 ( n − m ′ ) {\displaystyle \ {\bar {m}}=2(n-m')} . מוודים ש-   m ¯ {\displaystyle \ {\bar {m}}} בטווח פונקציית היתירות, אם לא דוחים את החתימה. המסר משוחזר על ידי   m = R − 1 ( m ¯ ) {\displaystyle \ m=R^{-1}({\bar {m}})} (ההופכית לפונקציית היתירות) כלומר   m = ( m ¯ − 6 ) / 16 {\displaystyle \ m=({\bar {m}}-6)/16} . יהיו הפרמטרים הבסיסיים:   p = 227 {\displaystyle \ p=227} וכן   q = 223 {\displaystyle \ q=223} כאשר שניהם מקיימים את התנאים האמורים לעיל. ויהיה   n = p q = 50621 {\displaystyle \ n=pq=50621} . מפתח האימות הוא אם כן   50621 {\displaystyle \ 50621} ומפתח החתימה הוא   d = 50621 − 227 − 223 + 5 / 8 = 6272 {\displaystyle \ d=50621-227-223+5/8=6272} . נניח שהמסר המיועד לחתימה הוא   m = 1148 {\displaystyle \ m=1148} ולאחר הפעלת פונקציית היתירות:   m ¯ = R ( 1148 ) = 16 ⋅ 1148 + 6 = 18374 {\displaystyle \ {\bar {m}}=R(1148)=16\cdot 1148+6=18374} . בחישוב סימן יעקובי מתקבל   J = ( 18374 50621 ) = − 1 {\displaystyle \ J=\left({\frac {18374}{50621}}\right)=-1} . החתימה על המסר היא אם כן:   s = ( 18374 / 2 ) 6272  mod  50621 = 11621 {\displaystyle \ s=(18374/2)^{6272}{\mbox{ mod }}50621=11621} . כדי לאמת את החתימה הבודק מחשב את   m ′ = 11621 2  mod  50621 = 41434 {\displaystyle \ m'=11621^{2}{\mbox{ mod }}50621=41434} , כיוון ש-   m ′ ≡ 2   ( mod  8 ) {\displaystyle \ m'\equiv 2\ ({\mbox{mod }}8)} התוצאה תהיה   m ¯ = 2 ⋅ ( 50621 − 41434 ) = 18374 {\displaystyle \ {\bar {m}}=2\cdot (50621-41434)=18374} , הפעלת הפונקציה ההופכית נותנת   m ′ = R − 1 ( m ¯ ) = ( 18374 − 6 ) / 16 = 1148 {\displaystyle \ m'=R^{-1}({\bar {m}})=(18374-6)/16=1148} , כיוון ש-   m ′ = m {\displaystyle \ m'=m} החתימה מתקבלת. האלגוריתם המשופר מציע יתרון ברור על פני האלגוריתם המקורי בכך שהוא מציע דרך דטרמיניסטית לבניית המסר באופן שתמיד יהיה שורש ריבועי עבורו אולם עם אלגוריתם זה אין לחתום על מסר שלו סימן יעקובי   − 1 {\displaystyle \ -1} מאחר שזה מאפשר פירוק המודולוס לגורמיו. בטיחות אלגוריתם זה זהה לגרסה הבסיסית, בכך שניתן להוכיח כי הוא עמיד כפירוק לגורמים. וכמו בגרסה הבסיסית גם אלגוריתם זה סובל מ-Existential forgery כלומר קל למצוא   s {\displaystyle \ s} כלשהו אשר אחד מהערכים   s 2 , n − s 2 , 2 s 2 , 2 ( n − s 2 ) {\displaystyle \ s^{2},n-s^{2},2s^{2},2(n-s^{2})} מודולו   n {\displaystyle \ n} שקול ל-   6 {\displaystyle \ 6} מודולו   16 {\displaystyle \ 16} ואז   s {\displaystyle \ s} יהיה חתימה תקפה עבור   m = s 2  mod  n {\displaystyle \ m=s^{2}{\mbox{ mod }}n} . הגרסה המשופרת של אלגוריתם רבין מצריכה חישוב סימן יעקובי מלבד חישוב שורש ריבועי מודולו   n {\displaystyle \ n} ועל כן יעילה מעט פחות מהאלגוריתם הבסיסי. אולם מאפשרת שימוש במעריך שונה מ-2 בתנאי ש-   gcd ( e , ( p − 1 ) ( q − 1 ) / 4 ) = 1 {\displaystyle \ {\mbox{gcd}}(e,(p-1)(q-1)/4)=1} שאז בדומה ל-RSA העלאה בחזקת   e {\displaystyle \ e} תהיה תמורה ב-   Q n {\displaystyle \ Q_{n}} מה שמאפשר שחזור הערך המקורי בהינתן   d {\displaystyle \ d} . חתימה דיגיטלית הצפנת רבין פונקציית הצפנה וחתימה דיגיטלית עמידה כפירוק לגורמים, פרופסור מיכאל רבין, המכון הטכנולוגי של מסצ'וסטס, 1979. הספר Handbook of Applied Cryptography, לשימוש פרטי בלבד. H.C. Williams, A modification of the RSA public-key encryption procedure, IEEE Trans. Information Theory, IT-26, 726-729 (1980).