פונקציה פסאודו-אקראית

בקריפטוגרפיה, פוּנְקְצִיָּה פסאודו-אַקְרָאִית (באנגלית: Pseudo-random function) בקיצור PRF היא משפחה של פונקציות המדמות אורקל ראנדומלי באופן שלא קיים אלגוריתם יעיל שיכול להבחין עם יתרון משמעותי, בין פונקציה שנבחרה ממשפחה זו לבין אורקל אקראי אמיתי. היא נקראת כך משום שהיא אינה אקראית אמיתית אלא "מעין" אקראית או אקראית מדומה.

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

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

== מבוא והגדרה ==
מבחינה תאורטית תכונת פסאודו-אקראיות של פונקציה מתייחסת להתפלגות הסטטיסטית של משפחה של פונקציות. ביתר פירוט, נניח שקיימת פונקציה שמקבלת שני קלטים ומחזירה פלט כלשהו, היא נראית באופן כללי כך:
<center>
:<math>F:\{0,1\}^*\times\{0,1\}^*\longrightarrow\{0,1\}^*</math>
</center>
נניח שהקלט הראשון נקרא "המפתח" ומסומן באות <math>k</math>, באופן כללי אם קובעים את <math>k</math> מתקבלת "פונקציה עם מפתח" שמקבלת קלט באורך כלשהו ומחזירה פלט באורך כלשהו, כל מפתח מגדיר פונקציה אחרת ממשפחה של פונקציות. עבור מפתח קבוע הפונקציה היחידה <math>F_k:\{0,1\}^*\rightarrow\{0,1\}^*</math> המסומנת בקיצור <math>F_k(x)</math> מוגדרת רק בהינתן הפרמטר <math>k</math>. ללא הגבלת הכלליות, נניח שהפונקציה משמרת אורך כלומר היא חד-חד-ערכית ועל והמפתח, הקלט והפלט הם באורך <math>n</math> סיביות, בניסוח פורמלי <math>|F_k(x)|=|x|=|k|</math>, אם כי זה לא חובה. וכן חשוב לציין שהפונקציה חייבת להיות "יעילה", כלומר שניתנת לריצה בזמן פולינומי. וכן הפרמטר <math>k</math> נבחר באקראי, מסמנים זאת <math>k\leftarrow\{0,1\}^n</math> כאשר <math>n</math> הוא פרמטר ביטחון המייצג את אורך הקלט והפלט והמפתח בסיביות.

באופן אינטואיטיבי, הפונקציה <math>F_k</math> תקרא פסאודו-אקראית אם היא בלתי ניתנת להבחנה מפונקציה אקראית אמיתית <math>f</math> שנבחרה מקבוצת כל הפונקציות בעלות תחום וטווח דומים. במילים אחרות, לא קיים אלגוריתם פולינומי הסתברותי שיכול לזהות לפי הפלט אם מדובר ב-<math>F_k</math> עבור <math>k</math> אקראי כלשהו, או בפונקציה <math>f</math> שהיא פונקציה שנבחרה באופן אקראי מתוך קבוצת כל הפונקציות הממפות <math>n</math>-סיביות ל-<math>n</math> סיביות. יש לשים לב שמשתמשים כאן בביטוי "בחירת פונקציה" באופן אקראי בניגוד לבחירת מחרוזת באופן אקראי, שהן שתי הגדרות שונות לחלוטין.

מנקודת ראות מתמטית, נניח שנתונה קבוצה סופית <math>\text{Fnc}_n</math> המכילה אוסף של כל הפונקציות הממפות מחרוזות של <math>n</math>-סיביות למחרוזות של <math>n</math>-סיביות. בחירת פונקציה אחת מהאוסף באופן אקראי מקבילה לדגימה של אלמנט אקראי בהתפלגות אחידה מתוך קבוצה של אלמנטים. אפשר להמחיש זאת בדרך הבאה: נתונות טבלאות חיפוש גדולות שבהן בשורה <math>x</math> בטבלה מאוחסן הערך <math>f(x)</math>. עבור כל פונקציה <math>f</math> מתאימה טבלת חיפוש אחת שבה בדיוק <math>2^n</math> שורות, אחת עבור כל נקודה בתחום <math>\{0,1\}^n</math>, כל שורה מכילה מחרוזת באורך <math>n</math> סיביות ובסך הכול גודלה של הטבלה הוא <math>n\cdot 2^n</math> סיביות. למעשה אפשר לראות שהפונקציות בקבוצה <math>\text{Fnc}_n</math> מתאימות אחד-לאחד לטבלאות החיפוש. לכן גודלה של <math>\text{Fnc}_n</math> הוא בדיוק <math>2^{n\cdot 2^n}</math> מחרוזות באורך <math>n\cdot 2^n</math>. ההתפלגות של הפונקציה <math>f\in\text{Fnc}_n</math> היא מעל <math>2^{n\cdot 2^n}</math> פונקציות ואילו ההתפלגות של <math>F_k</math> היא מעל <math>2^n</math> פונקציות שונות לכל היותר ולמרות "התנהגות" זו, הן צריכות להראות על פניהן זהות בהתפלגותן עבור כל אלגוריתם הבחנה פולינומי.

