stanford-oval/wikipedia huggingface dataset:
ג'וזף ג'ונסטון (מושל אלבמה)
ראשית חייו

ג'וזף ג'ונסטון נולד במחוז לינקולן שבקרוליינה הצפונית. הוא התחנך בבתי ספר ציבוריים מקומיים. בגיל 17 הוא עבר לטלדיגה, אלבמה והחל ללמוד באקדמיה צבאית. עם פרוץ מלחמת האזרחים האמריקנית, התגייס ג'ונסטון לצבא הקונפדרציה. הוא שירת במשך כל המלחמה, ונפצע בקרב צ'יקמוגה, קרב ספוטסילבניה (אנ'), קרב ניו מרקט (אנ') ובמצור על פיטרסבורג (אנ'). עד תום המלחמה הוא התקדם לדרגת קפטן.
לאחר תום המלחמה, למד ג'ונסטון משפטים בקריאה עצמית בהדרכתו של ויליאם ה. פורני והתקבל ללשכת עורכי הדין. הוא עסק בעריכת דין בסלמה, אלבמה, ובסופו של דבר עבר לברמינגהאם, כדי להיות נשיא הבנק הלאומי של אלבמה. ב-1887 היה ג'ונסטון לנשיא חברת סלוס ברזל ופלדה.
קריירה פוליטית

בראשית שנות ה-90, אלבמה, כמו רוב מדינות הדרום, חוותה אי-שקט חברתי ופוליטי כאשר החוואים סבלו מקשיים כלכליים משמעותיים ונזקקו באופן נואש לסיוע והקלה. כאשר ממשלות המדינה, שנשלטו על ידי המפלגה הדמוקרטית, כשלו במענה על דרישותיהם, התארגנו החוואים התארגנות פוליטית כאמצעי לחץ, ואף הביסו את הדמוקרטים. כאחד ממוביל הדמוקרטים שהיה אז מועמד רציני למשרה פוליטית בכירה, נעשה ג'ונסטון מעורב בתוכניות ובתמרונים של המפלגה להביס את החוואים ואת המפלגה שהם הקימו, הדמוקרטים הג'פרסונים. ברוב מדינות הדרום, ואף באזורי גידול החיטה במדינות הצפון-מערביות, הם התארגנו כמפלגת העם ונודעו כמפלגה הפופוליסטית.
לאחר שמפלגתו לא בחרה בו כמועמדה למשרת המושל ב-1892 וב-1894, בעיקר באמצעות מעשים של הונאת בחירות, הבין ג'ונסטון שהדמוקרטים לא יכלו להמשיך ולהתעלם מהצרכים של אוכלוסיית המגזר החקלאי במדינה ולהישאר בשלטון באמצעי מרמה. כך, ב-1896 הוא התמודד בבחירות על משרת מושל אלבמה כרפורמטור שקיווה למתן את השמרנות של המפלגה ולטהר את ההתנהלות המושחתת בה, וזאת כדי להשיג את תמיכתם של החוואים המתוסכלים.
סנאטור

על אף מאבקו הממושך בשמרנים, נותר ג'ונסטון דמות משפיעה בחוגי המפלגה. זמן קצר לפני שהסנאטורים הקשישים מאלבמה, ג'ון ט. מורגן ואדמונד ו' פטוס, הלכו לעולמם ב-1907, קיימה המפלגה בחירות מקדימות בלתי רגילות, שבבדיחות כונו הבחירות המקדימות של "הנעליים המתות", כדי לבחור את יורשיהם. ג'ונסטון קיבל את מספר הקולות השני בגודלו, וכך הוא נבחר לאייש את מושבו של פטוס, כשג'ון ה. בנקהד ירש את מורגן.
שש שנות כהונתו בסנאט לא עמדו בסימן של הישגים משמעותיים כלשהם. ג'וזף ג'ונסטון נפטר בכהונתו בוושיגנגטון די. סי. ב-8 באוגוסט 1913. הוא נטמן בבית הקברות אלמווד שבברמינגהאם.
SNOW

בקריפטוגרפיה, SNOW היא משפחה של צפני זרם סינכרוניים הפועלים ברמה של מילים ומותאמים לתוכנה. הגרסה הראשונה שכעת נקראת SNOW 1.0 פותחה בשנת 2000 על ידי Thomas Johansson ו-Patrik Ekdahl מאוניברסיטת לונד שבשוודיה. הצופן מקבל מפתח הצפנה בשני אורכים אפשריים, 128 או 256 סיביות ומפיק בכל פעימה מילה פסאודו-אקראית אחת באורך 32 סיביות המהווה חלק מזרם המפתח. את המפתח מחברים עם זרם המידע בדרך כלל ב-XOR לקבלת זרם מוצפן. SNOW יכול להפיק לכל היותר  2^{50} מילים פסאודו-אקראיות עם מפתח סודי אחד.
SNOW היה מועמד לתחרות שאורגנה בשנים 2000 - 2003 על ידי NESSIE ובשל העובדה שהייתה דרישה לווקטור אתחול הוסיפו המפתחים אופציה כזו בגרסה נוספת של הצופן עם מצב הפעלה הנקרא מצב IV. בסופו של דבר SNOW 1.0 כמו שישה אלגוריתמים נוספים לא התקבלו בגלל קריפטואנליזה שהעידה על בעיות. ב-2003 פיתחו בתגובה אקדל ויוהנסון את SNOW 2.0 שלא רק יותר בטוח אלא גם יותר מהיר בתוכנה ולמעשה נחשב בין הצפנים המהירים ביותר כיום. הוא היה מועמד לפרויקט eSTREAM ושימש כצופן ייחוס לצורך השוואת ביצועים. אולם בשל חולשות תאורטיות שהתגלו בו לא נכלל בפורטפוליו. SNOW 2.0 נכלל בתקן איזו ISO/IEC 18033-4 לצופן זרם.
ב-2006 הוחלט על ידי 3GPP להוסיף צופן חדש לתקן הצפנת שיחות GSM מהדור השלישי ומהדור הרביעי כחלק מהאלגוריתמים UEA2 ו-UIA2 להצפנה מאומתת והוחלט להתבסס על SNOW עם שינויים אחדים שנועדו לחזקו נגד קריפטואנליזה והוא נקרא SNOW 3G. הצופן חופשי לשימוש, אינו מוגן בפטנט ונחשב למהיר יותר מ-AES ולדעת המפתחים בעל רמת ביטחון דומה, אם כי מחקרים מראים שהוא פחות בטוח ממה שהוצהר.
רקע תאורטי

צופן זרם שנקרא גם מחולל פסאודו-אקראי הוא אלגוריתם המקבל מחרוזת קלט אקראית קצרה שנקראת "גרעין" או מפתח סודי ומייצר ממנו מחרוזת פסאודו-אקראית ארוכה שנקראת "זרם מפתח". אף על פי שהאלגוריתם דטרמיניסטי זרם המפתח נראה על פניו כאקראי לכל דבר ועניין לעיני יריב בעל עוצמת חישוב מוגבלת שאינו יודע מהו הגרעין ההתחלתי, מסיבה זו הוא מכונה "פסאודו" - מדומה. ניתן להגשים מחולל כזה בשיטה ישירה עם צופן בלוקים בטוח כמו AES. פשוט מצפינים בלוק מונה כלשהו באופן רקורסיבי כשהמונה מקודם בכל הצפנה, צוברים את הפלט ההצפנה וממנו מכינים מפתח באורך הרצוי, שיטה זו פחות יעילה כי צופן בלוקים אינו מותאם למטרה זו. יתרונו של צופן זרם ייעודי הוא בפשטותו, מהירותו וקלות הטמעתו הן בתוכנה והן בחומרה ובשל כך משיג ביצועים טובים בהרבה. אחת הדרכים ליצור צופן זרם מהיר הן בחומרה והן בתוכנה היא הסתרת תהליך אי-ליניארי כמו פעולת ההחלפה הפנימית של צופן בלוקים הנקראת S-box בתוך תהליך ליניארי הנקרא LFSR, כאשר פלט המחולל בכל פעימה מתקבל על ידי מיזוג פלט שני התהליכים הפועלים במקביל. זהו העיקרון של SNOW. המרכיב האי-ליניארי בנוי ממכונת מצבים הכוללת בתוכה (בגרסה השנייה) את מנגנון ההחלפה של צופן הבלוקים ריינדל וה-LFSR הוא המרכיב הליניארי המשמש בתפקיד כפול, גם להזנת מכונת המצבים וגם להסתרת הפלט שלה שמהווה בסופו של דבר פלט המחולל.
SNOW 1.0

באופן כללי SNOW כולל LFSR בעל 16 "מצבים" או תאים (Taps), כל אחד באורך 32 סיביות יחד עם פונקציית היזון מתאימה והפלט שלו משמש להזנת מכונת מצבים, המסומנת בקיצור FSM, המורכבת משני אוגרי 32 סיביות R1 ו-R2 ופונקציות לחישוב הפלט והמצב הבא (כמתואר בתרשים משמאל). תחילה מאתחלים את הצופן עם המפתח הסודי המסופק על ידי המשתמש וטוענים את וקטור האתחול אם ישנו בדרך המפורטת להלן ואז בכל פעימה 32 סיביות פלט הצופן הן תוצאת חיבור XOR של פלט ה-FSM עם כניסה  16 (האחרונה) של ה-LFSR. ביתר פירוט:
ה-LFSR נוצר על ידי פולינום פרימיטיבי מעל השדה  \mathbb {F} _{2^{32}}:
והיוצר של השדה  \mathbb {F} _{2^{32}} שנבחר הוא:
כאשר  \pi (\alpha )=0 כלומר  \alpha  הוא שורש של הפולינום  \pi . מתייחסים לכניסות האוגר המסומנות על ידי  s_{1},s_{2},...,s_{16} כאל מקדמים בייצוג פולינומי לפי בסיס  \alpha  לדוגמה אם  y\in \mathbb {F} _{2^{32}} אזי אפשר לכתוב אותו  (y_{31},y_{30},...,y_{1},y_{0}) כאשר  y=y_{31}\alpha ^{31}+y_{30}\alpha ^{30}+\cdots +y_{1}\alpha +y_{0}.
בכל פעימה של הצופן, הכניסה הראשונה ב-LFSR שהיא  s_{1} נהיית קלט למכונת המצבים FSM שהפלט שלה הוא:
פלט ה-FSM מחובר ב-XOR עם הכניסה האחרונה  s_{16} וזרם המפתח הוא:  key=FSM_{\text{out}}\oplus s_{16}.
המצב הפנימי של מכונת המצבים מתעדכן בכל פעימה לפי:
הסמל  \boxplus  הוא חיבור מודולו  2^{32}, הפעולה  \lll 7 היא הזזה מעגלית 7 סיביות לשמאל והסמל  \oplus  הוא XOR.
הפונקציה  S מייצגת את תהליך ההחלפה המורכב מארבע תיבות ההחלפה בגודל  8\times 8 סיביות ופרמוטציה. כלומר הקלט מחולק לארבעה בתים, כל אחד עובר מיפוי אי-ליניארי לפי אחת מהתיבות ולאחר מכן התוצאה מוחלפת לפי טבלת התמורה. הקלט לתיבות ההחלפה הוא  w=(w_{7},w_{6},...,w_{0}) סך הכול שמונה סיביות כאשר  w_{7} היא הסיבית המשמעותית ביותר ואילו  w_{0} היא הסיבית הכי פחות משמעותית.  w נחשב לווקטור המייצג אלמנט בשדה  \mathbb {F} _{2^{8}} עם פולינום הבסיס  \{\beta ^{7},...,\beta ,1\} שהיוצר שלו הוא פולינום אי-פריק  \pi (x)=x^{8}+x^{5}+x^{3}+x+1 והמיפוי האי ליניארי הוא:
כאשר האריתמטיקה היא בשדה  \mathbb {F} _{2^{8}}. לאחר ההחלפה האמורה מבצעים תמורה לפי הטבלה הבאה:
{\begin{array}{c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c}31&30&29&28&27&26&25&24&23&22&21&20&19&18&17&16\\\hline 3&10&20&24&0&14&17&29&7&13&18&25&5&12&23&27\end{array}}
{\begin{array}{c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c}15&14&13&12&11&10&9&8&7&6&5&4&3&2&1&0\\\hline 1&8&21&26&4&9&19&31&2&11&16&28&6&15&22&30\end{array}}
הסיבית ה-31 (הסיבית האחרונה כשהספירה מתחילה מאפס) מוחלפת בסיבית במיקום 3 (הרביעית), הסיבית במיקום ה-30 מוחלפת בסיבית ה-10 וכן הלאה.
SNOW 1.0 > אתחול הצופן

במקרה של מפתח באורך 128 סיביות המפתח המסופק על ידי המשתמש מחולק לארבע מילים  k_{1},...,k_{4}, במקרה של מפתח באורך 256 סיביות הוא מחולק לשמונה מילים בהתאמה. וקטור האתחול באורך 64 סיביות מחולק לשתי מילים. את מפתח ההצפנה המסופק על ידי המשתמש יחד עם וקטור האתחול אם ישנו, טוענים לתוך האוגר LFSR כדלהלן:
כאשר  \mathbf {1}  מייצג וקטור שכולו אחדים (32 סיביות). חיבור XOR עם וקטור כזה שקול לאופרטור השלילה. אם המפתח הנבחר באורך 256 סיביות טוענים את המפתח ווקטור האתחול כך:
אם משתמשים עם הצופן במצב ללא וקטור אתחול ההנחה היא ש- IV_{1}=IV_{2}=0. בשלב זה מפעילים את הצופן בדיוק  v פעמים ללא שימוש בפלט, במקום זאת הפלט מוזן בחזרה ללולאת ההיזון של ה-LFSR. במצב ההפעלה הרגיל ללא IV המשתנה  v=64, במקרה של הפעלה עם  IV הוא  v=32. בכל פעימה כל כניסות ה-LFSR מוזזות צעד אחד לימין, כלומר הכניסה השנייה מקבלת את הערך של הכניסה הראשונה, השלישית של השנייה וכן הלאה. בשלב האתחול הערך החדש של הכניסה הראשונה הוא חיבור של הכניסות ה-16, 13 ו-7 יחד עם תוצאת מכונת המצבים:
לאחר מכן הצופן עובר למצב שימוש רגיל כשאז עדכון הכניסה הראשונה מתבצע ללא פלט מכונת המצבים:
SNOW 1.0 > הצפנה

לאחר שלב האתחול, הצופן מופעל פעם אחת ללא שימוש בפלט, ולאחר מכן הוא מוכן לשימוש, 32 הסיביות הבאות של המחולל הן:
ההצפנה מבוצעת על ידי חיבור פלט המחולל עם המסר מילה אחר מילה, עד להשלמת כל המסר. הפענוח מתבצע על ידי הפעולה ההפוכה. בדרך כלל משתמשים בפעולה XOR שהיא הופכית של עצמה ולכן פענוח והצפנה זהים.
SNOW 1.0 > ביטחון

בפיתוח SNOW הושם דגש על עמידות נגד התקפת קורלציה שהיא התקפה גנרית אפקטיבית נגד כל צופן זרם שעושה שימוש ב-LFSR והיא מסתמכת על רמת מתאם מסוימת בין פלט המחולל למצב הפנימי בזמן נתון. למיטב ידיעת המפתחים כמות הזיכרון לצורך התקפה מעין זו נגד SNOW היא מעבר ליכולת הטכנולוגית הקיימת. התקפה נוספת שהצליחה במיוחד נגד A5/1 היא התקפת איזון זמן/זיכרון והיא אינה אפשרית נגד SNOW בשל העובדה שהמצב הפנימי גדול מדי. התקפה אפשרית אחרת היא מסוג Guess and Determine שאיתה הצליחו לפרוץ בין היתר את A5/1. היא פועלת בעיקרון כך; מנחשים חלק מהערכים הפנימיים ומנסים למצוא קשר או יחס כלשהו עם ערכים פנימיים אחרים בעיקר בפונקציית ההיזון. ההתקפה מצליחה אם מצליחים לנחש נכונה את כל המצב הפנימי. בפברואר 2002 פרסמו Hawkes ו-Rose התקפת ניחוש קריפטוגרפית כזו נגד SNOW בסיבוכיות מקום של  2^{95} מילים ובסיבוכיות זמן של  2^{224} פעולות. אף על פי שההתקפה תאורטית היא מצביעה על חולשה מסוימת כיוון שהוכח שניתן לפרוץ את הצופן בזמן נמוך מכוח גס כפי שנטען על ידי המפתחים. בין היתר ההתקפה ניצלה את העובדה שמכונת המצבים מקבלת קלט יחיד. התקפה אחרת מ-2002 של Coppersmith, Halevi, Jutla שהיא סוג של התקפת הבחנה גנרית נגד צופן זרם הכולל מיסוך אי-ליניארי מצליחה לשבור את הצופן בזמן של  2^{100} פעולות ועם  2^{95} מילות פלט של הצופן. ההתקפה מבוססת על ההבחנה שקיימת קורלציה בפולינום ההזנה וגם היא כמובן תאורטית. בגרסה השנייה המפתחים ניסו לפתור את הבעיות הללו.
SNOW 2.0

מבחינה סכמתית ההבדל בין גרסה 1 לגרסה 2 מינורי (כמתואר בתרשים משמאל). כקודמו ה-LFSR מכיל 16 כניסות באורך 32 סיביות, אך פולינום ההזנה (feedback polynomial) השתנה. כמו כן מכונת המצבים FSM מקבלת שתי מילות קלט במקום אחת. וכמו בקודם, הפלט הוא XOR של פלט ה-FSM עם הכניסה האחרונה של ה-LFSR. פולינום ההזנה כולל כעת שני אלמנטים שונים,  \alpha  ו- \alpha ^{-1}, כאשר הראשון הוא שורש של פולינום פרימיטיבי ממעלה 4 מעל  \mathbb {F} _{2^{8}}, ביתר פירוט:
המצב הפנימי בזמן  t מיוצג על ידי  s_{t+15},s_{t+14},...,s_{t} כאשר  s_{i}\in \mathbb {F} _{2^{32}}. האלמנט  s_{t} הימני ביותר הוא האלמנט הראשון והוא פלט ה-LFSR בכל פעימה. הזמן  t=0 פירושו הפעימה הראשונה מיד לאחר אתחול המצב הפנימי עם המפתח. הצופן מופעל פעם אחת על ריק לפני שמתחילים לייצר את זרם המפתח, כלומר בזמן  t=1. פלט הצופן הוא  z_{1},z_{2},z_{3},.... מכונת המצבים FSM מכילה שני אוגרים המסומנים  R1 ו- R2 כל אחד מהם בעל קיבולת של 32 סיביות. תכולת האוגרים בזמן  t\geq 0 מסומנת  R1_{t},  R2_{t} בהתאמה. הקלט ל-FSM נלקח משתי הכניסות  s_{t+15},s_{t+5} ב-LFSR ופלט מכונת המצבים בזמן  t המיוצג על ידי  F_{t} מחושב כדלהלן:
פלט הצופן בזמן זה הוא
פונקציית העדכון של מכונת המצבים פועלת כך:
SNOW 2.0 > S-box

תיבות ההחלפה של SNOW 2.0 המסומנות  S(w) הן בעצם פרמוטציה המבוססת על פונקציית הסבב של צופן ריינדל כדלהלן; אם  w=(w_{3},w_{2},w_{1},w_{0}) הוא מילת קלט באורך 32 סיביות המחולקת לארבעה בתים כאשר  w_{3} הוא הבית החשוב, אפשר להתייחס אליה כאל וקטור (עמודה). תחילה מיישמים החלפה לפי תיבות ההחלפה של ריינדל ולאחר מכן מבצעים את הפונקציה MixColumn של ריינדל. כלומר מתייחסים למילת הקלט כאל פולינום  y ממעלה לכל היותר 3 מעל השדה  \mathbb {F} _{2^{8}} המיוצג על ידי פולינום אי-פריק  x^{8}+x^{4}+x^{3}+x+1 מעל  \mathbb {F} _{2} ומכפילים בפולינום קבוע  c(y)=(x+1)y^{3}+y^{2}+y+x מעל  \mathbb {F} _{2^{8}}[y]. הכפל האחרון יכול להתבצע כמו בריינדל על ידי חשבון מטריצות:
התוצאה היא הבתים  r_{0},r_{1},r_{2},r_{3}. שתי הפעולות יחד ניתנות לביצוע במשולב כמו בפסאודו קוד הבא:
כאשר  S_{R} מייצגת את תיבות ההחלפה של ריינדל והפונקציה  {\text{MULx}} היא פעולת הכפלה של אלמנט בשדה עם אלמנט פרימיטיבי ( x) שהיא דומה לכפל ב-2, במילים אחרות; פעולת Shift לשמאל סיבית אחת במידה שאין גלישה, או פעולת Shift ו-XOR אחד עם ערך קבוע ( {\text{0x1b}}) אם הייתה גלישה. דהיינו אם הסיבית המשמעותית ביותר הייתה '1' לפני הכפל (הפונקציה מתוארת ביתר פירוט ב-SNOW 3G להלן).
SNOW 2.0 > אתחול מפתח

תחילה, אם מפתח ההצפנה באורך 128 סיביות או ארבע מילים  k_{0},...,k_{3} באורך 32 סיביות כל אחת, טוענים אותו יחד עם וקטור האתחול  IV באורך ארבע מילים  IV_{0},...IV_{3} אם ישנו, לתוך ה-LFSR לפי:
כאשר 1 מייצג וקטור שכולו אחדים ( {\text{0xffffffff}}). אם המפתח הוא 256 סיביות כלומר שמונה מילים  k_{0},...,k_{7} אזי הטעינה מתבצעת לפי:
לאחר מכן מאפסים את R1 ו-R2 ומפעילים את הצופן 32 פעימות (Clocks) מבלי לייצר כל פלט, אלא במקום זאת מזינים את התוצאה בחזרה לפונקציית ההזנה (כמתואר בתרשים), לכן במהלך האתחול האלמנט הבא שמוזן לתוך ה-LFSR הוא:
בתום 32 הפעימות מבצעים פעימה נוספת ללא פלט ולאחר מכן הצופן עובר למצב הפעלה נורמלי. שבו הכניסה האחרונה ב-LFSR לאחר כל פעימה מעודכנת כך:
מכאן ואילך בכל פעימה נוצרת מילה פסאודו אקראית שהיא חלק מזרם המפתח שהצופן מייצר, עד  2^{50} מילים כאלה שאז יש צורך להחליף מפתח.
ההבדלים העיקריים בין גרסה 1 לגרסה 2 הם:
שינוי פולינום ההזנה, בעוד שב-SNOW 1.0 ניתן היה לחשב את לולאת ההזנה עם כפל יחיד ו-XOR אחד מותנה, כך שרוב הזמן בוצע רק Shift הרי שבגרסה 2 מבוצעות שתי הכפלות ו-XOR בלתי מותנה בכל אחת מהן. התוצאה היא פיזור טוב יותר של הסיביות מה שמחזק את הצופן נגד התקפת קורלציה.
שימוש בשני קבועים שונים בלולאת ההזנה במקום אחד. למיטב ידיעת המפתחים אין אפשרות למניפולציה של פולינום ההזנה כך שנוסחת הנסיגה הליניארית שלו תהיה בעלת משקל נמוך.
ביצוע XOR באופן קבוע ללא תלות במשתנים האחרים בפולינום ההזנה משפר ביצועים, לעומת הגרסה הקודמת שבה ה-XOR היה מותנה בסיבית המשמעותית.
ה-FSM של הגרסה השנייה מקבל שני פרמטרים במקום אחד. מה שמקשה על התקפות בסגנון ניחוש ובדיקה, כיוון שפלט R1 תלוי כעת גם בקלט מה-LFSR.
תיבות ההחלפה החדשות בגרסה 2 הושאלו מצופן ריינדל לעומת גרסה 1. הבחירה הזו משפרת את הפיזור כך שכל סיבית פלט מושפעת מכל סיביות הקלט, בניגוד לגרסה הקודמת.
SNOW 2.0 > ביטחון

ביטחון SNOW 2.0 טוב יותר מהגרסה המקורית אם כי גם בו התגלו חולשות לא מעטות. התקפות קירוב ליניארי והתקפות הבחנה שהתפרסמו מוכיחים שהצופן פחות בטוח ממה שהצהירו המפתחים.
SNOW 3G

SNOW 3G מבוסס על SNOW 2.0 והוא שוכן בליבה המבצעת הצפנה מאומתת של תקשורת סלולרית באלגוריתמים UEA2 להצפנה ו-UIA2 לאימות בדור השלישי ובדור הרביעי של GSM. הצופן פועל ברמה של מילים באורך 32 סיביות, מקבל מפתח סודי באורך 128 סיביות וכן וקטור אתחול באורך 128 סיביות. הפלט מחובר עם השיחה או הנתונים מילה אחר מילה ב-XOR והתוצאה משודרת לצד השני. בפענוח הצד המקבל פועל באופן דומה, מפעיל את הצופן עם המפתח הסודי המשותף לקבלת זרם מפתח תואם ואז מחבר שוב עם השיחה המוצפנת כדי להחזירה למצב הגלוי.
SNOW 3G כולל אוגר LFSR אחד בעל 16 כניסות (Taps) באורך 32 סיביות כל אחת, מכונת מצבים אחת הכוללת שלושה אוגרים באורך 32 סיביות ופונקציות עדכון מתאימות לפי הפירוט בהמשך. בתחילת כל שיחה טוענים את המפתח ואת וקטור האתחול לתוך המצב הפנימי והצופן מופעל 32 פעימות ללא שימוש בפלט במקום זאת הפלט מוזן בחזרה לאוגר ולאחר מכן עוברים למצב הפעלה רגיל ומייצרים בכל פעימה 32 סיביות מפתח. בשני מצבי ההפעלה של הצופן (Clocking), מצב האתחול ומצב העבודה משתמשים בשתי הפונקציות הבאות:
SNOW 3G > הפונקציה MULx

פונקציה להכפלת אלמנטים בשדה  \mathbb {F} _{2^{8}} ב-2 (או הפולינום  x), הנקראת  {\text{MULx}}(V,c) מקבלת שני בתים  V,c ומחזירה בית אחד:
הזזה שמאלה (sift left) שהיא פעולה המובנית בכל המעבדים שקולה לכפל בפולינום  x (או ב-'02') שהוא אלמנט פרימיטיבי בשדה  \mathbb {F} _{2^{8}}. אם הסיבית המשמעותית ביותר של  V היא '1' תתרחש גלישה לאחר הזזה, במצב זה מתקבל אלמנט שאינו בשדה  \mathbb {F} _{2^{8}} ולכן יש צורך לבצע צימצום מודולרי עם הקבוע  c ולקחת את השארית. כיוון שהגלישה מאוד קטנה אין צורך בביצוע פעולת חילוק ארוכה, לכל היותר יידרש חיסור אחד כדי לקבל את השארית. בהרחבה של שדה בינארי פעולת החיסור זהה לחיבור והיא XOR.
SNOW 3G > הפונקציה MULxPOW

הפונקציה  {\text{MULxPOW}} משתמשת ב- {\text{MULx}} באופן רקורסיבי כדי לבצע העלאה בחזקה מודולרית של אלמנטים בשדה. היא מקבלת שני בתים  V,c ומעריך  i ומחזירה בית אחד כך:
הפונקציה MULx מקבילה למעשה להכפלה באיבר פרימיטיבי של ההרחבה ממעלה 8 מעל  GF(2). יהי  \beta  שורש של פולינום אי פריק ממעלה 8 מעל  GF(2)[\beta ] אז עבור כל אלמנט  V\in GF(2^{8}) התוצאה של MULx מקבילה ל- V\cdot \beta . כמו כן הפונקציה MULxPOW מקבילה להכפלה בחזקה  i של האיבר הפרימיטיבי:  V\cdot \beta ^{i}.
SNOW 3G > LFSR ו-FSM

אוגר ה-LFSR מורכב מ-16 מצבים  s_{0},s_{1},...,s_{15} כל אחד מכיל 32 סיביות. מכונת המצבים FSM מכילה שלושה אוגרי 32 סיביות הנקראים  R_{1},R_{2},R_{3}. פונקציות ההחלפה  S_{1} ו- S_{2} משמשות לעדכון האוגרים  R_{1} ו- R_{2} בהתאמה (כמתואר בתרשים משמאל). תיבות ההחלפה ממפות קלט באורך 32 סיביות לפלט באורך 32 סיביות. הקלט מחולק לארבעה בתים  w=w_{0}\|w_{1}\|w_{2}\|w_{3} כאשר  w_{0} הוא הבית הכי פחות משמעותי (LSB).
SNOW 3G > פונקציות החלפה

את פונקציית ההחלפה  S_{1} מכינים על ידי הטבלה  S_{R} אותה משאילים מצופן ריינדל (בהמשך). הקלט מחולק לארבעה בתים  אותם מפרשים כמקדמים של אלמנט בשדה  GF(2^{8}) המוגדר על ידי הפולינום  x^{8}+x^{4}+x^{3}+x+1. בנוסף להחלפה לפי ה-S-box של ריינדל מתבצעת הפונקציה MixColumn של ריינדל. שתי הפעולות, ההחלפה וערבוב העמודות מבוצעות במשולב כדלקמן:
את פונקציית ההחלפה  S_{2} מכינים על ידי הטבלה  S_{Q} המובאת להלן. ההחלפה מתבצעת כך
פונקציית ההיזון של ה-LFSR וכן פונקציית העדכון של ה-FSM משתמשות בפונקציות  {\text{MUL}}_{\alpha } ו- {\text{DIV}}_{\alpha } המוגדרות כך:
SNOW 3G > תיבות החלפה S-box

הטבלה  S_{R} מכילה 256 ערכים אפשריים באורך 8 סיביות (בתים) בבסיס הקסדצימלי מתוך תיבות ההחלפה של צופן ריינדל, כך שמתקיים  S_{R}(x_{0}2^{4}+x_{1})=y_{0}2^{4}+y_{1}, התא המצוי בשורה  x_{0} ועמודה  x_{1} מכיל את הערך  y_{0}\|y_{1}. לדוגמה  S_{R}(42)=S_{R}({\text{0x2A}})={\text{0xE5}}=229:
0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
0 63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76
1 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0
2 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15
3 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75
4 09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84
5 53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF
6 D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8
7 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2
8 CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73
9 60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB
A E0 32 3A 0A 49 06 24 5C C2 D3 AC 62 91 95 E4 79
B E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 08
C BA 78 25 2E 1C A6 B4 C6 E8 DD 74 1F 4B BD 8B 8A
D 70 3E B5 66 48 03 F6 0E 61 35 57 B9 86 C1 1D 9E
E E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF
F 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16
הטבלה  S_{Q} מכילה 256 ערכים אפשריים באורך 8 סיביות (בתים) בבסיס הקסדצימלי אותה מכינים על ידי פולינום דיקסון  g_{49}(x)=x\oplus x_{9}\oplus x^{13}\oplus x^{15}\oplus x^{33}\oplus x^{41}\oplus x^{45}\oplus x^{47}\oplus x^{49} כך שעבור קלט  x באורך 8 סיביות המייצג אלמנט בשדה  GF(2^{8}) המוגדר על ידי הפולינום  x^{8}+x^{6}+x^{5}+x^{3}+1 כל כניסה בטבלה מתאימה ל- g_{49}(x)\oplus {\text{0x25}}:
0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
0 25 24 73 67 D7 AE 5C 30 A4 EE 6E CB 7D B5 82 DB
1 E4 8E 48 49 4F 5D 6A 78 70 88 E8 5F 5E 84 65 E2
2 D8 E9 CC ED 40 2F 11 28 57 D2 AC E3 4A 15 1B B9
3 B2 80 85 A6 2E 02 47 29 07 4B 0E C1 51 AA 89 D4
4 CA 01 46 B3 EF DD 44 7B C2 7F BE C3 9F 20 4C 64
5 83 A2 68 42 13 B4 41 CD BA C6 BB 6D 4D 71 21 F4
6 8D B0 E5 93 FE 8F E6 CF 43 45 31 22 37 36 96 FA
7 BC 0F 08 52 1D 55 1A C5 4E 23 69 7A 92 FF 5B 5A
8 EB 9A 1C A9 D1 7E 0D FC 50 8A B6 62 F5 0A F8 DC
9 03 3C 0C 39 F1 B8 F3 3D F2 D5 97 66 81 32 A0 00
A 06 CE F6 EA B7 17 F7 8C 79 D6 A7 BF 8B 3F 1F 53
B 63 75 35 2C 60 FD 27 D3 94 A5 7C A1 05 58 2D BD
C D9 C7 AF 6B 54 0B E0 38 04 C8 9D E7 14 B1 87 9C
D DF 6F F9 DA 2A C4 59 16 74 91 AB 26 61 76 34 2B
E AD 99 FB 72 EC 33 12 DE 98 3B C0 9B 3E 18 10 3A
F 56 E1 77 C9 1E 9E 95 A3 90 19 A8 6C 09 D0 F0 86
SNOW 3G > מצב אתחול

באתחול הצופן בכל פעימה ה-LFSR מקודם כך שהערך המצוי בכל כניסה מועתק לכניסה הבאה משמאל לימין (כלומר  s_{0}=s_{1},s_{1}=s_{2},s_{2}=s_{3} וכן הלאה), הכניסה האחרונה  s_{15} מתעדכנת על ידי פונקציית ההיזון לפי הנוסחה הבאה. מתייחסים ל- s_{0} כאל ארבעה בתים  s_{0,0}\|s_{0,1}\|s_{0,2}\|s_{0,3} וכן לגבי הכניסה  s_{11}:
הערך  F הוא פלט מכונת המצבים המוגדרת להלן.
SNOW 3G > מצב הצפנה

במצב הצפנה ה-LFSR מקודם באותו אופן, כל הערכים זזים ימינה והכניסה האחרונה מתעדכנת לפי:
בשלב זה לא כוללים את פלט מכונת המצבים בפונקציית ההזנה.
SNOW 3G > מכונת המצבים

מכונת המצבים FSM מקבלת מה-LFSR שתי מילים מהכניסות  s_{15} ו- s_{5} ומייצרת מילה אחת  F כדלהלן:
עדכון מכונת המצבים מתבצע כך:
SNOW 3G > הכנת מפתח

בשלב הכנת הצופן טוענים את המפתח הסודי באורך 128 סיביות המחולק לארבע מילים  k_{0},...,k_{3} ואת וקטור האתחול  IV_{0},...,IV_{3} לתוך ה-LFSR כדלהלן:
כאן  \mathbf {1}  מייצג מילה המכילה 32 אחדים ( {\text{0xffffffff}}) כמו כן בשלב האתחול תכולת האוגרים של ה-FSM מאופסת. ואז מריצים את הצופן 32 פעימות ללא שימוש בפלט, אלא במקום זאת הפלט  F מחובר לפונקציית ההיזון בחזרה. לאחר מכן מריצים את הצופן פעימה נוספת בה לא משתמשים בפלט כלל ולאחר מכן הצופן מוכן לשימוש.
SNOW 3G > הצפנה

בכל פעימת הצפנה המהלכים הבאים מתבצעים:
מריצים את ה-FSM פעימה אחת ומייצרים את  F,
מכינים מילת מפתח אחת  z_{t}=F\oplus s_{0},
מריצים את ה-LFSR פעימה אחת.
מחברים את מילת המפתח עם מילה אחת מהמסר או השיחה.
חוזרים שוב על התהליך עד להשלמת כל המסר.
SNOW 3G > ביטחון

בעקרון ביטחון גרסה זו מבוסס על SNOW 2.0 וקיימת קריפטואנליזה של שתי הגרסאות. מחקרים מראים שקיימת חולשה שנקראת "מפתחות קשורים" (related keys) בשניהם וכן התגלו חולשות באקראיות הצופן. ב-2010 פורסמה התקפת ערוץ צדדי נגד SNOW 3G שמראה שניתן לפרוץ את הצופן בזמן מאוד קצר (מספר שניות) אם לתוקף יש אפשרות להשיג מידע תיזמון הקשור במעבר מתיבת החלפה אחת לשנייה. הפתרון שהוצע במקרה כזה שימוש בטכניקה שנקראת BitSlice בדומה לצופן סרפנט.
היבטי יישום

צופן SNOW פותח תוך מתן דגש על יישום מהיר בתוכנה. הפעולות בצופן נפוצות בכל מעבד מצוי; XOR, חיבור שלמים, הזזה ואחזור טבלאות (קריאות זיכרון). אף על פי ש-LFSR הוא רכיב חומרה אפשר ליישמו ביעילות בתוכנה, השדה  \mathbb {F} _{2^{32}} הוא הרחבה של  \mathbb {F} _{2^{8}} עם  \alpha \in \mathbb {F} _{2^{32}} שורש ממעלה 4 של הפולינום
לכן אפשר לצמצם את המעלה של  \alpha  כי
בסיכומו של דבר הכפל ב- \alpha  וב- \alpha ^{-1} בלולאת ההזנה ניתנים למימוש בתוכנה בפעולת הזזה (shift) ברמה של בתים. לסיכום זה נראה כך:
המקדמים  c_{i} הם בתי הקלט  w. אפשר לבצע את הכפל והחילוק בשיטה הישירה כמתואר לעיל או באמצעות טבלאות חיפוש מוכנות מראש כמו בפסאודו קוד הבא:
result=(w<<8) ^ MUL_A[w & 0xff];
result=(w>>8) ^ MUL_AINVERSE[w & 0xff];
יישום פעולת ההחלפה של צופן SNOW בתוכנה ניתן להאצה בטכניקה דומה לזו שאומצה בצופן ריינדל. הכפל במטריצות המתואר לעיל ניתן לפיצול כצירוף ליניארי של העמודות תוך שימוש בארבע תיבות המכילות 256 מילים כל אחת. כל טבלה מכילה את כל התוצאות האפשריות של הכפלה בעמודה אחת בהתאם. לסיכום בפסאודו קוד הבא יוצאים מהנחה שקיימות ארבע טבלאות  T0,...,T3 כאמור:
r=T0[w & 0xff] ^ T1[(w >> 8) & 0xff] ^ T2[(w >> 16) & 0xff] ^ T3[(w >> 24) & 0xff];
כמו כן אפשר ליישם את ה-LFSR בשני אופנים. האחד קל לקריאה והוא מיושם באמצעות מערכים ושימוש בטכניקת חלון, קרי במקום לבצע העתקה בפועל של ערכים מנהלים מעקב באמצעות מצביעים. השני הוא הארד קודינג של מצבי ה-LFSR. היתרון בשיטה האחרונה שבכל קריאה לפרוצדורה להפקת זרם המפתח נוצרות בבת אחת 512 סיביות המקבילות ל-16 פעימות שעון בשיטה הרגילה. בניסוי שערכו המפתחים על פנטיום 4 של אינטל 1.8GHz עם 512 מגה, בגרסה 2 הממוטבת (הארד קודינג) נדרשו 18 מחזורי שעון למילה אחת. שהוא קצב מהיר כמעט פי שניים.
ראו גם

צופן זרם
GSM
SOSEMANUK
הערות שוליים

↑  SNOW - a new stream cipher
↑  A New Version of the Stream Cipher SNOW
↑  P. Hawkes, G. Rose, "Guess-and-determine attacks on SNOW", Preproceedings of Selected Areas in Cryptography (SAC), August 2002, St John's, Newfoundland, Canada
↑  Cryptanalysis of stream ciphers with linear masking
↑  Improved Linear Distinguishers for SNOW 2.0
↑  Alexander Maximov and Thomas Johansson. Fast Computation of Large Distributions and Its Cryptographic Applications. In Asiacrypt 2005, LNCS 3788, Springer-Verlag, pages 313–332, 2005.
↑  De Canni'ere. A Distiguishing Attack of SNOW 2.0 with Linear Masking Method. In Selected Areas in Cryptography, SAC 2003, LNCS 3006, Springer-Verlag, pages 222–233, 2004.
↑  On the Sliding Property of SNOW 3G and SNOW 2.0
↑  Consecutive S-box Lookups: A Timing Attack on SNOW 3G
תיאור סכימתי של צופן SNOW 1.0
תיאור סכימתי של צופן SNOW 2.0
בשלב האתחול של SNOW 2.0 הפלט של מכונת המצבים  F_{t} מחובר עם פונקציית ההיזון של ה-LFSR.
תיאור סכמתי של צופן SNOW 3G
ישמעאל בן נתניה

ישמעאל בן נתניה (לפעמים: ישמעאל בן נתניהו) היה רוצחו של גדליה בן אחיקם, מנהיג "שארית הפליטה" שנשארה בארץ אחר חורבן בית המקדש הראשון.