• בלוג
  • ניסוי ויו: הצפנת זיגזג

ניסוי ויו: הצפנת זיגזג

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

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

1. מה זה הצפנת זיגזג

ההצפנה נקראת הצפנת זיגזג או באנגלית Rail fence cipher וזהו מצפין שבסך הכל משנה את סדר האותיות במילה באופן הבא: כותבים את המילה מלמטה למעלה לרוחב הדף עד לגובה מסוים שנקרא המפתח, ואז ממשיכים את הכתיבה כלפי מטה עד שמגיעים לשורת ההתחלה ואז שוב עולים למעלה. עם מספיק אותיות הצורה שמתקבלת נראית כמו זיגזג. בסוף לוקחים את הטקסט שכתוב מלמעלה למטה וזו ההודעה המוצפנת. אפשר לשחק עם ההצפנה בניסוי ויו שכתבתי כאן:

או אונליין בקישור:

https://railsfencecipher-vue.vercel.app

ובקוד הניסוי בגיטהאב:

https://github.com/ynonp/railsfencecipher-vue

2. סקירת קוד הצפנה ופיענוח

הקובץ שמטפל בהצפנה ופיענוח הוא:

import _ from 'lodash';

export function encrypt(msg: string, key: number) {
  const height = key;
  const groupSize = height * 2 - 2;

  const positions = msg.split('').map((ch, idx) => {
    const indexInGroup = idx % groupSize;
    const rowFromBottom = (indexInGroup < height) ? (indexInGroup + 1) : height - (indexInGroup + 1 - height);
    const rowFromTop = height - (rowFromBottom - 1);

    return {
      ch,
      column: idx + 1,
      row: rowFromTop,
      style: { gridArea: `${rowFromTop} / ${idx + 1}` }
    }
  })

  const message = _.sortBy(positions, 'row').map(p => p.ch).join('');
  return {
    positions,
    message,
  }
}

export function decrypt(msg: string, key: number) {
  const {positions} = encrypt(msg, key);
  const sortedPositions = _.sortBy(positions, 'row');
  const positionsWithEncryptedMessage = sortedPositions.map((p, index) => ({...p, ch: msg[index]}));
  return {
    positions: positionsWithEncryptedMessage,
    message: _.sortBy(positionsWithEncryptedMessage, 'column').map(p => p.ch).join('')
  }
}

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

3. מחשבות על ניסויים ו AI

צריך להגיד, נהניתי מהניסוי. הוא עזר לי להבין טוב יותר את הרעיון של צופן זיגזג. לא היה לי ספק שיש כבר אנשים שמימשו את זה לפניי באינטרנט ואכן לא צריך יותר מכמה שניות בגוגל כדי להגיע להמון מימושים והסברים על צופן זה, כמו שגוגל יודע. ברור גם שמנועי AI מסוגלים לבנות את הקוד הרבה יותר מהר ממה שאני כתבתי ואפילו לייצר תוצאה יפה יותר. הנה זו הגירסה של קלוד לאותו מצפין:

https://claude.site/artifacts/6a2f527f-8bc8-43d5-b837-3996a9c6392c

מתוך הפרומפט:

create an online rails fence cipher / decipher tool

ואז מגיעים לשאלה - אם הכל כבר קיים בשביל מה לבנות את זה? ואם קלוד יודע לבנות את המצפין בשניה וחצי למה לא לקחת את המימוש שלו? ובכלל איך נראה העתיד שלי כמתכנת כשקלוד עושה כל דבר יותר מהר?

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