סיבית קשה

בתורת הקריפטוגרפיה, סיבית קשה של פונקציה חד-כיוונית <math>\ f</math>, היא פונקציה <math>\ b(x)</math> בעלת פלט של סיבית אחת (זוהי הסיבית ה"קשה") שקשה לנחשה גם כאשר הערך <math>\ f(x)</math> ידוע.

== הגדרה ==
תהי <math>f: \{0,1\}^n \to \{0,1\}^n</math> פונקציה חד-כיוונית.
הפונקציה <math>b: \{0,1\}^n \to \{0,1\}</math> נקראת "סיבית קשה" של <math>\ f</math> אם מתקיימים התנאים הבאים:
# הפונקציה <math>\ b</math> ניתנת לחישוב בזמן פולינומי.
# לכל מכונת טיורינג הסתברותית <math>\ A</math>, ההסתברות לנחש את <math>\ b(x)</math> בהינתן <math>\ f(x)</math> זניחה,
<math display="block">\Pr_{x} \left[A\left(1^n,f(x)\right) = b(x)\right ] < \frac12 + \epsilon_n</math>
(כאשר <math>\ n=|x|</math>, ו-<math>\ \epsilon_n</math> היא פונקציה הקטנה מ-<math>\frac{1}{n^c}</math> לכל <math>\ c</math>, עבור <math>\ n</math> גדול דיו. ההסתברות היא על מרחב כלל הקלטים האפשריים, והטלת המטבעות של A.)

==שימושים ==
ביט-קשה של פונקציה חד-חד ערכית חד כיוונית, יכול לשמש עבור פרוטוקול התחייבות לביט, בו משתמש מתחייב לביט מסוים, מבלי לגלות מהו הביט. למשל, כאשר שני משתמשים (אליס ובוב), שאינם נמצאים זה ליד זה, רוצים להטיל מטבע יחדיו באופן אקראי, מבלי שאחד הצדדים יוכל לרמות.
פתרון אפשרי הוא שאליס תתחייב לביט מסוים <math>\ b(x)</math> על ידי שליחת הערך <math>\ f(x)</math>. כיוון שהביט הנ"ל הוא קשה בוב אינו יודע מהו הביט אליו אליס מחויבת. בוב ממשיך על ידי בחירת ביט אקראי <math>\ r</math>. כעת אליס מגלה את הערך <math>\ x</math>, ובוב בודק שאכן <math>\ f(x)</math> הוא הערך שאליס שלחה בהתחייבות, ומחשב את הביט שאליו אליס מחויבת, <math>\ b(x)</math>.

הביט שהוגרל בשיטה זו הוא <math>b(x)\oplus r</math>. שני הצדדים אינם יכולים לרמות: בוב אינו יודע את הערך של <math>\ b(x)</math>, ולכן אינו יכול להטות את התוצאה על ידי בחירת <math>\ r</math>. אליס אינה יכולה לשנות את התחייבותה, מכיוון שהפונקציה חד-חד ערכית ולכן, לפי הגדרה, לא קיים <math>\ x'</math> כך ש-<math>\ f(x')=f(x)</math>. מכאן נובע ששני הצדדים בחרו ביט מבלי לדעת מה האחר בחר, ולכן הביט הסופי הוא "הוגן".

שימוש נוסף עבור ביט-קשה הוא בניית מחולל פסבדו אקראי קריפטוגרפי. בהינתן גרעין <math>\ s</math> מפעילים עליו שוב ושוב את הפרמוטציה החד-כיוונית, ועבור כל הפעלה מחשבים את הביט-הקשה. המחרוזת הנוצרת מהביטים הקשים מהווה פלט פסבדו אקראי במובן הקריפטוגרפי. באופן פורמלי, המחולל <math>\ G(s)</math> ניתן לתיאור עלי-ידי
<math display="block">G(s) \equiv b(f(s))b(f^2(s))\ldots b(f^k(s))</math>
כאשר <math>k</math> הוא פולינומי באורך הקלט <math>\ s</math>, ו-<math>\ f^i(s)</math> משמעותו הפעלת הפרמוטציה <math>\ i</math> פעמים, לדוגמה <math>\ f^3(s) = f(f(f(s)))</math>.

== קיום ==
בשנת 1989, הוכיחו מדעני המחשב עודד גולדרייך ולאוניד לוין, שכל פונקציה חד-כיוונית ניתן לשנות לפונקציה חד-כיוונית בעלת סיבית קשה (חישובית).
בהינתן פונקציה חד-כיוונית <math>\ f</math>, נגדיר את הפונקציה <math>\ f'(x,r)=f(x),r</math> עבור <math>\ |f(x)|=|r|</math>. פונקציה זו היא חד-כיוונית והסיבית <math>\ b(x,r)=x\cdot r</math> היא סיבית קשה של <math>\ f'</math>.

ההוכחה מתבססת על כך שאם קיים אלגוריתם לניחוש הסיבית הקשה, ניתן להשתמש בו על מנת להפוך את הפונקציה החד-כיוונית <math>\ f'</math>: בהינתן <math>\ f(x)</math> האלגוריתם "מנחש" את ערך הביט-הקשה עבור כמות קטנה של ערכי <math>\ R</math>, (נאמר, <math>\ \log(n)</math> קלטים כנ"ל). בעזרת ניחוש זה ניתן לבנות קבוצה גדולה של ערכי <math>\ R</math> שהם בלתי-תלויים בזוגות.
אם קיימת מכונה אשר מגלה את הביט הקשה בהסתברות בלתי-זניחה, ניתן להפעיל את המכונה על הקבוצה הגדולה של ה-<math>\ R</math>ים, ולהשוות אל הערכים שניחשנו. משיקולים הסתברותיים, ניתן יהיה לזהות מהו הניחוש הנכון של הביטים הקשים עבור הקבוצה ההתחלתית הקטנה, בהסתברות בלתי-זניחה.
מכיוון שכל ערך <math>\ R</math> הוא פונקציה ליניארית של סיביות <math>\ x</math>, מספיקה ידיעת <math>\ \log (n)</math> ערכים בלתי-תלויים על מנת לחשב את כלל הסיביות של <math>\ x</math>.

==לקריאה נוספת==

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

קטגוריה:קריפטוגרפיה
קטגוריה:פסאודו-אקראיות