GammaCyber

כתיבת קוד — שיעור 3

רשתות וסייבר: IP, TCP, HTTP, CIA Triad

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T1 · מתחיל 100 נק' ~10 דק' algorithmic
IPv4 → מספר 32-סיביות (עם ולידציה)
נתונה כתובת IPv4 כמחרוזת בפורמט dotted-quad. אם תקינה — החזר את ערכה כמספר שלם 32-סיביות (האוקטט השמאלי הוא הבייט המשמעותי ביותר). אם לא תקינה — החזר None. כתובת תקינה: בדיוק 4 אוקטטים, כל אחד ספרות עשרוניות בטווח 0–255, ללא אפסים מובילים (פרט ל-"0"), ללא רווחים או תווים זרים.
דוגמאות
ip_to_int('1.2.3.4') → 16909060
ip_to_int('255.255.255.255') → 4294967295
ip_to_int('256.0.0.1') → None
פתרון-ייחוס IPv4 → מספר 32-סיביות (עם ולידציה) ›
def ip_to_int(ip: str) -> int | None: parts = ip.split('.') if len(parts) != 4: return None val = 0 for p in parts: if not p.isdigit(): # תווים זרים / רווחים return None if len(p) > 1 and p[0] == '0': # אפסים מובילים return None n = int(p) if n > 255: return None val = (val << 8) | n return val
הפתרון נשמר מקומית אוטומטית.
T2 · בסיסי 200 נק' ~18 דק' algorithmic
כתובת רשת ו-Broadcast מ-CIDR
נתונה נוטציית CIDR כמחרוזת "a.b.c.d/prefix" (למשל "192.168.1.10/24"). חשב והחזר צמד (network, broadcast) — כתובת הרשת וכתובת ה-broadcast, שתיהן כמחרוזות dotted-quad. ה-prefix בטווח 0–32. אם ה-CIDR פסול (IP לא תקין, prefix מחוץ לטווח, פורמט שגוי) — החזר None. רמז: mask = 32 סיביות שה-prefix העליונות בהן דלוקות; network = ip AND mask; broadcast = network OR (NOT mask).
דוגמאות
subnet('192.168.1.10/24') → ('192.168.1.0', '192.168.1.255')
subnet('1.2.3.4/32') → ('1.2.3.4', '1.2.3.4')
פתרון-ייחוס כתובת רשת ו-Broadcast מ-CIDR ›
def subnet(cidr: str) -> tuple[str, str] | None: if cidr.count('/') != 1: return None ip_s, pfx_s = cidr.split('/') if not pfx_s.isdigit(): return None pfx = int(pfx_s) if pfx > 32: return None ipv = ip_to_int(ip_s) # שימוש חוזר במשימה הקודמת if ipv is None: return None mask = ((0xFFFFFFFF << (32 - pfx)) & 0xFFFFFFFF) if pfx else 0 net = ipv & mask bc = net | (~mask & 0xFFFFFFFF) fmt = lambda v: '.'.join(str((v >> s) & 255) for s in (24, 16, 8, 0)) return (fmt(net), fmt(bc))
הפתרון נשמר מקומית אוטומטית.