תמורה פסאודו-אקראית

בקריפטוגרפיה, תְּמוּרָה פְּסֵאוֹדוֹ-אקראית (Pseudorandom Permutation) בקיצור PRP היא פונקציה שלא ניתן להבחין בינה לבין תמורה אקראית שנבחרה בהתפלגות אחידה מתוך משפחת כל התמורות בעלות תחום דומה. במילים אחרות PRP היא משפחה של תמורות המדמות אורקל אקראי באופן שלא קיים אלגוריתם יעיל שיכול להבחין עם יתרון משמעותי לפי הפלט, בין תמורה שנבחרה ממשפחה זו לבין תמורה אקראית. ההבדל היחיד בין תמורה פסאודו-אקראית לפונקציה פסאודו-אקראית הוא שבתמורה תמיד קיימת פונקציה הופכית.

אובייקט תאורטי דומה נקרא תמורה בלתי צפויה (unpredictable permutation) בקיצור UP. על בסיס פונקציה בלתי צפויה, תמורה בלתי צפויה היא תמורה שלא קיים אלגוריתם אקראי יעיל שיכול לחזות את ערכיה בדיוק גבוה באופן משמעותי מניחוש אקראי.

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

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

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

למעשה הטענה הבאה נכונה: אם <math>P</math> היא פרמוטציה פסאודו-אקראית אז היא גם פונקציה פסאודו-אקראית. אך מפני שבכל תמורה <math>P_k</math> מחייבת שתהיה גם פונקציה הופכית <math>P_k^{-1}</math>, עובדה זו יוצרת בעיה שלא קיימת בפונקציה פסאודו-אקראית, כי כעת צריך לוודא שהתמורה תהיה בטוחה גם אם למבחין גישה לאורקל הפונקציה ההופכית. מעצם ההגדרה של פונקציה פסאודו-אקראית לא בהכרח קיימת פונקציה הופכית. אם התמורה <math>P</math> היא בעלת תכונה כזו היא תקרא תמורה פסאודו-אקראית חזקה. בניסוח פורמלי:

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

===תמורה בלתי צפויה===
תמורה בלתי צפויה היא הגדרה קצת יותר חלשה מתמורה פסאודו-אקראית. היריב במקרה של תמורה בלתי צפויה הוא אלגוריתם הסתברותי שמקבל גישה לאורקל לשני הכיוונים, התמורה <math>P_k</math> והתמורה ההופכית <math>P_k^{-1}</math>. היריב מקבל אתגר <math>k</math> והוא מתבקש לנחש מה יהיה פלט הפונקציה <math>P_k</math>. הוא רשאי לבצע סדרה של שאילתות לאורקל למעט שאילתה בנוגע ל-<math>k</math>.

====הגדרה פורמלית====
אלגוריתם אקראי פולינומי ייקרא תמורה בלתי צפויה אם עבור כל מבחין הסתברותי פולינומי <math>A</math> שלא רשאי להגיש לאורקל שאילתה בנוגע לתחזית עצמה (התמורה), קיימת פונקציית זניחות כך שמתקיים:
<center>
:<math>\Pr[y=P_k(x)|k\leftarrow\{0,1\}^{c(n)};(x,y)\leftarrow A^{P_k,P_k^{-1}}(1^n)]=\text{negl}(n)</math>
</center>

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

לדוגמה, רשת פייסטל היא מבנה קריפטוגרפי פופולרי, שמקבל פונקציה חד-כיוונית לא הפיכה וממנה מייצר תמורה הפיכה עם מפתח. רשת פייסטל היא מבנה איטרטיבי הפועל כדלהלן. הקלט באורך <math>2n</math> סיביות מחולק לשני חצאים <math>R</math> ו-<math>L</math> (חצי ימני וחצי שמאלי בהתאמה) כל אחד באורך <math>n</math> סיביות, בהינתן פונקציה פסאודו-אקראית <math>f</math> שמקבלת את <math>k</math> וקלט באורך <math>n</math> ומחזירה פלט פסאודו-אקראי באורך <math>n</math> מבנה פייסטל מתבצע כך:
<center>
:<math>L_i=R_{i-1}, \ R_i=L_{i-1}\oplus f_i(k_i,R_{i-1})</math>
</center>
ברור שבמהלך הראשון המבנה המתואר אינו פסאודו-אקראי אפילו ש-<math>f</math> פסאודו-אקראית כי החצי השמאלי הוא למעשה חצי הקלט הימני ללא שינוי. וכן במהלך השני אפשר להראות שהפלט אינו פסאודו-אקראי כי קיים אלגוריתם פולינומי שיכול להבחין בינו לבין פלט אקראי. יש לזכור שבכל מהלך צריך מפתח שונה ובלתי תלוי במפתחות הקודמים. למרבה ההפתעה רשת פייסטל בשלושה מהלכים עם שלושה מפתחות שונים, נחשבת לפסאודו-אקראית אך לא פסאודו-אקראית חזקה. לעומת זאת הוכח שרשת פייסטל בארבעה מהלכים עם ארבעה מפתחות שונים נחשבת לתמורה פסאודו-אקראית חזקה, בהנחה שהפונקציה הפנימית נחשבת פסאודו-אקראית.

צריך לזכור שצופן בלוקים כשלעצמו אינו בטוח לשימוש לבד, אלא הוא רק "אבן בניין" שאיתה ניתן לבנות מערכת הצפנה בטוחה. לצורך המחשה, אם משתמשים בצופן בלוקים ישירות במערכת הצפנה, למשל המצפין שולח את <math>c=P_k(m)</math> למקבל, כאשר <math>P_k</math> הוא צופן בלוקים שמקבל את המפתח <math>k</math> איתו הוא מצפין את <math>m</math> ומחזיר את <math>c</math> (למשל AES). אפשר להוכיח שמערכת כזו לא תהיה עמידה נגד התקפת מוצפן-נבחר, מפני שהצפנה כזו היא דטרמיניסטית באופייה ולכן המתקיף יכול להבחין בקלות אם הוצפנו בלוקים זהים עם אותו מפתח. הבחנה זו חשובה ולא תמיד מושם עליה דגש כראוי. אחת הדרכים להתמודד עם חיסרון זה היא להשתמש בצופן הבלוקים במסגרת מצב הפעלה בטוח. קיימים מצבי הפעלה שונים של צופן בלוקים הכוללים בין היתר הצפנה מאומתת, כשכל אחד מהם מספק ביטחון בדרך שונה ובעל מאפיינים שונים בהתאם לסביבה, מידת האיום ואילוצי יעילות. במערכות הצפנה מודרניות נהוג לשלב אקראיות כדי לעמוד במודלים של ביטחון מחמירים יותר.

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

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

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