חשילות (קריפטוגרפיה)

בקריפטוגרפיה, חשילות (Malleability) היא מושג שהוטבע לראשונה בשנת 2000 על ידי דני דולב מהאוניברסיטה העברית, סינטיה דוורק מחטיבת המחקר של IBM ומוני נאור ממכון ויצמן והוא הרחבה של המושג ביטחון סמנטי בסכמות הצפנת מפתח פומבי, חתימה דיגיטלית ומפתח סימטרי. באופן פורמלי בהקשר של הצפנה, 'אי-חשילות' היא דרישה מחמירה של ביטחון סמנטי, שבהינתן טקסט מוצפן בלבד יהיה בלתי אפשרי לייצר טקסט מוצפן שונה, כך שקיים קשר או יחס כלשהו בין הטקסטים המקוריים המתאימים להם, זאת מבלי לפענחו. במילים אחרות לא ניתן להיעזר בטקסט המוצפן בשום צורה ישירה או עקיפה. התפישה הזו מתאימה גם בהקשר של סכמת התחייבות והוכחה באפס ידיעה. בהקשר של חתימה דיגיטלית הרעיון ידוע כ'זיוף קיומי' (Existential forgery) שהוא המקביל לחשילות. ביטחון סמנטי לעומת זאת רק מחייב שהתוקף לא יצליח ללמוד מהטקסט המוצפן בלבד שום מידע ישיר או עקיף אודות טקסט המקור שלא ניתן היה להשיג בדרך אחרת.

הוכח שאם סכמת הצפנה אי-חשילה, היא חסינה כנגד התקפת מוצפן-נבחר החזקה כפי שנוסחה לראשונה על ידי ראקוף וסימון, שבה בידי התוקף טקסט-מוצפן אותו הוא מעוניין לפענח וביכולתו להגיש באופן מקוון שאילתות ל'אורקל פענוח' לפענוח כל טקסט-מוצפן אחר שיבקש, למעט הטקסט המותקף. נהוג לסמנה CCA2 או CCA<sub>post</sub>. סכמות הצפנה דטרמיניסטיות כמו RSA, אינן עונות להגדרה זו ולכן לא חסינות כנגד התקפת מוצפן-נבחר. גם סכימות הסתברותיות כמו אל-גמאל ובלום-גולדווסר המוגדרות כבטוחות סמנטית, אינן עמידות כנגד התקפת מוצפן נבחר בהגדרה החזקה שלה.

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

==תיאור כללי==
חשילות בתחום המטלורגיה פירושה היכולת לעמוד בלחצים ולשנות צורה מבלי להישבר (או תכונת הפלסטיות). אפשר להמחיש את הרעיון החשילות בהקשר של קריפטוגרפיה על ידי מכרז. לצורך המשל נניח שהמשתתפים במכרז כלשהו יכולים להצפין את הצעותיהם על ידי פונקציית מפתח פומבי <math>E</math> של מפרסם המכרז, זאת כדי שאחרים לא יוכלו ללמוד על הצעותיהם לפני שיוגשו. האינטרס של כל מציע הוא ללמוד את הצעות המתחרים האחרים לפני שיגיש את הצעתו, כך שיוכל לדאוג ששלו תהיה הנמוכה מביניהם וסיכוייה להתקבל יהיו הגבוהים ביותר. תכונת החשילות במקרה זה היא שבהינתן ההצעה <math>E(A)</math> של המציע <math>A</math>, יהיה ביכולתו של המציע <math>B</math> (שרואה את <math>E(A)</math> כלומר את ההצעה המוצפנת בלבד) להציע את <math>E(B)</math> כך שיתקיים בסבירות גבוהה <math>E(B) < E(A)</math>, זאת מבלי לפענח את <math>E(A)</math>. ההנחה היא ש-<math>B</math> יכול לנסות הצפנה של ערכים שונים בשאיפה למצוא קשר כלשהו בינם ל-<math>E(A)</math> ובכך להצליח להגיש הצעה שתקיים את התנאי האמור בסבירות מסוימת, מבלי לדעת מה היא ההצעה בדיוק.

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

