Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

‫מבוא לקריפטוגרפיה – הרצאה ‪1‬‬

‫נושא ההרצאה‪ :‬הצפנה‪ ,‬הצפנות היסטוריות‪ ,‬בטיחות מושלמת‬

‫הצפנה‬

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

‫‪ .key gen .1‬נבחר מפתח 𝐾 ∈ 𝑘‬

‫‪ .2‬הצפנה‪ 𝑐 ← 𝐸𝑛𝑐(𝑘, 𝑚), 𝐶 ← 𝐾 𝑥 𝑀 :‬ניתן גם לקבוע את הרנדומיות הספציפית בה נשתמש‬


‫להצפנה ואז )𝑟 ;𝑚 ‪.𝑐 = 𝐸𝑛𝑐(𝑘,‬‬
‫‪ .3‬פענוח‪𝑚 = 𝐷𝑒𝑐(𝑘, 𝑐) :‬‬

‫נרצה שההצפנה תעבוד על כללי נכונות‪:‬‬

‫𝑚 = )𝑚( 𝑐𝑛𝐸 𝑐𝑒𝐷 ‪∀𝑘 ∈ 𝐾, ∀𝑚 ∈ 𝑀:‬‬

‫הצפנות היסטוריות‬

‫כבר בתקופת רומא העתיקה‪ ,‬לפני ‪ 2000‬שנה‪ ,‬ראינו הצפנות על מנת להגן על מידע‪.‬‬ ‫‪-‬‬
‫הקריפטוגרפים ניסו להמציא שיטות חדשות להצפין ותוקפים ניסו למצוא בהן חולשות ולשבור אותן‬
‫– מעין משחק של חתול ועכבר‪ .‬הקריפטוגרפיה לא הייתה מדעית במיוחד‪ ,‬יותר סוג של אומנות‬
‫שעברה ממורה לתלמיד‪.‬‬
‫ב‪ 1940‬נעשה ניסיון ראשון ללמוד קריפטוגרפיה מדעית‪ .‬התיאוריה הייתה פסימית – האמינו שכל‬ ‫‪-‬‬
‫צופן ניתן לשבור‪.‬‬
‫בזכות תורת החישוביות‪ ,‬למדנו מה מחשב מסוגל או לא מסוגל לעשות‪ ,‬ולכן ב‪ 1976‬הוציאו דיפי‬ ‫‪-‬‬
‫והלמן מאמר על צופן חזק שלמחשב קשה לפרוץ‪.‬‬

‫צופן קיסר – לכל אות ב‪ ,plain text-‬נזיז אותה שלוש אותיות קדימה בא"ב בצופן‪ .‬למשל‪,‬‬

‫𝐹 → 𝑐 ‪ 𝑎 → 𝐷, 𝑏 → 𝐸,‬וכו'‪ .‬אין פה מפתח! לכן ההצפנה אינה בטוחה כלל‪ ,‬כי אם מגלים את אלג'‬
‫ההצפנה אפשר לפענח את ההודעה בקלות‪ .‬דבר זה מוביל אותנו לעיקרון קירכוף‪ :‬אסור לבסס בטיחות של‬
‫הצפנה ע"י הסתרת אלג' ההצפנה ‪ /‬פענוח‪ .‬נרצה שהסכמה תמיד תהיה פומבית‪ ,‬כאשר כל מה שסודי הוא‬
‫המפתח‪.‬‬

‫ננסה לשדרג את צופן קיסר לצופן הזזה – נבחר מפתח שיהיה בכמה אותיות להזיז כל אות ב‪,plaintext-‬‬
‫במקום ‪.3‬‬

‫א"ב = }‪{0, … ,25‬‬

‫}‪𝑘𝑒𝑦𝑔𝑒𝑛: 𝑘 ∈ {0, … ,25‬‬


‫‪𝐸𝑛𝑐 (𝑚 , … , 𝑚 ) = (𝐶 , … , 𝐶 ) | 𝐶 = 𝑚 + 𝑘 𝑚𝑜𝑑26‬‬
‫‪𝐷𝑒𝑐 (𝐶 , … , 𝐶 ) = (𝑚 , … , 𝑚 ) | 𝑚 = 𝐶 − 𝑘 𝑚𝑜𝑑26‬‬
‫דוגמה‪ ℎ𝑎𝑝𝑝𝑦 → 𝐼𝐵𝑄𝑄𝑍 :‬כאשר ‪k=1‬‬
‫החולשה – מרחב המפתחות הוא קטן )‪ ,(26‬לכן ניתן לבצע חיפוש ממצא )‪ .(brute force‬נרצה שמרחב‬
‫המפתחות יהיה גדול‪ .‬בימינו מעריכים כי גודל מרחב מפתחות של בערך ‪ 80‬ביטים הוא מספיק בטוח‬
‫שמחשב לא יוכל לחשב את כולו בזמן הגיוני )בהנחה שאין כל חולשה אחרת במערכת ההצפנה(‪.‬‬

‫כעת נעבור לצופן החלפה – בוחרים לכל אות‪ ,‬אות אחרת אקראית בה נחליף אותה‪ .‬למשל את ‪ a‬נחליף ב‪-‬‬
‫‪ ,H‬את ‪ b‬נחליף ב‪ A-‬וכו'‪.‬‬

‫‪𝑘𝑒𝑦𝑔𝑒𝑛: 𝜋: Σ → Σ‬‬
‫) 𝑚(𝜋 = 𝐶 | ) 𝐶 ‪𝐸𝑛𝑐 (𝑚 , … , 𝑚 ) = (𝐶 , … ,‬‬
‫) 𝐶(𝜋 = 𝑚 | ) 𝑚 ‪𝐷𝑒𝑐 (𝐶 , … , 𝐶 ) = (𝑚 , … ,‬‬
‫‪26! ≈ 2‬‬ ‫גודל מרחב המפתחות הוא‬

‫החולשה‪ :‬לשפה יש מבנה‪ ,‬והצופן לא מחביא את המבנה‪ .‬אפשר להשתמש בסטטיסטיקה כדי לזהות‬
‫אותיות נפוצות‪ .‬למשל‪ ,‬באנגלית‪ ,‬האותיות ‪ e‬ו‪ a-‬הכי נפוצות בשפה‪ ,‬לכן ניתן לבדוק מה האות הכי נפוצה‬
‫בצופן ולנסות להציב אותיות‪) .‬ניתן גם ליצור אלג' פשוט ששובר את הצופן‪ ,‬כיוון שידוע שמתקיים‬
‫‪ ∑ 𝑝 = 0.065‬כאשר 𝑝 = השכיחות של התו ה‪ .i-‬לכן נעבור על כל מפתח ‪ k‬ונחשב את הסכום‬
‫)𝑘 ‪ Σ(𝑞 +‬לכל שכיחות של תו ‪ q‬בצופן‪ ,‬והסכום שמתקרב ביותר ל‪ 0.065-‬ירמוז לנו מה היא ההצפנה(‪.‬‬

‫צופן ויז'נר – מעין הרכבה של צפני ‪ .shift‬דוגמה‪:‬‬

‫𝑒𝑚 𝑡𝑢𝑜𝑏𝑎 𝑚𝑖‪𝑚: 𝑡𝑒𝑙𝑙 ℎ‬‬


‫… 𝑎𝑐 |𝑒𝑓𝑎𝑐|𝑒 𝑓𝑎𝑐|𝑒𝑓𝑎𝑐 ‪𝑘:‬‬
‫… 𝑆𝑇𝐾𝑄𝑅𝐹𝑊‬
‫מספר האפשרויות למפתח‪ 26 :‬כאשר ‪ = t‬גודל המפתח‪ .‬כביכול "שיטח" את ההתפלגות‪.‬‬

‫חולשות‪:‬‬

‫‪ .1‬אם יודעים את גודל המפתח אפשר לעשות התקפה סטטיסטית על חלוקות לפי הגודל‪.‬‬

‫‪ .2‬אם לא יודעים את גודל המפתח‪ ,‬אפשר לנסות ) 𝑡 ∗ 𝑋(𝑂 התקפות סטטיסטיות‪ ,‬כאשר ‪ = X‬העלות של‬
‫התקפה סטטיסטית‪ ,‬כלומר ננסה לכל גודל חלוקה אפשרי‪.‬‬

‫‪ .3‬איך נמצא את ‪ ?t‬נבצע ‪ GCD‬על חזרות של אותיות‪ .‬למשל‪ ,‬בדוגמה שלנו‪ ,‬בפעם הבאה שנראה ‪W‬‬
‫בצופן‪ ,‬כיוון שאין הרבה קומבינציות שיחזירו ‪ W‬נוכל להניח שזוהי תחילה של החלוקה עם האות‬
‫ההתחלתית‪ ,‬וניתן להסיק שה‪ GCD‬בין המיקומים הללו יעיד על גודל החלוקה‪.‬‬

‫‪ .4‬עדיין יש מבנים בשפה שקל לזהות – למשל‪ ,‬המילה ‪ the‬נפוצה באנגלית‪ ,‬ותהיה תמיד זהה בצופן‪.‬‬

‫עקרונות של קריפטוגרפיה מודרנית‬

‫‪ .1‬הגדרות מדויקות ופורמליות‪ .‬לדוגמה‪ ,‬סכמת הצפנה‪ .‬צריכים להגדיר גם פונקציונליות‪ ,‬ובטיחות של‬
‫הצפנה‪ .‬הצעות להגדרה של הצפנה‪:‬‬
‫א‪" .‬היריב אינו יכול לגלות את המפתח"‪ .‬הגדרה לא טובה – אולי אין מפתח‪ ,‬או שפונק' הזהות‬
‫מקיימת את ההגדרה הזו‪.‬‬
‫ב‪" .‬היריב לא יכול ללמוד את ההודעה מהצופן" )כלומר‪ ,‬לכל יריב‪ ,‬ההסתברות שהוא ינחש נכונה‬
‫את ההודעה מהצופן נמוכה מאוד(‪.‬‬
‫𝑐𝑛𝐸 𝐴 ‪∀𝐴, ∀𝑚, ∀𝑘 ∈ 𝐾: Pr‬‬ ‫)𝑚(‬ ‫"𝑤𝑜𝑙" = 𝑚 =‬
‫עדיין הגדרה לא טובה – גם אם לא ניתן ללמוד את ההודעה‪ ,‬עדיין אפשר ללמוד פרטים‬
‫מסוימים מההצפנה )למשל‪ ,‬אולי ניתן ללמוד את ה‪ MSB-‬שנוצר מההצפנה(‪.‬‬
‫ג‪" .‬היריב לא יכול ללמוד שום תו של ההודעה מהצופן"‪.‬‬

‫"𝑤𝑜𝑙" = ] 𝑚 = ) 𝑚 ‪∀𝐴, ∀(𝑚 , … , 𝑚 ), ∀𝑖 ∈ [𝑡] ∶ Pr [𝐴(𝐸𝑛𝑐 (𝑚 , … ,‬‬


‫הבעיה – עדיין אפשר לגלות שוני באורכי ה‪.plaintexts-‬‬

‫ד‪" .‬היריב לא יכול ללמוד שום פונקציה על ההודעה מהצופן )חוץ מהאורך("‪.‬‬

‫מה היכולות של היריב? האם הוא מוגבל או לא מוגבל חישובית? האם הוא מסוגל רק להאזין‬
‫)‪ (eavesdropper‬או שהוא מסוגל להצפין הודעות מסוימות )‪ (chosen plaintext attacks‬או אפילו‬
‫לפענח אותן )‪(chosen ciphertext attacks‬‬

‫‪ .2‬הנחות מדויקות‪ .‬למשל‪" ,‬אין אלג' שיכול למצוא פירוק של מספר למכפלת מספרים ראשוניים בזמן‬
‫סביר"‪.‬‬
‫‪ .3‬הוכחות בטיחות‪ .‬נרצה להוכיח את ביטחון ההצפנה‪.‬‬

‫בטיחות מושלמת )‪(Perfect Security‬‬

‫נניח ‪ shift cipher‬על אות בודדת‪ .‬ההודעות האפשריות הן }𝑛 ‪ 𝑀 = {𝑦,‬כאשר ההסתברות לכל אחת היא‬
‫‪ 0.7‬ו‪ 0.3-‬בהתאם‪ .‬התוקף רואה את ההודעה המוצפנת 𝐵 = 𝐶‪.‬‬

‫ישנן שתי אפשרויות‪:‬‬

‫𝐵 = )𝑛( 𝑐𝑛𝐸 𝑟𝑜 𝐵 = )𝑦( 𝑐𝑛𝐸‬


‫כלומר‪:‬‬

‫]‪Pr[𝐶 = 𝐵] = Pr[𝑀 = 𝑦 ∧ 𝑘 = 3] + Pr[𝑀 = 𝑛 ∧ 𝑘 = 14‬‬


‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫∗ ‪= Pr[𝑀 = 𝑦] ∗ Pr[𝑘 = 3] + 𝑝𝑟[𝑀 = 𝑛] ∗ Pr[𝑘 = 14] = 0.7‬‬ ‫∗ ‪+ 0.3‬‬ ‫=‬
‫‪26‬‬ ‫‪26 26‬‬
‫כלומר‪ ,‬זה שאנחנו יודעים את התפלגות ההודעות לא עוזר לנו לגלות את מפתח ההצפנה‪.‬‬

‫מעבר לכך‪:‬‬
‫‪1‬‬
‫‪(Pr[𝐶 = 𝐵 | 𝑀 = 𝑦] ∗ Pr[𝑀 = 𝑦] 26 ∗ 0.7‬‬
‫= ]𝐵 = 𝐶 | 𝑦 = 𝑀[‪Pr‬‬ ‫=‬ ‫‪= 0.7‬‬
‫]𝐵 = 𝐶[‪Pr‬‬ ‫‪1‬‬
‫‪26‬‬
‫כלומר‪ ,‬גם בהינתן שאנו יודעים את הצופן עצמו‪ ,‬ההסתברות שנזהה נכונה את ההודעה מתוך מרחב‬
‫ההודעות האפשריות נשארת זהה‪.‬‬

‫הגדרה‪ :‬סכמת הצפנה )𝑐𝑒𝐷 ‪ 𝜋 = (𝐺𝑒𝑛, 𝐸𝑛𝑐,‬מעל מרחב הודעות ‪ M‬משיגה בטיחות מושלמת אם לכל‬
‫התפלגות מעל ‪ ,M‬לכל הודעה 𝑀 ∈ 𝑚 ולכל צופן 𝐶 ∈ 𝑐 המקיים ‪ ,Pr[𝐶 = 𝑐] > 0‬מתקיים‪:‬‬
‫]𝑚 = 𝑀[ ‪Pr[𝑀 = 𝑚 | 𝐶 = 𝑐] = Pr‬‬
‫כלומר‪ ,‬העובדה שראיתי את הצופן לא הוסיפה לי שום מידע נוסף‪.‬‬

‫הגדרה שקולה‪ :‬סכמת הצפנה )𝑐𝑒𝐷 ‪ 𝜋 = (𝐺𝑒𝑛, 𝐸𝑛𝑐,‬מעל מרחב הודעות ‪ M‬משיגה בטיחות מושלמת‬
‫אם"ם לכל 𝑀 ∈ 𝑚 ‪ 𝑚,‬ולכל 𝐶 ∈ 𝑐 מתקיים‬

‫]𝑐 = ) 𝑚( 𝑐𝑛𝐸[ 𝑟𝑃 = ]𝑐 = )𝑚( 𝑐𝑛𝐸[ ‪Pr‬‬

‫הוכחת שקילות )נראה כיוון אחד(‪:‬‬

‫‪:1 ← 2‬‬

‫נקבע התפלגות כלשהי מעל ‪ ,M‬נקבע הודעה 𝑀 ∈ 𝑚 וצופן ‪ c‬כך ש‪ .Pr[𝐶 = 𝑐] > 0-‬נרצה להראות כי‬
‫]𝑚 = 𝑀[ ‪.Pr[𝑀 = 𝑚 | 𝐶 = 𝑐] = Pr‬‬

‫אם ‪ Pr[𝑀 = 𝑚] = 0‬אזי גם ‪ .Pr[𝑀 = 𝑚 | 𝐶 = 𝑐] = 0‬נניח כי ‪ .Pr[𝑀 = 𝑚] > 0‬אזי‬

‫]𝑐 = )𝑚( 𝑐𝑛𝐸[ 𝑟𝑃 = ]𝑚 = 𝑀 | 𝑐 = 𝐶[‪Pr‬‬


‫נגדיר ]𝑐 = )𝑚( 𝑐𝑛𝐸[ 𝑟𝑃 = 𝛿‪.‬‬

‫לפי ההגדרה השנייה‪ ,‬לכל 𝑀 ∈ 𝑚 מתקיים 𝛿 = ]𝑐 = ) 𝑚( 𝑐𝑛𝐸[‪.Pr‬‬

‫לכן‪,‬‬
‫]𝑚 = 𝑀[ ‪Pr[𝐶 = 𝑐 | 𝑀 = 𝑚] ∗ Pr‬‬
‫= ]𝑐 = 𝐶 | 𝑚 = 𝑀[‪Pr‬‬ ‫=‬
‫]𝑐 = 𝐶[ ‪Pr‬‬
‫]𝑚 = 𝑀[ ‪𝛿 ∗ Pr‬‬ ‫]𝑚 = 𝑀[ ‪𝛿 ∗ Pr‬‬
‫=‬ ‫=‬
‫]‪Σ ∈ Pr[𝐶 = 𝑐 | 𝑀 = 𝑚′] ∗ Pr [𝑀 = 𝑚′] 𝛿 ∗ Σ ∈ Pr [𝑀 = 𝑚′‬‬
‫]𝑚 = 𝑀[ ‪= Pr‬‬

‫הגדרה שקולה – הגדרת יריב מאזין‬

‫𝑘𝑣𝑖𝑟𝑃‬ ‫‪,‬‬ ‫‪:‬‬

‫‪ .1‬היריב ‪ A‬מוציא זוג הודעות 𝑀 ∈ 𝑚 ‪ 𝑚 ,‬שונות‪.‬‬


‫‪ .2‬מפתח ‪ k‬נבחר באקראי בעזרת ‪ keygen‬ובוחרים באקראי }‪ .𝑏 ∈ {0,1‬מצפינים‬

‫) 𝑚( 𝑐𝑛𝐸 ∈ 𝑐‬
‫‪ .3‬נותנים ליריב את ‪ c‬והיריב מחזיר '‪ .b‬פלט הניסוי הוא ‪ 1‬אם"ם ‪.𝑏 = 𝑏′‬‬

‫הגדרה‪ :‬סכימה )𝑐𝑒𝐷 ‪ 𝜋 = (𝐺𝑒𝑛, 𝐸𝑛𝑐,‬משיגה בטיחות מושלמת כנגד יריב מאזין אם לכל יריב ‪ A‬מתקיים‪:‬‬
‫‪1‬‬
‫𝑘𝑣𝑖𝑟𝑃 ‪Pr‬‬ ‫‪,‬‬ ‫= ‪=1‬‬
‫‪2‬‬
‫משפט‪ :‬שלושת ההגדרות שקולות‪.‬‬
‫דוגמה‪:‬‬

‫נשתמש ב‪ shift cipher-‬כאשר }𝑛𝑛 ‪ .𝑀 = {𝑦𝑦, 𝑦𝑛, 𝑛𝑦,‬נראה ש‪ shift cipher-‬הוא לא ‪:perfectly secure‬‬

‫‪ .1‬היריב ‪ A‬יוציא 𝑛𝑦 = 𝑚 ‪𝑚 = 𝑦𝑦,‬‬


‫‪ A .2‬יקבל בתור ‪.cc' ciphertext‬‬
‫‪ .3‬אם ‪ 𝑐 = 𝑐′‬אז ‪ A‬יחזיר ‪ .0‬אחרת‪ ,‬יחזיר ‪.1‬‬

‫𝑘𝑣𝑖𝑟𝑃 ‪Pr‬‬ ‫‪,‬‬ ‫טענה‪= 1 = 1 :‬‬

‫‪One-Time Pad‬‬

‫הבנייה‪ :‬נקבע ‪ 𝑙 > 0‬ו‪𝑀 = 𝐾 = 𝐶 = {0,1} -‬‬

‫‪ :Gen‬מחזיר }‪ 𝑘 ∈ {0,1‬כלומר מחרוזת של ‪ l‬ביטים אקראיים‪.‬‬

‫‪𝐸𝑛𝑐 (𝑚) = 𝑘 ⊕ 𝑚 :Enc‬‬

‫‪𝐷𝑒𝑐 (𝑐) = 𝑐 ⊕ 𝑘 :Dec‬‬

‫משפט‪ OTP :‬משיג בטיחות מושלמת )בהינתן שהמפתח חד פעמי(‪.‬‬

‫הוכחה‪:‬‬

‫נחשב ] 𝑚 = 𝑀|𝑐 = 𝐶[ ‪ Pr‬עבור 𝐶 ∈ 𝑐 כלשהו‪.‬‬


‫‪1‬‬
‫= ]‪Pr[𝐶 = 𝑐 | 𝑀 = 𝑚′] = Pr[Enc (𝑚 ) = 𝑐] = Prk[k ⊕ m = c] = Pr[k = c ⊕ m′‬‬
‫|𝑘|‬
‫‪=2‬‬
‫נקבל התפלגות כלשהי מעל מרחב ההודעות ‪ .M‬לכל 𝐶 ∈ 𝑐 נקבל‪:‬‬

‫‪Pr[𝐶 = 𝑐] = Σ‬‬ ‫∈‬ ‫‪Pr[𝐶 = 𝑐 | 𝑀 = 𝑚′] ∗ Pr [𝑀 = 𝑚′] = Σ‬‬ ‫∈‬ ‫‪2‬‬ ‫]‪∗ Pr [𝑀 = 𝑚′‬‬
‫‪= 2 ∗ Σ ∈ Pr [𝑀 = 𝑚′] = 2‬‬

‫בעזרת בייס‪:‬‬
‫]𝑚 = 𝑀[‪Pr[𝐶 = 𝑐 | 𝑀 = 𝑚] ∗ Pr‬‬ ‫]𝑚 = 𝑀[‪Pr‬‬
‫= ]𝑐 = 𝐶 | 𝑚 = 𝑀[‪Pr‬‬ ‫‪=2‬‬ ‫∗‬ ‫]𝑚 = 𝑀[ ‪= Pr‬‬
‫]𝑐 = 𝐶[ ‪Pr‬‬ ‫‪2‬‬

You might also like