הפונקציה המחברת את הטקסט הקריא עם זרם המפתח היא בדרך כלל פעולת XOR פשוטה של הטקסט המקורי עם המפתח סמל אחר סמל. זאת משום שהיא פעולה הופכית של עצמה. בפענוח כל מה שנדרש לעשות זה לחזור בדיוק על אותה פעולה עם הפרמטרים המתאימים. למעשה אפשר לבחור בפעולה מתמטית אחרת, העיקר שתהיה לה פעולה הופכית כך שהטקסט המוצפן ניתן יהיה לשחזור. בפענוח מפעילים את הפונקציה ההופכית. אילו היה זרם המפתח אקראי לגמרי הצופן יהיה בלתי ניתן לשבירה. אולם מצב כזה יכול לקרות רק אם זרם המפתח אקראי אמיתי. למעשה צופן זרם מנסה לדמות ככל האפשר זרם אקראי תוך שימוש בגרעין ההתחלתי הסודי formula_5. אפשר לחלק את מרבית צפני הזרם לשתי קטגוריות עיקריות: צופן זרם סינכרוני וצופן זרם א-סינכרוני, אף על פי שקיימות פרדיגמות אחרות. למשל Helix שייך לקטגוריה אחרת.
צופן זרם סינכרוני.
מבנה כללי של צופן זרם סינכרוני (באנגלית Synchronous Stream Cipher) המסומן בקיצור SSC, כמתואר בתרשים משמאל, מורכב ממכונת מצבים (אוטומט סופי) ופונקציית עדכון. מקבל מפתח סודי formula_5 וייתכן גם ערך התחלתי כלשהו formula_6 ומפיק זרם מפתח באופן בלתי תלוי בטקסט המקורי או בטקסט המוצפן. בניסוח רשמי הצופן כולל:
החלק המייצר את זרם המפתח נקרא "מחולל זרם מפתח" בקיצור KSG והוא זהה לחלוטין בשני הצדדים בצד השולח ובצד המקבל. הדרישה היחידה היא שפונקציית הפלט formula_29 תהיה הפיכה כמו במקרה של XOR.
צופן זרם סינכרוני כשמו, סובל מבעיה מהותית של סינכרוניזציה כאשר יש שיבושים בתקשורת. אם סמל אחד אבד או נוסף במהלך השידור כל הסמלים הבאים אחריו יפוענחו בצורה שגויה מכיוון שאבד הרצף בין זרם המפתח לבין הטקסט המוצפן. בעיה זו ניתנת לפתרון בדרך מאוד פשוטה. מחלקים את הטקסט המקורי למקטעים בגודל קבוע הקרויים פריים (frame) או חלונית ומוסיפים "סיביות סינכרון" ביניהם. הטקסט המקורי מוצפן פריים אחר פריים כשכל פריים מקבל מספר סידורי. לאחר כל פריים מבצעים אתחול מפתח הצפנה ווקטור אתחול שיכול להיות פונקציה מוסכמת של מספר הפריים. כך מתגברים באופן עקיף על בעיית הסינכרון. לסיכום: צופן זרם סינכרוני בדרך כלל מכיל פריים וערך אתחול:
הצורך בווקטור אתחול נובע מהעובדה שהיות ובצופן זרם אסור להצפין שני טקסטים שונים עם אותו מפתח ותמיד קיים חשש שפריים מסוים יישלח שוב כמו שהוא או שהמתקיף עלול לדעת שישנם שני פריימים או יותר זהים בזרם הטקסט המקורי, הפתרון האפשרי הוא החלפת מפתח תדירה, אם כל פריים יוצפן עם מפתח חדש לא תהיה כל בעיה. אולם הכנת מפתח חדש כרוכה בתהליך שגוזל זמן עיבוד, לכן חלופה טובה יותר היא שימוש בווקטור אתחול, שינוי של וקטור האתחול לעיתים קרובות קל יותר ואינו דורש הכנה מוקדמת. כך שאפשר להשתמש עם אותו מפתח אך התוצאה תהיה שונה כי הפריים מוצפן עם מפתח שהוא פונקציה של המפתח הקבוע והערך ההתחלתי שונה עבור כל פריים.
דוגמה טובה לצופן זרם סינכרוני היא צופן A5/1 להלן ששימש בעבר להצפנת שיחות GSM. אורך הפריים היה 228 סיביות ווקטור האתחול נגזר ישירות ממספר הפריים.
צופן זרם א-סינכרוני.
צופן זרם בעל סינכרון עצמי (באנגלית Self-Synchronizing Stream Cipher) או צופן זרם א-סינכרוני המסומן בקיצור SSSC פותר את בעיית הסינכרון בדרך אחרת. בצופן זרם בעל סינכרון עצמי זרם המפתח הוא פונקציה של המפתח הסודי formula_5 ומספר מוגבל של סמלים מהטקסט המוצפן שהופקו עד כה. המצב הפנימי של הצופן ניתן לשחזור באופן מלא בעזרת מספר סמלים קודמים של הטקסט המוצפן, לכן כאשר המקבל מנסה לפענח את הטקסט המוצפן, אם חסר סמל או נוסף סמל כתוצאה משיבושים בשידור, הדבר ישפיע רק על מספר מוגבל של סמלים, לאחריהם הסינכרון יחודש מעצמו והטקסט המוצפן יהיה לאחר מכן תקין. בניסוח פורמלי, כמתואר בתרשים משמאל, ההבדל בין צופן זרם זה לצופן זרם סינכרוני הוא שהסמל הבא של זרם המפתח formula_34 הוא תוצאה של הפונקציה formula_35. כאשר formula_36 מייצג את מספר הסמלים שהפונקציה formula_25 צריכה לקבל מתוך הטקסט המוצפן שהתקבל עד כה, כדי לייצר את הסמל החדש.
יחסית צפני זרם מסוג זה נפוצים פחות. הבולטים שבהם הם מצב הפעלה CFB של צופן בלוקים הפועל למעשה כצופן זרם בעל סינכרון עצמי וכן SSS ו-Moustique.
מחולל פסאודו-אקראי.
למעשה צופן זרם סינכרוני פירושו לא יותר מאשר מחולל מספרים פסאודו אקראיים או בקיצור PRNG. תוצאת המחולל היא זרם המפתח המשמש להצפנה. מודל טיפוסי של צופן זרם סינכרוני מתואר בתרשים משמאל. המבנה הפנימי של המחולל פועל בנפרד וללא תלות במפתח, הטקסט המוצפן או המקורי. מפתח ההצפנה שמסופק על ידי המשתמש נחוץ רק להתנעת התהליך. לאחר האתחול כאשר המחולל כבר נכנס לעבודה אין צורך יותר במפתח.
מחולל פסאודו-אקראי הוא למעשה ניסיון לדמות מחולל אקראי אמיתי. זהו אלגוריתם דטרמיניסטי (מסיבה זו הוא אינו באמת אקראי), שמנסה לייצר רצף של סמלים מתוך האלפבית formula_8 באופן שייראה על פניו כאקראי למתבונן מהצד שאינו יודע מהו הגרעין ההתחלתי. בניגוד למחולל אקראי אמיתי פלט PRNG תלוי בערכים ההתחלתיים. כלומר בהינתן אותו גרעין התחלתי הרצף שהוא ייצר יהיה זהה לחלוטין. מבחינה פרקטית פיתוח מחולל פסאודו-אקראי אינו דבר קל. מחולל טוב צריך להכיל את התכונות הבאות:
דרך ותיקה וקלה להכין מחולל פסאודו-אקראי בעיקר בחומרה אך גם בתוכנה היא בעזרת אוגר זיזה ממושב Feedback shift register, במיוחד הגרסה הליניארית שנקראת LFSR. הסיבות לשימוש ב-LFSR הן: נוחות יישום בחומרה, מחזוריות גבוהה, תכונות אקראיות טובות וקלות ניתוח ובדיקה בעזרת טכניקות אלגבריות. מחולל LFSR הוא מעגל אלקטרוני המתנהג כאוטומט סופי, שמייצר זרם סיביות באורך מוגדר, הנראה לעין כאקראי.
אוגר הזזה LFSR פשוט מורכב ממספר שלבים או יחידות, שכל אחד מהם מסוגל לאחסן סיבית אחת בלבד, לקלוט סיבית אחת ולפלוט סיבית אחת. מעל שלבים אלו שולטת יחידת בקרה, או שעון עצר. ובכל מחזור זמן מתבצעים המהלכים הבאים:
סוג אחר Nonlinear Feedback shift register הגרסה הלא ליניארית של המחולל, דומה לקודמת מלבד זאת שבכל מחזור זמן, תכולת השלב העליון היא תוצאה של מה שקרוי Feedback function, פונקציה בוליאנית לא-ליניארית, המקבלת כקלט מספר קבוע של שלבים קודמים, לא בהכרח עוקבים ומחזירה סיבית אחת.
יישומי צופן זרם באמצעות LFSR.
כיוון ש-LFSR ליניארי במהותו, הוא קל לניתוח ולבדיקה. ישנם אלגוריתמים לבדיקת מחזוריות, סיבוכיות ליניארית ונתונים סטטיסטיים אחרים אודות המחולל. בשל כך לא נהוג להשתמש בזרם LFSR יחיד כמפתח הצפנה. זאת כדי למנוע התקפה על הצופן כאשר חלק מזרם הנתונים ידוע מראש. ביישומים מעשיים צופן זרם מסתמך גם על פונקציה לא ליניארית כלשהי, או משלב כמה יחידות LFSR בקומבינציה לא ליניארית, באופן כזה שמסיר את ליניאריות המחולל. למשל אפשר לעצור זמנית פעולת יחידת LFSR אחת, על פי תוצאת יחידת LFSR אחרת. דהיינו במקרה שתוצאת היחידה הראשונה היא אפס, פלט המחולל יהיה חזרה על מצב קודם של ה-LFSR הראשון. שיטה זו מכונה Stop/go. שיטה אחרת הנקראת Shrinking Generator מיישמת מחוללי LFSR באופן כזה: אם תוצאת יחידה אחת היא "1" תוצאת היחידה השנייה תהווה חלק מפלט המחולל, אם התוצאה היא "0" מתעלמים מתוצאת היחידה השנייה. כלומר אף סיבית אינה נפלטת. כתוצאה מכך פלט המחולל מתכווץ (ומכאן שמו). שיטה זו יושמה בצופן זרם המכונה FISH, אך סובלת מפגיעות למתקפת תזמון, כיוון שקצב התקדמות היחידה הראשונה תלוי בסיביות "1" של היחידה השנייה.
ישנן שלוש שיטות ידועות ליישום LFSR בצופן זרם:
אפשר לבסס מחולל צופן זרם על עיקרון עיצובי יחיד כמו אילו המנויים או לשלב כמה פרדיגמות יחד. בעיקרון לצפני זרם שנשלטים על ידי תזמון שעון (clocking) סדיר יש יתרון בביצועים ואפשרות למקביליות גבוהה יותר לעומת כאלו שמסתמכים על תזמון לא סדיר, אך פגיעים יותר להתקפת קורלציה. בכל מקרה בשתי השיטות התקפה אלגברית ישימה.
צופן A5/1.
דוגמה לצופן זרם מודרני המיישם LFSR היא אלגוריתם A5/1 שיושם בעבר בטכנולוגיית GSM במכשירי טלפון ניידים. A5/1 הוא צופן זרם המייצר זרם מפתח באמצעות מחולל המורכב משלוש יחידות LFSR באורך שונה (ראו תרשים) ומשתמש בטכניקה Stop/go. המחולל מאותחל בעזרת מפתח בגודל 64 סיביות. הפלט בכל מחזור זמן הוא XOR של הסיבית הנמוכה של שלוש יחידות ה-LFSR. עדכון המצב הפנימי מבוסס על סיביות תזמון, הממוקמות בכל יחידה במיקום שונה. כאשר התוצאה נקבעת לפי "החלטת" רוב סיביות התזמון.
צופן זה התגלה כלא בטוח בתחילה עם עבודתו של גוליק ב-1997, המבוססת על פתרון מערכת משוואות ליניאריות, התקפה שלא הייתה יעילה במיוחד. לאחר מכן הורחבה ושופרה ההתקפה על ידי פרופסור עדי שמיר, אלכס ביריוקוב ודויד וגנר בשנת 2000. הם הורידו את סיבוכיות ההתקפה על הצופן, באמצעות חישוב מוקדם של כ-300 גיגה-בית של נתונים. מיד לאחריהם הציעו פרופסור אלי ביהם ואור דונקלמן התקפה משופרת יותר המסתמכת על זרם של formula_39 נתונים (קריאים), ידוע מראש. בשנים 2003 ו-2004 נמצאו שיטות פיצוח טובות אף יותר על ידי אקדהל, יוהנסון ומקסימוב, בעזרתן אפשר לפצח את הצופן בתוך מספר דקות בהסתמך על מספר שניות של זרם נתונים ידוע.
צופן E0.