בצופן סימטרי ניתן לראות תכונת אי-חשילות בעיקר בפרוטוקול תקשורת כמו קרברוס שבו, המשתתפים <math>A</math> ו-<math>B</math> משתפים ביניהם מפתח הצפנה סימטרי <math>K</math> וכחלק ממהלכי הפרוטוקול <math>A</math> שולח ל-<math>B</math> מסר סתמי (Nonce) מוצפן <math>K_{AB}(N)</math> ומצפה לקבל בתגובה הצפנה של מסר אחר שהוא פונקציה פשוטה שלו: <math>K_{AB}(f(N))</math>, כאשר <math>f(x)=x+1</math> למשל. ביטחון הפרוטוקול מסתמך על הנחה (שלא הוכחה) שבהינתן רק הצפנת המסר הראשון, המתקיף לא יוכל לייצר את <math>K_{AB}(f(N))</math> כך שיתקבל כלגיטימי בעיני <math>B</math>. זוהי בדיוק אי-חשילות בהקשר זה.

בהקשר של הוכחת ידיעה ניתן להגדיר אי-חשילות באופן שהמוודא B לא יוכל להשתמש בהוכחה של A כדי להתחזות אליו כלפי צד שלישי E בדומה להתקפת אדם באמצע. כלומר B ישמש מעין 'תווך' שמעביר את כל ההוכחות שניתנות על ידי A ל-E וכן את כל האתגרים שמציב E בחזרה ל-A. בניסיון להוכיח ל-E שכביכול הוא (B) בעל הידיעה ובעצם להתחזות ל-A.

הגדרה של סכמת התחייבות היא, שצד הגון A המעוניין להתחייב לצד הגון B על קיומה של פיסת מידע כלשהי <math>\alpha</math> מבלי לחשוף בפניו את המידע עצמו. סביר להניח שעלול להימצא קשר או יחס כלשהו <math>R</math> בינו לבין ערך אחר נניח <math>\beta</math> שחושב על ידי צדדים רמאים C,D (שיכולים להיות גם A,B עצמם או אחד מהם), אותו נסמן <math>R(\alpha,\beta)</math>. אי-חשילות בהקשר זה תהיה התכונה שהפרוטוקול יוכל להבטיח שלא יהיה ניתן ליצור יחס <math>R</math> כזה, שלא ניתן היה לחישוב ללא גישה לצדדים ההגונים A ו-B אלא אם כן <math>\alpha=\beta</math>. הדברים האמורים נכונים גם אם A אינו מודע לקיומם של C או D או להפך. ניתן לראות שיש קשר הדוק בין סכמת התחייבות להוכחת אפס-ידיעה.

===הגדרה כללית===
לצורך הגדרה כללית המתאימה לכל תחומי ההצפנה המדוברים, נניח ש-<math>P</math> מתייחס לפרימיטיב קריפטוגרפי מאילו המנויים. נתון <math>GP</math> שהוא מחולל המייצר צמד מפתחות-הצפנה <math>(e,d)</math> (פומבי/פרטי בהתאמה). הפונקציה <math>E_e(b,r)</math> נקראת הצפנה של הסיבית <math>b\in \{0,1\}</math> ומחרוזת אקראית <math>r</math> באורך <math>p(n)</math> שהיא פונקציה כלשהי של הקלט <math>n</math> והפונקציה <math>D_d(c)</math> היא הפענוח. אזי עבור כל מחרוזת אקראית אפשרית <math>r</math> מתקיים <math>D_d(E_e(b,r))=b</math>. כאשר <math>b=0,1</math>. המערכת המתוארת תקרא בלתי ניתנת להבחנה (indistinguishability), אם עבור כל מכונה דמיונית <math>M</math>, קיים <math>c>0</math> המקיים:

<math>|\Pr[M(e,E_e(0,r))=1] - \Pr[M(e,E_e(1,r))=1]|<1/n^c</math>

הוכח שאי-יכולת הבחנה היא דרישה חשובה לצורך ביטחון סמנטי בהקשר של התקפת מוצפן-נבחר. בהקשר זה מציאת יחס <math>R(\alpha,\beta)</math> כלשהו שניתן להבחנה בין שני טקסטים מוצפנים <math>\alpha, \beta</math> אפילו בלא ידיעת מקורם, חשובה כשבירת הצופן. במילים אחרות עבור כל מתקיף אפשרי A קיים סימולטור A' כך שכל יחס <math>R(\alpha,\beta)</math> שניתן לחישוב על ידי A בעזרת פונקציה (רמז או היסטוריה כלשהי של <math>\alpha</math>) ניתן להפקה על ידי A' מבלי שתהיה לו גישה לתהליך ההצפנה.

לא ניתן לפתור את הבעיה על ידי חתימה דיגיטלית כלומר שהשולח יצרף את חתימתו למשלוח כך <math>E(m), S_A(E(m))</math>, כיוון שאם אלגוריתם ההצפנה E בר-חשילות אזי התוקף יכול להתעלם מהחתימה ולייצר את הערך <math>E(m+1), S_B(E(m+1))</math> כאשר <math>S_B</math> היא חתימת המתקיף. גם הכנסת החתימה בתוך הטקסט המוצפן לא תועיל.

===דוגמאות===
בצופן זרם בדרך כלל מבצעים XOR של סיביות הטקסט <math>m</math> עם פונקציה <math>S</math> של המפתח <math>k</math> ומתקבל <math>E(m)=m\oplus S(k)</math>. אפשר לראות שניתן בקלות ליצור הצפנה של המסר <math>m\oplus x</math> עבור כל <math>x</math> כיוון ש-<math>E(m)\oplus x=m\oplus x\oplus S(k)=E(m\oplus x)</math>.

ב-RSA המתקיף יכול לייצר הצפנה של <math>mx</math> מתוך <math>E_e(m)</math> עבור כל <math>x</math> כיוון שפונקציית ההצפנה <math>E_e(m)=m^e\bmod\ n</math> כאשר <math>e,n</math> הם מפתחות פומביים מקיימת את הזהות הבאה: <math>E_e(m)\cdot x^e\bmod\ n=(mx)^e\bmod\ n=E_e(mx)</math>. מסיבה זו נהוג לרפד את המסר לפני ההצפנה. בשני המקרים מתקבל מסר מוצפן אחר לגיטימי גם אם לא בהכרח בשליטה מלאה של התוקף.

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

==סכמת הצפנה בטוחה סמנטית כנגד התקפת מוצפן-נבחר==
כדי לבנות מודל כזה יש צורך להשתמש בסכמת הוכחת אפס-ידיעה בטוחה. הרעיון הוא ליצור קבוצה גדולה של מפתחות הצפנה ופענוח ולהשתמש רק בחלק מהם בהתאם לערך שמושג על ידי פונקציית גיבוב חד-כיוונית. כדי להבטיח שההצפנה תהיה עקבית, כלומר שמתקיף לא ניסה ערכים שונים על מנת לרמות את המערכת, משתמשים בסכמת התחייבות של הוכחת אפס ידיעה לא אינטראקטיבית, המאפשרת לוודא לאחר מעשה שהערכים מקיימים את התנאי שכל ההצפנות מתייחסות לערך זהה. המפתח הפומבי כולל שלושה מרכיבים, אוסף של זוגות מפתחות <math>\langle e_i^0,e_i^1\rangle</math>, כאשר <math>i=1,...,n</math>. מחרוזת אקראית <math>U</math> לצורך הוכחת אפס ידיעה. ומשפחה <math>H</math> של פונקציות גיבוב חד-כיווניות אוניברסליות. תהליך ההצפנה מורכב מארבעה שלבים:
#יוצרים זוג מפתחות חתימה דיגיטלית. מפתח אימות פומבי ומפתח חתימה פרטי. אפשר להשתמש בסכמה חד-פעמית.
#מצפינים את המסר באמצעות מספר מפתחות הצפנה מתוך הרשימה כפונקציה של ערך הגיבוב של מפתח האימות שמופק בשלב 1.
#מכינים הוכחת אפס-ידיעה (לא אינטראקטיבית) של עקביות ההצפנה, כלומר שלא הוצפנו ערכים שונים.
#חותמים על כל התוצאות באמצעות מפתח החתימה שהוכן בשלב 1.

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

