ריפוד אופטימלי להצפנה אסימטרית

בקריפטוגרפיה, ריפוד אופטימלי להצפנה אסימטרית (Optimal Asymmetric Encryption Padding) הוצע לראשונה על ידי מיהיר בלייר מאוניברסיטת קליפורניה בסן דייגו ופיליפ רוגווי מאוניברסיטת קליפורניה בדייוויס בשנת 1995. סכימת OAEP היא אלגוריתם שמכין את הקלט להצפנה באופן כזה שאפשר יהיה לנצל פונקציית הצפנה אסימטרית דטרמיניסטית כמו RSA ולקבל ביטחון סמנטי נגד התקפת מוצפן-נבחר תחת מודל אורקל אקראי.

==היסטוריה ורקע==
בכל הצפנה דטרמיניסטית, בהצפנה חוזרת של מסר נתון עם מפתח הצפנה זהה תמיד יתקבל טקסט מוצפן זהה. בשל עובדה זו היא אינה יכולה להחשב "בטוחה סמנטית", כי בעצם העובדה שכאשר מופיעים בלוקים מוצפנים זהים אפשר להסיק שהטקסטים המקוריים המתאימים להם היו זהים, מועבר ליריב פוטנציאלי מידע על סכימת ההצפנה שלא היה מושג בדרך אחרת, מה שמאפשר התקפת מוצפן-נבחר בתנאים מסוימים. מסיבה זו פונקציית הצפנה דטרמיניסטית כזו אינה ראויה לשימוש באופן ישיר אלא רק לאחר הכנת המסר על ידי סכימת ריפוד מתאימה הכוללת ערך אקראי כלשהו. הריפוד מבטיח שללא תלות במסר תמיד יתקבל בלוק שונה ועל כן תמיד יופק טקסט מוצפן שונה. תקן PKCS #1 גרסה v1.5 (הקודם) פירט שיטת ריפוד פשוטה כדלקמן: עבור מודולוס בגודל <math>2^{8k}</math> סיביות, להצפנת המסר <math>m</math>, בונים בלוק באורך <math>k</math> בתים (<math>k</math> נקרא כאן פרמטר ביטחון ונקבע על ידי פונקציית ההצפנה, למשל ב-RSA-1024 הוא <math>128</math>). הבלוק המורכב על ידי שרשור הערכים לפי הסדר הבא: <math>M=00 \ \| \ 02 \ \| \ r \ \| \ 00 \ \| \ m</math>, כאשר <math>m</math> הוא המסר המקורי המיועד להצפנה. מתחילים בבית אפס לאחריו בית שמכיל את הערך '02', לאחריו מחרוזת אקראית של שמונה בתים לפחות שאינם '00' שצריכה להיות שונה עבור כל מסר אך לא חייבת להיות סודית, אחריה בית אפס נוסף ולבסוף מצמידים את המסר <math>m</math>. את הבלוק שנוצר מצפינים לאחר מכן עם RSA כרגיל: <math>C=M^e\text{ mod }n</math>. לאחר פענוח, המפענח מוודא תחילה שהבלוק בנוי בפורמט הנכון, כלומר הערכים מופיעים לפי הסדר האמור, אם לא הוא דוחה את המסר המוצפן ומחזיר הודעת שגיאה, אם כן, מפרק את הבלוק למחרוזות המקוריות ומחלץ את המסר המקורי <math>m</math>.

בשיטה זו בידי המפענח יכולת בסיסית לאתר תקלות או שינויים זדוניים בטקסט המוצפן. היות שהתוצאה חייבת לעמוד בדרישות התקן, לא סביר שטקסט מוצפן שעבר "שיפוץ" בדרכו אל המקבל על ידי צד שלישי כלשהו (שהטקסט המקורי לא ידוע לו) יתקבל במבנה הנכון לאחר פענוח. על פניו נראה כאילו סכימת הריפוד הזו מספקת אימות עקיף והיא בטוחה סמנטית בשל תוספת האקראיות של <math>r</math>, דהיינו בכל הצפנה יתקבל טקסט מוצפן אחר וכן לפי זה היא אמורה להיות חסינה מפני התקפת מוצפן-נבחר. אולם ב-1998 הראה דניאל בלייכנבכר ממעבדות בל ששיטת ריפוד זו אינה בטוחה כלל ואפשר לפרוץ אותה על ידי שליחה של כ־<math>2^{20}</math> טקסטים מוצפנים לכאורה בהתקפת מוצפן-נבחר אדפטיבית, בהסתמך על יכולת המתקיף לקבל משוב מהמערכת. כלומר כדי שההתקפה תצליח צריך שלמתקיף תהיה גישה לשרת הפענוח והוא יכול לבקש פענוח של כל טקסט כרצונו. אם הטקסט אינו תואם PKCS מהסיבה שאינו בנוי בפורמט המתואר הוא אמור לקבל הודעת שגיאה. הודעת השגיאה במקרה זה משרתת את המתקיף כ"אורקל פענוח" איתו הוא יכול לנחש את הטקסט המוצפן בשיטה האדפטיבית, כלומר כל בקשת פענוח מסתמכת על תוצאות קודמות כדי לצמצם את טווח החיפוש עדי כדי אפשרות יחידה. ההתקפה הייתה הרסנית במיוחד כיוון ש-SSL הסתמך על סכמת הריפוד הזו וכתוצאה מכך הפך ללא בטוח כלל.

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