לצורך המחשה במקרה ש-<math>n=2</math>, ישנן <math>2^2=4</math> אפשרויות שונות של קלט: <math>\{00,01,10,11\}</math> ולכן קיימות בדיוק <math>2^{2\cdot 2^2}=256</math> אפשרויות למפות 2 סיביות קלט לשתי סיביות פלט, אם בונים טבלה כזו גודלה הכולל יהיה בדיוק <math>2\cdot 2^2\cdot 256=2048</math> סיביות. לעומת זאת הפונקציה <math>F_k</math> עם מפתח באורך 2 סיביות, היא אחת מתוך ארבע פונקציות אפשריות בלבד, במילים אחרות יש רק ארבע אפשרויות שונות לבחירת מפתח באורך 2 סיביות. אם לא מגבילים את אורך המפתח, אז יש <math>4!=24</math> תמורות אפשריות באורך 2 סיביות או 24 מפתחות שונים.

===אורקל אקראי===

אורקל אקראי הוא מעין קופסה שחורה תאורטית המחזירה על כל שאילתה ייחודית תגובה אקראית אמיתית. המוסכמה היא שאם השאילתה כבר נשאלה בעבר האורקל חייב להגיב באופן זהה. דרך אחרת להציג זאת, בהינתן <math>n</math> שלם שהוא פרמטר ביטחון כלשהו, האורקל האקראי הוא מעין פונקציה <math>f</math> שנבחרה באקראי בהתפלגות אחידה מתוך תחום הפונקציות האקראיות המקבלות קלט <math>x</math> באורך <math>n</math> ומחזירה פלט <math>y</math> באורך <math>n</math> בניסוח רשמי <math>f(x)\to \{0,1\}^n</math>. הפונקציה ממפה כל שאילתה ללא תלות בקלט, לערך אקראי (קבוע) מתוך תחום הפונקציה. למשל עבור <math>x</math> נתון הפונקציה תמיד תחזיר את אותו <math>y</math>.

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

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

===מבחין===
מבחין (Distinguisher) של פונקציה פסאודו-אקראית הוא כלי תאורטי המאפשר להגדיר פסאודו-אקראיות של פונקציה במונחים של ניסוי אינטראקטיבי. אלגוריתם הבחנה D מקבל כקלט את הפונקציה הנדונה ומחליט האם היא אקראית אמיתית או פסאודו-אקראית. היות שלמעשה התחום של משפחת הפונקציות מעריכי (בסדר גודל של <math>n\cdot 2^n</math>) לא ניתן להגדיר את D כאלגוריתם הבחנה פולינומי, כי אי אפשר לסרוק את כל הערכים האפשריים בזמן פולינומי. ההגדרה המקובלת היא אלגוריתם הסתברותי שיש לו גישה לאורקל אקראי. D רשאי להגיש לאורקל (מספר פולינומי של) שאילתות עבור נקודות שונות <math>x</math> שיבחר והאורקל אמור להחזיר לו את <math>f(x)</math> של הנקודה <math>x</math>. בגמר הניסוי אלגוריתם ההבחנה עונה "1" אם הקלט שלו הוא אחת הפונקציות מהמשפחה הפסאודו-אקראית, או "0" אחרת.

====הגדרה פורמלית של פונקציה פסאודו-אקראית====
תהי <math>F:\{0,1\}^*\times\{0,1\}^*\longrightarrow\{0,1\}^*</math> פונקציה יעילה, הכוללת מפתח ומשמרת אורך. <math>F</math> תקרא פסאודו-אקראית אם עבור כל אלגוריתם הבחנה פולינומי D קיימת פונקציית זניחות <math>\text{negl}</math> כך שמתקיים:
<center>
:<math>|\Pr[D^{F_k(\cdot)}(1^n)=1]-\Pr[D^{f(\cdot)}(1^n)=1]|\le\text{negl}(n)</math>.
</center>
כאשר <math>k\leftarrow\{0,1\}^n</math> נבחר בהתפלגות אחידה וכן <math>f</math> היא פונקציה שנבחרה אקראית מקבוצת כל הפונקציות האפשריות הממפות מחרוזות של <math>n</math> סיביות ל-<math>n</math> סיביות.

