בקריפטוגרפיה, צופן זרם (Stream Cipher) הוא צופן סימטרי שמייצר רצף סודי שמחובר לסיביות הטקלט כדי להצפין.
צופן זרם מבוסס על מצב פנימי (internal state) של מחולל שמתרגם מפתח קצר לזרם מפתח פסאודו-אקראי. זרם המפתח מחובר עם הטקסט הקריא באמצעות פעולה הופכית, בדרך כלל XOR (פעולת חיבור בינארי מודולו 2). כך ניתן לשחזר את הטקסט המקורי על ידי חזרה על אותה פעולה עם אותו זרם מפתח.
ההבדל העיקרי מצופן בלוקים הוא איך נוצר המפתח. בצופן בלוקים המידע מעובד בבלוקים קבועים בלי זיכרון מהחיבורים הקודמים. בצופן זרם המחולל זוכר מצב פנימי ומתפקד כמו מחולל מספרים פסאודו-אקראיים (PRNG), כלומר אלגוריתם דטרמיניסטי שמנסה להיראות אקראי.
צפני זרם יעילים במיוחד בחומרה. הם מהירים, קלים ליישום וצריכים מעט זיכרון. לכן מתאימים לתקשורת אלחוטית ולהצפנת מנות מידע קצרות או כאשר אורך המידע לא ידוע מראש. מודרניים מותאמים גם לתוכנה וניצלים מהירות מעבדים.
צפני זרם קיימים מאז תקופות מוקדמות של הצפנה. כבר במלחמות העולם השתמשו בהם במכונות רוטור, למשל מכונת לורנץ הגרמנית במלחמת העולם השנייה. דוגמה מודרנית מוכרת היא RC4, שנוצר לתוכנה ושימש רבות, אך כיום לא מומלץ.
הדוגמה הבסיסית לצופן זרם היא פנקס חד פעמי (One-time pad). בפנקס זה מחולק מפתח אקראי בגודל המסר, ומחברים אותו עם המסר ב-XOR. אם המפתח באמת אקראי ונעשה בו שימוש רק פעם אחת, הצופן הוא מושלם ובטוח לפי הוכחה של קלוד שנון.
בפועל קשה להכין מפתח אקראי ארוך ולשתפו, לכן צופני זרם משתמשים במחולל פסאודו-אקראי שמייצר זרם מפתח מתוך מפתח קטן. זה חוסך מקום ונוח יותר, אך מפחית את הביטחון כי הזרם אינו באמת אקראי.
חשוב מאוד לא לחזור על אותו מפתח לשני מסרים שונים. שימוש חוזר מאפשר התקפה פשוטה: XOR של שני היצוגים המוצפנים מבטל את המפתח ויחשוף מידע מהמסרים.
צפני זרם מתחלקים בעיקר לשתי קטגוריות: סינכרוניים וא-סינכרוניים (Self-Synchronizing).
בצופן זרם סינכרוני מחולל זרם המפתח (KSG) רץ בלי תלות בטקסט. גם השולח וגם המקבל מפעילים את אותו מחולל. כדי להתמודד עם איבוד סימנים בתקשורת, מחלקים את המידע לפריימים (frames) ומוסיפים מספר סידורי ווקטור אתחול (IV). IV הוא ערך התחלתי שמשתנה לפריימים שונים, וכך לא מצריכים מחולקים רבים של מפתחות.
דוגמה: A5/1 שימש בעבר להצפנת GSM. באותו צופן היו פריימים באורך 228 סיביות, והמפתח הראשוני היה בגודל 64 סיביות.
בצופן זרם א-סינכרוני זרם המפתח תלוי במפתח ובמספר סמלים מהטקסט המוצפן שכבר נשלח. כך, אם חסר או נוסף סמל בשידור, ההשפעה מוגבלת למספר סמלים קצר, והסינכרון מתחדש מעצמו לאחריהם.
מחולל פסאודו-אקראי (PRNG) הוא אלגוריתם דטרמיניסטי שמייצר רצף שנראה אקראי. בצופן זרם המפתח מופק מה-PRNG לאחר אתחול עם המפתח הסודי ו-IV. איכות ה-PRNG חשובה מאוד לאבטחה.
אוגר הזיזה המוחזר (Feedback shift register), ובמיוחד הגרסה הליניארית LFSR, היא שיטה ישנה ונפוצה לייצור זרמים. LFSR מכיל שלבים ששומרים סיביות. בכל קדימה כל התכולות נזזות והסיבית החדשה מחושבת כ-XOR של מספר שלבים קבועים.
קיים גם Nonlinear Feedback shift register, שבו חישוב הסיבית העליונה נעשה בעזרת פונקציה לא ליניארית.
LFSR נוח לחומרה, אך ליניאריותו מקלה אנליזה. לכן משתמשים בשילובים של מספר LFSR או בפונקציות לא ליניאריות כדי לשפר ביטחון. שיטות מוכרות כוללות Stop/go ו-Shrinking Generator, שמנסות להתחמק מפגיעות ליניאריות.
A5/1 שילב שלושה LFSR באורכים שונים והשתמש בטכניקת Stop/go. הוא מאותחל במפתח 64 סיביות. הצופן נחלש עם הזמן: החל משנת 1997 נמצאו שיטות פיצוח משמעותיות, ובשנים שאחרי כן פותחו התקפות שיכולות לשבור את הצופן תוך דקות בהתבסס על מעט נתונים ידועים.
E0 שימש בעבר בבסיס בלוטות'. הוא מבוסס על ארבעה LFSR בגדלים 25,31,33 ו-39 סיביות, ומפתח של 128 סיביות. למרות זהותיו המורכבות, גם E0 נמצא פגיע וניתן לפרוץ אותו בפחות מ-2^64 צעדים בשיטות מסוימות.
מחולל פנימי הוא אוטומט סופי, ולכן במרוצים ארוכים הוא יחזור על עצמו. זו התנהגות הקרויה מחזוריות (period). אם המחזוריות קצרה מדי, חלקים שונים של המסר יוצפנו באותן סיביות מפתח. זה מוביל לחשיפות סטטיסטיות ופגיעה קשה בביטחון.
אפשר לבחון ביטחון גם בעזרת מבחני אקראיות סטטיסטיים, כפי שעשה סולומון גולומב. עוד כלי חשוב הוא סיבוכיות ליניארית, שנמדדת בעזרת אלגוריתם ברלקמפ-מסי (Berlekamp-Massey). סיבוכיות ליניארית נמוכה מצביעה על סימטריה או תקינות שניתנות לניצול.
בדרך כלל מקובל שמחזוריות צריכה להיות גדולה מאוד, למשל מעל 2^64, כדי להיחשב בטוחה ברוב היישומים.
RC4 היה אחד הצפנים הראשונים שתוכננו במיוחד לתוכנה. צופני תוכנה מודרניים משתמשים ב-Nonce (IV) כדי לאפשר שימוש במפתח אחד למספר הודעות בלי לחזור על אותה תוצאת מפתח. דוגמה עדכנית ומהירה היא Salsa20, המתאימה גם לתוכנה וגם לחומרה.
eSTREAM היה פרויקט אירופאי (2004, 2008) שסינן וציין צופני זרם שיהיו מתאימים לתוכנה ולחומרה. הפרויקט חילק את העבודה לשני פרופילים: פרופיל לתוכנה עם קצב גבוה, ופרופיל לחומרה עם משאבים מוגבלים.
צופן זרם הוא דרך להסתיר מידע על ידי יצירת זרם סודי של ביטים. ביט הוא יחידת מידע קטנה.
המחולל מתחיל ממפתח סודי ויוצר זרם מפתח. את זרם המפתח מחברים עם המסר בפעולת XOR. XOR היא חיבור בינארי בלי נשא.
צפני זרם שימשו כבר במכונות רוטור במלחמות ישנות. דוגמה פופולרית לתוכנה נקראת RC4.
פנקס חד פעמי משתמש במפתח אקראי שאורכו כמו המסר. אם המפתח באמת אקראי ומשתמשים בו פעם אחת בלבד, ההצפנה בטוחה לחלוטין.
בפועל קשה ליצור ולהחליף מפתחות ארוכים, לכן משתמשים במחולל שמייצר מפתח מהיר ממפתח קטן. זה פחות בטוח מהפנקס האמיתי.
יש שני סוגים עיקריים: סינכרוני וא-סינכרוני.
בצופן סינכרוני המחולל רץ בצורה קבועה. כדי להימנע מתקלות במחבר, חותכים את המידע לפריימים. כל פריים מקבל מספר וערך התחלתי (IV). IV הוא מספר שמתחלף כדי לשנות את הזרם.
בצופן א-סינכרוני זרם המפתח תלוי בחלקים קודמים של הטקסט המוצפן. אם אבד סמל בשידור, הסינכרון חוזר לבד אחרי כמה סמלים.
PRNG הוא מחולל שמנסה להיראות אקראי. הוא לא באמת אקראי כי הוא תלוי בהתחלה שלו.
LFSR הוא מעגל שמזיז סיביות כל פעם צעד. הסיבית החדשה מחושבת בעזרת XOR של כמה סיביות ישנות. זה קל ליישום בחומרה.
A5/1 שימש פעם להצפנת שיחות סלולריות. מפתחו היה 64 סיביות ונמצאו בו חולשות,
כך שאפשר לשבור אותו בזמן קצר.
E0 שימש בבלוטות'. הוא עבד עם ארבעה LFSR ומפתח של 128 סיביות. גם הוא נמצא פגיע.
אם המחולל חוזר על עצמו, זה מסוכן. מחזוריות קצרה חושפת חלקים מהמסר. לכן רוצים מחזור ארוך מאוד.
אל תשתמשו בשני מסרים עם אותו מפתח. שימוש חוזר עלול לחשוף את המסרים.
צופני תוכנה כמו RC4 ו-Salsa20 נבנו במיוחד לריצת מחשב. רבים משתמשים גם ב-Nonce כדי למנוע חזרתיות.
eSTREAM היה פרויקט שבחן צופני זרם טובים בין 2004 ל-2008. הפרויקט חיפש צופנים מתאימים לתוכנה ולחומרה.
תגובות גולשים