פתרון חידת הסייבר נחשף - שלב אחר שלב
בתחילת החג העלנו לאתר חידה מיוחדת, שהגו מיטב המוחות ביחידת מצו"ב שבאגף התקשוב וההגנה בסייבר. במשך שבוע שלם, הצליחו לפתור אותה רק 21 אנשים. דיברנו עם סגן ע', קצין איתור במצו"ב שכתב את החידה, כדי שיספר לנו איך נבנתה ומה הפתרון שלה.
החידה, משלבת ידע בתחומים רבים מעולם הסייבר והמחשבים, ומבוססת על "עץ האפמן" - שיטה לקודד ולדחוס נתונים.
בחידה הפותר נתקל באתגר פיענוח של מידע בינארי. בתחילתה תמונה של עץ רימון, רצף בינארי קצר שנאמר לו ש== למשפט "rosh not tail", ו~ למשפט "lo olhottnisatnr ioohtrsltoi nh arsat", שכתוב בג'יבריש.
לאחר מכן היה רצף בינארי גדול יותר - ש== ל-'?', ו~ לג'יבריש ארוך יותר.
האתגר הראשון בחידה הוא להבין את השאלה:
ניתן להניח די בקלות ש-'==' אומר שהם מייצגים את אותו הדבר, אך הסימן ~ יכול לבלבל את הפותר, מאחר ובתכנות הוא מייצג את האופורטור 'not'.
הכוונה בחידה היא לכך שהטקסט "דומה", קצת כמו דמיון משולשים בגיאומטריה. '?' מייצג את מטרת החידה - להבין מהטקסט שהבינארי הארוך מייצג.
עכשיו כשהבנו את הבעיה ניתן לגשת לפתרון: דבר ראשון, ניתן להסיק שהמנגנון שהופך את הטקסט לבינארי הוא מנגנון דחיסה (קיבוץ), וזאת מכיוון שהבינארי משמעותית קטן יותר מהטקסט שהוא מייצג (כל תו טקסט שווה ל-8 תווים בינאריים מבחינת נפח אחסון).
ניתן כעת לנסות לרברס (מלשון reverse engineering, או הנדסה לאחור) את מנגנון הקיבוץ על הדוגמה שניתנה במטרה להבין איך הוא עובד.
מי שיעשה זאת יגלה מספר פרטים מעניינים:
1. כל אות בטקסט מיוצגת על ידי רצף בינארי קבוע (כלומר אם 'a' מיוצגת על ידי 010 במקום אחד בטקסט, כך היא תהיה מיוצגת בכל מקום).
2. אותיות נפוצות יותר מיוצגות על ידי רצף בינארי קטן יותר (הגיוני, מאחר ומדובר במנגנון דחיסה).
3. לא נראה שיש קשר בין הייצוג של אותיות בדוגמה הקצרה לבין הרצף הארוך שאותו מנסים לפענח (הרצף שמייצג אות מסויימת בדוגמה, ככל הנראה לא מייצג את אותה האות ברצף השני).
4. הג'יבריש ש"דומה" לטקסט, מכיל בדיוק את אותן אותיות בטקסט רק פי 3 (כולל רווחים - יש 2 ברצף בשני מקרים בדוגמה) ובסדר רנדומלי.
לפי המסקנות האלו, בדגש על 3 ו-4, ניתן להסיק שהמטרה של הג'יבריש ברצף השני היא לעזור להבין אילו אותיות קיימות בטקסט המקורי, ובאיזו תדירות כל אחת מופיעה. משם נוכל להבין מה הייצוג הבינארי של כל אחת, ככל הנראה לפי אותו אלגוריתם שקבע את הייצוג של הדוגמה (כך שאילו שמופיעות הרבה יקבלו ייצוג קצר).
עכשיו מה שעלינו לעשות הוא להבין את האלגוריתם לפי הדוגמה, ולהשתמש בו על הג'יבריש הארוך.
אחרי מחקר קצר באינטרנט על טכניקות דחיסה או קיבוץ, ניתן להבין שמדובר בקוד האפמן - שיטה ידועה שמשתמשת בעצי האפמן (ומכאן רמז עץ הרימון), ופותחה על ידי החוקר דייויד האפמן ב-1951 לדחיסת נתונים.
קיימות שתי דרכים לפתרון:
- לעבור על אתרים שמייצרים עצי האפמן עד שמגיעים לאתר שמצליח לפתור את הדוגמה. הגרסה הספציפית שהשתמשנו בה בחידה מומשה באתר, וניתן להשתמש בו כדי למצוא את העץ המתאים לפי מקטע הג'יבריש, ומכאן לפענח את הקוד הבינארי.
- ניתן לממש את האלגוריתם בעצמנו בקוד בכל שפה שנבחר, להגיע למימוש שיעבוד על הדוגמה ולהשתמש בו כדי לענות על החידה.
כל הכבוד לכל הפותרים!