מבוא כללי לתכנות ולמדעי המחשב 1843-0310 מרצה: אמיר רובינשטיין מתרגל: דין שמואל אוניברסיטת תל אביב סמסטר חורף 2017-8 חלק ב - מבוא לקריפטוגרפיה שיעור 5 (offset מונחים בסיסיים צופן קיסר (היסט,.1.2 1
Today we will discuss the second challenge. Slide courtesy of Prof. Benny Chor 2
קריפטוגרפיה - מונחים בסיסיים Plain text Decryption פענוח Encryption הצפנה Cipher/code צופן / קוד Cipher text תכונה נדרשת: Encryption + Decryption קלים עבור הצדדים המעורבים, אבל קשים עבור יריב שמאזין לתשדורת. פתרון אפשרי: לצדדים המעורבים יהיה סוד משותף כלשהו, שישמש להצפנת המידע.(code breaking) גילוי הסוד המשותף ופענוח ה- cipher text נקרא פיצוח/שבירת הצופן 3
צופן קיסר code) (Caesar הסוד המשותף לשני הצדדים הוא מספר שלם כלשהו שנקרא היסט (offset) מסדרים את התווים בסדר כלשהו, ומחליפים כל תו בזה שנמצא מספר מקומות מימינו בהתאם לגודל ה-.offset ההחלפה היא מעגלית. למשל עבור :offset=3 Image from: http://www.maths-resources.net נניח כי הטקסט שלנו יכול להכיל תווים נוספים מלבד.A-Z מכנים את קבוצת התווים שהטקסט יכול להכיל בשם אלפבית.(alphabet) במימוש בפייתון שנראה מייד נשתמש בא"ב הכולל את כל 128 תווי ה-.ASCII 4
צופן קיסר - הצפנה השלימו את הפונקציה: def caesar_encrypt(text, offset): cipher = "" for c in text: new = (ord(c) + offset)%128 new_char = chr(new) #print(c, "-->", new_char) cipher = cipher + new_char return cipher 5
צופן קיסר - הצפנה def caesar_encrypt(text, offset): cipher = "" for c in text: new = (ord(c) + offset)%128 new_char = chr(new) #print(c, "-->", new_char) cipher = cipher + new_char return cipher? למה צריך %128 הרצות בכיתה. 6
צופן קיסר פענוח כאשר ידוע לנו ההיסט המקורי אם אנו יודעים את ההיסט המקורי, פשוט נבצע שוב פעולת ההיסט הנגדי: "הצפנה", ע ם def caesar_decrypt_with_offset(cipher, orig_offset): text = caesar_encrypt(cipher, -orig_offset) return text שימו לב ליתרון כאן בשימוש בפונקציות. 7
צופן קיסר - פריצה כיצד ניתן לפענח את ההודעה גם כשאין לנו את ההיסט המקורי? נעבור על כל ההיסטים האפשריים עד שיתקבל משפט סביר. כמה היסטים אפשריים יש במקרה שלנו? def caesar_decrypt_no_offset(cipher): for poss_offset in range(1,128): poss_text = caesar_decrypt_with_offset(cipher, poss_offset) print(poss_offset, poss_text) שימו לב שהפונקציה מדפיסה את כל האפשרויות (ולא מחזירה דבר) מהו המשפט הבא? מי אמר אותו? quote = 'eyv1\x02\x06v\x04\x05z\x00\x7f1\x00w1\x08yv\x05yv\x031r1t\x00~\x01\x06\x05v\x031tr\x7f1\x05 yz\x7f 1z\x041\x7f\x001~\x00\x03v1z\x7f\x05v\x03v\x04\x05z\x7fx1\x05yr\x7f1\x05yv1\x02\x06v\x0 4\x05z\x00\x7f1\x00w1\x08yv\x05yv\x031r1\x04\x06s~r\x03z\x7fv1tr\x7f1\x04\x08z~?' 8
צופן קיסר דיון על יעילות הצופן כפי שראינו, צופן קיסר ניתן לפריצה באופן טריוויאלי* וביעילות (ולכן אינו בטוח). למעשה אין לצופן הזה שום שימוש מעשי כיום בהצפנה (אבל כן בהוראה...). n k תווים. מספר ההיסטים האפשריים הוא כגודל האלפבית. צריך לעבור על הטקסט המוצפן פעם אחת עבור כל היסט אפשרי. עבור אלפבית בגודל k וטקסט באורך n צריך לקרוא ולהמיר בסה"כ אמנם הפריצה הצריכה בחינה ידנית על מנת לבדוק את כל ה"פענוחים" הפוטנציאליים, אך זו לא היתה משימה קשה. ואפשר אפילו לייעל שלב זה באופן ניכר. איך? טריוויאלי הכוונה שאלגוריתם הפריצה אינו מתוחכם כלל, ופשוט עובר על כל האפשרויות בזו אחר זו. אלגוריתם כזה נקרא "כח גס" force),(brute או "חיפוש ממצה" search).(exhaustive * 9
צופן קיסר פענוח (חצי) אוטומטי נגדיר רשימה של מילים נפוצות. למשל: english_common = ["is", "the", "are", "of", "with", "to"] (threshold) מסויים. לכל היסט אפשרי, נבדוק האם כמות המילים הנפוצות שמופיעות בו היא מעל סף def caesar_decrypt_auto(cipher, common, thr):... סף מינימלי של מילים תואמות בין cipher ו- common רשימת מילים נפוצות בשפה הטקסט המוצפן 10 מימוש בפייתון בתרגול. שאלה למחשבה: אילו מילים כדאי לכלול ברשימת המילים הנפוצות? אילו לא כדאי?
אתגרים נוספים בקריפטוגרפיה מודרנית מלבד הצפנת מידע, ישנם אתגרים נוספים בתחום, כגון: הרשאת גישה הוכחת ידיעה מנגנוני חתימה דיגיטלית חלוקת סוד חישוב רב משתתפים שומר סודיות אימות זהויות מניעת הכחשה 11