הצפנה הסתברותית

הצפנה הסתברותית (באנגלית: Probabilistic encryption) היא סכימת הצפנה סימטרית או אסימטרית שבה נוסף לתהליך ההצפנה אלמנט אקראי כך שהטקסט המוצפן המתקבל מאותו מסר יכול להיות שונה בכל הצפנה אפילו אם המפתח איתו הוצפן זהה, ואילו הפענוח תמיד דטרמיניסטי. באופן תאורטי, זוהי מכונת טיורינג הסתברותית שמצפינה את המסר הגלוי בהטלת מטבע, בניגוד לסכימות הצפנה דטרמיניסטיות כמו RSA או רבין שבהן הטקסט המוצפן נותר ללא שינוי אם המסר הגלוי והמפתח קבועים. המושג הוטבע לראשונה על ידי שפי גולדווסר וסילביו מיקאלי ב-1983 והדוגמאות המעשיות הראשונות הן הצפנת בלום גולדווסר וצופן אל-גמאל. מאז הפך המושג לאחד מיסודות ההצפנה המודרנית וסכימות רבות הומצאו בהשראתו. ידוע שכדי שסכימת הצפנה תחשב מוכחת כבטוחה סמנטית תחת מודל סיבוכיות סטנדרטי היא חייבת להיות הסתברותית, כיוון שבהצפנה דטרמיניסטית העובדה ששני טקסטים מוצפנים זהים משליכה בהכרח שטקסט המקור שלהם זהה, מכאן שמעט מידע מועבר ליריב ולכן אינה יכולה להיות בטוחה סמנטית. הוספת הסתברותיות (פסאודו-אקראיות) פותרת בעיה זו, כיוון שבסבירות מאוד גבוהה הצפנה חוזרת של בלוק טקסט מקורי תניב תוצאות שונות לחלוטין. אפשר להוסיף הסתברותיות גם לסכימות הצפנה דטרמיניסטיות כמו RSA על ידי ריפוד עם ביטחון תחת מודל אורקל אקראי (דוגמת OAEP).

==מידע חלקי==
הצורך בהצפנה הסתברותית נובע מבעיה מהותית שקיימת בכל סכימת הצפנה דטרמיניסטית המבוססת על פונקציה חד כיוונית עם דלת מלכודת. למשל אם נתונה פונקציה חד-כיוונית <math>f</math> כך שקל לחשב את <math>y=f(x) </math> אך קשה לחשב את הפונקציה ההופכית <math>x=f^{-1}(y)</math> ללא דלת המלכודת:

#אין הוכחה בהכרח שאם <math>f</math> חד-כיוונית יהיה תמיד קשה להפוך אותה גם כאשר <math>x</math> הוא בעל מבנה מיוחד. הדוגמה הכי פשוטה היא בהינתן פונקציית RSA ידוע שקל לחשב ערכים קטנים של <math>x</math> אם המעריך (מפתח ההצפנה) קטן, כך שהתוצאה אינה גדולה מהמודולוס.
#העובדה ש-<math>f</math> חד-כיוונית אינה מעידה בהכרח שלא ניתן לחלץ מידע חלקי לגבי <math>x</math>. לדוגמה אם <math>y\equiv g^x\text{ mod }p</math> כאשר <math>p</math> ראשוני ו-<math>g</math> הוא יוצר של <math>Z_p^*</math> אזי אף על פי שזו פונקציה חד כיוונית שקשה להפוך אם ל-<math>p-1</math> יש גורם ראשוני גדול, העובדה היא ש-<math>x</math> אינו מספר זוגי אם ורק אם <math>y</math> הוא שארית ריבועית מודולו <math>p</math> וקיים אלגוריתם הסתברותי יעיל להכריע אם מספר הוא שארית ריבועית מודולו מספר ראשוני כלשהו. לכן תמיד אפשר לדעת מהי הסיבית הפחות משמעותית של <math>x</math>.

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

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