===הכנת מפתחות===
#באמצעות המחולל GP מייצרים <math>2n</math> זוגות: <math>(e_i^0,d_i^0),(e_i^1,d_i^1)</math> כאשר <math>i=1,...,n</math>.
#מייצרים מחרוזת אקראית <math>U</math>
#מייצרים ערך אקראי <math>h\in_R H</math>

המפתח הפומבי הוא <math>n</math> זוגות: <math>\langle h,e_1^0,e_1^1,...,e_n^0,e_n^1,U\rangle</math>, המפתח הפרטי הוא: <math>\langle d_1^0,d_1^1,...,d_n^0,d_n^1\rangle</math>.

====הצפנה====
הקלט הוא המסר <math>m=b_1,...,b_k</math>
#מייצרים מפתחות חתימה דיגיטלית, כאשר <math>F</math> מפתח אימות פומבי ו-<math>P</math> מפתח חתימה פרטי.
#מחשבים את <math>h(F)</math> שהיא פונקציית גיבוב, כאשר התוצאה היא מחרוזת <math>n</math> סיביות <math>v_1,v_2,...,v_n</math>.
#עבור <math>1\le i\le k</math>
##עבור <math>1\le j\le n</math>
###בוחרים פונקציית גיבוב חד-כיוונית אקראית <math>r_{ij}{\in}_R\{0,1\}^{p(n)}</math>
###מחשבים את <math>c_{ij}=E_{e_j^{v_j}}(b_i,r_{ij})</math>. הצפנה של הסיבית <math>b_i</math> באמצעות מפתח ההצפנה <math>e_j^{v_j}</math>.
##באמצעות הוכחת אפס ידיעה של ערכי <math>c_i=e_1^{v_1},...,e_n^{v_n}</math> מייצרים את ההוכחות <math>p_i</math> באמצעות העדים <math>r_{i1},...,r_{in}</math>.
#מייצרים חתימה <math>s</math> על הרצף <math>(c_i,p_i)</math> כאשר <math>i=1,...,k</math>. והטקסט המוצפן הוא: <math>\langle F,s,(c_1,p_1),...,(c_k,p_k)\rangle</math>.

====פענוח====
#מוודים שהחתימה <math>s</math> תקפה באמצעות מפתח האימות הפומבי <math>F</math> שהתקבל ביחד עם המסר המוצפן.
#עבור <math>1\le i\le k</math> מוודים שערכי <math>c_i</math> עקביים באמצעות הוכחת אפס-הידיעה שניתנה (באמצעות הערכים <math>(p_1,...,p_k,U)</math>).
#מחשבים את <math>h(F)</math> כשהפלט הוא <math>v_1,...,v_n</math>.
#אם בדיקת אמיתות ההוכחה באפס ידיעה התקבלה עבור כל <math>k</math> הערכים אזי מחלצים את המסר באמצעות <math>\langle d_1^{v_1},...,d_n^{v_n}\rangle</math> עבור <math>1\le i\le k</math> כדי לקבל את <math>b_i</math>.

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

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