==מודל אורקל אקראי==

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

==סכימת OAEP==
המחרוזת <math>0^{k_1}</math> היא מחרוזת של <math>k_1</math> אפסים.
סכימת OAEP היא הסכימה הראשונה שמיישמת את מודל האורקל האקראי. היא יכולה לעבוד עם כל פונקציה חד-כיוונית עם דלת מלכודת (פונקציית הצפנה) <math>f</math> שמקבלת קלט ומחזירה פלט באורך <math>k</math> סיביות ופונקציית גיבוב בטוחה כלשהי שמקודדת כל <math>m</math> הקצר במעט מ-<math>k</math> ומשלבת אותו יחד עם ערך אקראי <math>r</math>. השיטה מסתמכת בנוסף גם על חוזקה של פונקציית הגיבוב. לצורך יישומה בפועל יש להגדיר פרמטר שלם <math>k_0 < k</math> ופרמטר <math>n=k-k_0</math> וכן שתי פונקציות כלליות: הראשונה מחולל אקראי <math>G: \{0,1\}^{k_0}\rightarrow\{0,1\}^n</math> שמקבל מחרוזת באורך <math>k_0</math> ומחזיר מחרוזת אקראית באורך <math>n</math> ופונקציה נוספת <math>H:\{0,1\}^n\rightarrow\{0,1\}^{k_0}</math> שמקבלת מחרוזת באורך <math>n</math> סיביות ומחזירה מחרוזת קצרה יותר באורך <math>k_0</math> (למשל אפשר להשתמש ב-<math>n</math> או <math>k_0</math> הסיביות הפחות משמעותיות של SHA-2 לפי הצורך). כדי לרפד את המסר <math>m\in\{0,1\}^n</math> בוחרים שלם אקראי <math>r</math> באורך <math>k_0</math> סיביות ומחשבים את:
:<math>\text{OAEP}(m)=m\oplus G(r) \ \| \ r\oplus H(m\oplus G(r))</math>

כאשר הסימן <math>\|</math> מסמל שרשור מחרוזות והסמל <math>\oplus</math> מייצג XOR. ההצפנה היא <math>c=f(\text{OAEP}(m))</math> והפענוח מבוצע בדרך דומה. הסכימה הבסיסית המתוארת הוכחה בטוחה על ידי בלייר ורוגווי בהנחה שפונקציית הגיבוב "אידיאלית". פירושו של דבר הוא שההנחה היא ש-<math>G</math> ו-<math>H</math> הן פונקציות רנדומליות המתנהגות כמו אורקל אקראי. כמובן שמעשית אי אפשר להניח כזו הנחה, אך הפונקציות הקיימות ידועות כמספיק חזקות כדי לבסס עליהן מערכת הצפנה מהיבט פרקטי. החסרון העיקרי בסכימה המתוארת שאינה "מודעת טקסט-מקור" (plaintext-aware). בהקשר של מודל אורקל אקראי "מודעות טקסט מקור" פירושה שכדי שתוקף יצליח לבנות טקסט מוצפן "תקף", דהיינו שהמקבל יצליח לפענחו במבנה הנכון לפי התקן עליו לדעת בהכרח טקסט מקור שמתאים לו. ניסיון לנחש מחרוזת סיביות כלשהי שלאחר פענוחה בפונקציית הפענוח עם מפתח הצפנה כלשהו, יתקבל טקסט מקור במבנה הנכון קשה לביצוע. ההשלכה היא שהסכימה הבסיסית אינה מוכחת כעמידה נגד התקפת מוצפן נבחר אדפטיבית (CCA2) אלא רק כנגד CCA1. בלייר ורוגווי הציעו גרסה נוספת (כמתואר בתרשים) שלטענתם "מודעת טקסט מקור" והיא פועלת כדלהלן:
:<math>\text{OAEP}(m)=m0^{k_1}\oplus G(r) \ \| \ r\oplus H(m0^{k_1}\oplus G(r))</math>.
כאשר <math>n=k-k_0-k_1</math> וכן <math>k_1</math> הוא פרמטר נוסף המקיים <math>k_0+k_1<k</math>. כאן בנוסף משרשרים מחרוזת של <math>k_1</math> אפסים למסר. ההצפנה והפענוח באותו האופן. וריאציה של הסכימה האחרונה שולבה למעשה בתקן PKCS#2 כסכימת ריפוד מחייבת עבור הצפנה עם RSA.