הבעיה מוגדרת כדלהלן: נתון מודולוס <math>n</math> שהוא כפולה של שני ראשוניים <math>p,q</math> אם <math>x</math> זר ל-<math>n</math> אז <math>x</math> הוא שארית ריבועית (quadratic residue) ביחס למודולוס <math>n</math> אם למשוואה
:<math>x\equiv y^2\text{(mod }n)</math> 
יש פתרון שלם <math>y</math>, אחרת אמרים ש-<math>x</math> אינו שארית ריבועית (quadratic non-residue). ללא ידיעת הגורמים הראשוניים קשה להכריע בשאלה.

הסכימה הבאה מנצלת עובדה זו למערכת הצפנה. החיסרון שלה הוא שהטקסט המוצפן עבור כל סיבית מידע גדול (לפחות 1,024 סיביות). היא פועלת כדלהלן:

בהינתן פרמטר ביטחון <math>k</math> המשתמש A מכין את הפרמטרים הבאים:
#בוחר באופן אקראי שני מספרים ראשוניים <math>p_1</math> ו-<math>p_2</math> באורך <math>k</math> סיביות
#מחשב את <math>n=p_1p_2</math>
#בוחר שלם <math>y</math> כך ש-<math>y</math> אינו שארית ריבועית מודולו <math>n</math> ולו סימן יעקובי <math>+1</math>. 
#המפתח הפרטי הוא המספרים הראשוניים <math>p_1</math> ו-<math>p_2</math>
#המפתח הפומבי הוא הערכים <math>n</math> ו-<math>y</math>.

אם B רוצה להצפין עבור A מחרוזת סיביות של טקסט גלוי כלשהו <math>b={b_1,...,b_l}</math> באורך <math>l</math> סיביות הוא מבצע:
#עבור <math>i=1</math> עד <math>l</math>:
##בוחר שלם אקראי <math>r_i\in Z_n^*</math>
##אם <math>b_i=1</math> מציב <math>c_i=yr_i^2\text{ mod }n</math>
##אחרת אם <math>b_i=0</math> מציב <math>c_i=r_i^2\text{ mod }n</math>
#הטקסט המוצפן הוא <math>c=c_1,...,c_l</math>

לפענוח הטקסט המוצפן <math>c</math> המשתמש A מחשב כדלהלן:
#עבור כל סיבית <math>c_i</math> מציב <math>b_i=Q_n(c_i)</math>. כאשר <math>Q_n</math> הוא אלגוריתם פולינומי שמכריע בשאלה האם שלם כלשהו הוא שארית ריבועית מודולו מספר פריק שהגורמים הראשוניים שלו ידועים, (ראו סימן לז'נדר או מבחן אוילר). אם האלגוריתם מחזיר אמת הסיבית <math>b_i</math> היא '1' אחרת '0'.
#הטקסט המקורי הוא <math>b</math>.

סיבוכיות ההצפנה היא בסדר גודל <math>O(lk^2)</math> וסיבוכיות הפענוח היא <math>O(lk^3)</math> כאשר <math>k</math> הוא פרמטר הביטחון (אורך כל אחד מהמספרים הראשוניים בסיביות) ו-<math>l</math> אורך המסר <math>b</math> בסיביות.

אפשר לראות ש-<math>c_i</math> הוא שארית ריבועית מודולו <math>n</math> רק אם <math>b_i=0</math>. כיוון שקל לדעת אם מספר הוא שארית ריבועית מודולו מספר ראשוני אך קשה לעשות זאת מודולו מספר פריק, המשתמש הלגיטימי שהגורמים הראשוניים של <math>n</math> ידועים לו יכול בקלות לחשב את <math>Q_n(c_i)</math> ולגלות האם <math>b_i=0</math> או <math>b_i=1</math>. בגלל אקראיות <math>r</math> בכל פעם שתתבצע הצפנה של <math>b</math> יתקבל ערך אחר כך שהתוקף אינו יכול ללמוד מאומה מהתבוננות בטקסט המוצפן.

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

קטגוריה:הצפנה