-D יכול להתקשר עם האורקל בחופשיות, לכן הוא יכול לשאול שאלות באופן אדפטיבי ולהתאים את השאילתות על סמך תשובות קודמות. אולם ביכולתו לשאול רק מספר מוגבל של שאלות כי הוא כאמור רץ בזמן פולינומי. וכן חשוב לזכור ש-<math>k</math> אינו ידוע ל-D, כי אין כל היגיון לדרוש ש-<math>F_k</math> תהיה פסאודו-אקראית אם <math>k</math> ידוע. כל מה שהמבחין צריך לעשות במקרה כזה הוא להגיש לאורקל שאילתה בנקודה אפס (<math>x=0</math>), לקבל את <math>y</math> ולהשוות עם <math>y'=F_k(0)</math> וסיכויי ההצלחה שלו במקרה כזה הם כמעט 1 כי הסיכוי ש-<math>y'=y</math> במקרה של פונקציה אקראית אמיתית הוא <math>2^{-n}</math>. המשמעות היא שהטענה לפסאודו אקראיות תקפה רק באם <math>k</math> סודי. וכן הטענה שקשה למצוא <math>x</math> כך ש-<math>F_k(x)=0</math> נכונה רק אם <math>k</math> לא ידוע למבחין, אחרת אפשר להוכיח שקל למצוא קלט כזה.

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

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


===תמורה (פרמוטציה) פסאודו-אקראית===

באופן שקול, ניתן להגדיר משפחה של תמורות הפסאודו אקראיות בקיצור PRP. במקרה זה קיימות שתי דרישות נוספות:
# הפונציה <math>f</math> נדרשת להיות <math>f:\{0,1\}^n \to \{0,1\}^n</math>
# הפונקציה נדרשת להיות פרמוטציה.

בהגדרה זו, הקבוצה <math>U</math> היא קבוצת כלל הפרמוטציות בגודל <math>n</math> (קיימות <math>n!</math> פונקציות כאלו).

==בניית פונקציה פסאודו-אקראית עם מחולל פסאודו-אקראי==
בשנת 1986 הראו עודד גולדרייך, שפי גולדווסר וסילביו מיקלי כיצד ניתן לבנות פונקציה פסאודו-אקראית <math>f:n\to k</math> אם נתון מחולל פסאודו אקראי <math>G</math> כך שהפלט של המחולל <math>G</math> יהיה באורך כפול מגרעין האקראיות (seed) המוזן למחולל. הרעיון העומד מאחורי הבניה הוא להפעיל את המחולל שוב ושוב - בכל הפעלה כזו יתקבל פלט הארוך פי שניים מהקלט אל המחולל. חוזרים על הפעולה עד אשר מתקבל פלט באורך <math>k2^n</math>. כעת ניתן לחלק את פלט המחולל ל<math>2^n</math> חלקים שווים, כל אחד באורך <math>k</math>. פלט הפונקציה הפסאודו-אקראית <math>f(x)</math> הוא החלק שמספרו הסידורי הוא <math>x</math>. מכיוון שקיימים לכל היותר <math>2^n</math> ערכי <math>x</math> אפשריים, הרי שהפונקציה הפסאודו-אקראית מוגדרת היטב. אם ההפעלה החוזרת של המחולל מבוצעת בצורה יעילה (במבנה של עץ) מתקבל כי בנייה זו אפשרית בזמן פולינומי.

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

==שימושים==
===בניית סכמת הצפנה על ידי פונקציה פסאודו-אקראית===
אם נתונה לנו משפחת פונקציות פסאודו-אקראית, ניתן לעשות בה שימוש על מנת ליצור סכמת הצפנה פשוטה, ולהוכיח כי אם צד ג' יכול לפענח את המידע המוצפן - הרי הוא יכול להבדיל בין פונקציה פסאודו-אקראית לפונקציה אקראית, בסתירה להיות הקבוצה <math>F</math> פסאודו-אקראית.

על מנת להצפין את ההודעה <math>m</math>, מגרילים מספר כלשהו <math>i</math> ושולחים את המידע <math>ENC_k(m)=(i, f_k(i) \oplus m)</math>.

מפתח ההצפנה <math>k</math> קובע את הפונקציה <math>f_k(\cdot)</math> הספציפית בה עושים שימוש, מבין כלל הפונקציות במשפחה <math>F</math>.

אמנם סכמת הצפנה זו בטוחה במובן שלא ניתן לדעת מהי ההודעה <math>m</math> אם מביטים במידע המוצפן, אבל סכמה זו אינה בטוחה לחלוטין (במובן CPA) מכיוון שצד ג' יכול לשנות את המידע המוצפן כדי לייצר הצפנה חוקית של הודעה אחרת, <math>m'</math>.

בשנת 1985 הציעו מיכאל לובי וצ'ארלס ראקוף שיטה בה ניתן להשתמש בפונקציה פסאודו-אקראית על מנת לבנות צופן בלוקים הבטוח כנגד התקפת גלוי-נבחר (Chosen Plaintext Attack). השיטה מבוססת על מבנה פייסטל תלת-שלבי. באופן מפתיע, מבנה דומה בעל 2 שלבים בלבד אינו מספיק על-מנת ליצור סכמה בטוחה.

==ראו גם==
* אקראיות
* מחולל מספרים פסאודו-אקראיים
* מחולל מספרים פסאודו-אקראיים קריפטוגרפי

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

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