OAEP נחשבה עמידה כנגד התקפת מוצפן נבחר מסוג 2 אם כי המחברים לא סיפקו הוכחה פורמלית. ויקטור שופ הוכיח על ידי דוגמה נגדית שתחת מודל אורקל אקראי זה לא תמיד נכון. הוא הראה שקיימת פונקציה חד-כיוונית <math>g</math> שבה קל חשב את <math>g(x\oplus a)</math> מתוך <math>g(x)</math> ו-<math>a</math> מזה נובע שמבנה ריפוד OAEP אינו יכול להיות עמיד תמיד כנגד CCA2 עבור סתם פונקציה חד-כיוונית. מאידך הוא גם הוכיח כי עבור פונקציית RSA הסכימה שהוצעה טובה, וזאת רק בשל תכונה ספציפית ל-RSA (בהמשך).

==סכימת OAEP+==
תיאור שיטת OAEP+{{D}}
מהדוגמה שהובאה על ידי שופ נראה שכדי שהתקפה מסוג CCA2 תצליח, התוקף צריך להיות מסוגל לפחות חלקית להפוך את התמורה החד-כיוונית <math>f</math>. העובדה שפונקציה חד-כיוונית אינה מעידה בהכרח שהיא חד-כיוונית חלקית (partial domain one-way). פוג'יסאקי ואחרים הוכיחו שאם הפונקציה <math>f</math> היא חד-כיוונית חלקית הרי שסכימת OAEP תהיה בטוחה כנגד CCA2. הגדרה זו של פונקציה חד-כיוונית חלקית חזקה יותר מהגדרה של פונקציה חד-כיוונית רגילה. מסתבר שבשל תכונת ההומומורפיות של RSA היא נחשבת חד-כיוונית חלקית בהנחה שהיא חד-כיוונית. כמו כן שופ הוכיח פורמלית שאם המעריך (מפתח ההצפנה) של RSA שווה 3 סכימת RSA-OAEP בטוחה כנגד התקפת מוצפן נבחר מכל סוג, אולם יש הסבורים שמעריך קטן מהווה חולשה בפני עצמה לכן שופ הציע אלטרנטיבה משלו לסכימת OAEP והוכיח פורמלית שהיא בטוחה סמנטית כנגד התקפת מוצפן נבחר בהנחה שהפונקציה חד-כיוונית. הסכימה משתמשת בפונקציית יתירות משתנה <math>R(m,r)</math> במקום בקבוע המכיל אפסים ואחד בסוף. סכימת OAEP+ מורכבת מרשת פייסטל בשני סבבים עם שלוש פונקציות <math>G,H,R</math> כמתואר בתרשים:
:<math>s=(G(r)\oplus m) \ \| \ R(r \ \| \ m)</math>
:<math>t=H(s)\oplus r</math>
וההצפנה היא <math>c=f(s \ \| \ t)</math>. הפונקציות המוטמעות בסכימה הן: <math>G:\{0,1\}^{k_0}\rightarrow\{0,1\}^n</math> וכן <math>R:\{0,1\}^{n+k_0}\rightarrow\{0,1\}^{k_1}</math> וכן <math>H:\{0,1\}^{n+k_1}\rightarrow\{0,1\}^{k_0}</math>. הפונקציה <math>f</math> היא פונקציה חד-כיוונית שהיא תמורה הפועלת על <math>k</math> סיביות. הפרמטרים הנוספים מקיימים <math>k_0+k_1<k</math> וכן הערכים <math>2^{-k_0}</math> ו-<math>2^{-k_1}</math> צריכים להיות זניחים. המסר הוא לכל היותר באורך <math>n</math> סיביות כאשר <math>n=k-k_0-k_1</math>.

==סכימת SAEP==
תיאור שיטת SAEP
דן בונה הציע סכימת ריפוד דומה אך פשוטה יותר מזו של שופ והיא נקראת Simplified Asymmetric Encryption Padding. היא מתאימה להצפנת RSA או רבין. בסכימה זו אין מגבלה על המעריך, היא מורכבת מסבב בודד. אם המסר המיועד להצפנה הוא <math>m\in\{0,1\}^n</math> ו-<math>r\in\{0,1\}^{k_1}</math> הוא מחרוזת אקראית. הפונקציה <math>H:\{0,1\}^{k_1}\rightarrow\{0,1\}^{n+k_0}</math> והפונקציה <math>G:\{0,1\}^{n+k_1}\rightarrow\{0,1\}^{k_0}</math> הסכימה פועלת כדלהלן:
:<math>\text{SAEP}(m,r)=((m \ \| \ G(m \ \| \ r)\oplus H(r)) \ \| \ r</math>
פונקציית הריפוד המתוארת מבוצעת לפני ההצפנה, כדי להצפין מסר <math>m</math> כלשהו באורך <math>n</math> סיביות, תחילה בוחרים מחרוזת אקראית <math>r</math> באורך <math>k_1</math> סיביות ומחשבים את <math>y=\text{SAEP}(m,r)</math> ואז <math>C=y^e\text{ mod }N</math>. אם הפרמטרים <math>n, k_0,k_1</math> נבחרו כראוי הסכימה מוכחת כבטוחה נגד התקפת מוצפן נבחר אדפטיבית במסגרת מודל אורקל אקראי.

==ראו גם==
* RSA
* מודל אורקל אקראי

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

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

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