בקריפטוגרפיה, **Simon** ו-**Speck** הן משפחות של צופן בלוקים קלי-משקל במבנה פייסטל בסגנון ARX, שפותחו ופורסמו ביוני 2013 על ידי הסוכנות לביטחון לאומי של ארצות הברית במטרה להכשירם כתקן הצפנה על ידי ארגוני התקינה הבינלאומיים. היעד של הצפנים הללו הוא למלא את הצורך בצופן קל משקל, גמיש ונוח לניתוח, המציע תפוקה וביצועים מצוינים, בעיקר לאינטרנט של הדברים - חומרה מוגבלת משאבים וצריכת אנרגיה נמוכה מאוד. Simon מכוון בעיקר לביצועים אופטימליים בחומרה ואילו Speck מכוון לביצועים אופטימליים בתוכנה.

רקע ומוטיבציה
-------------

צפנים סימטריים כמו AES שפותחו בעשור הקודם נועדו בעיקר למחשבים שולחניים ושרתים והם אינם מתאימים במיוחד לחומרה דלת משאבים כמו RFID או סנסורים אלחוטיים, כי הם פותחו בטרם המחשוב המפושט (Pervasive Computing) פרץ לתודעה. כיום בעידן האינטרנט של הדברים התקנים רבים בעלי חומרה זעירה צריכים להתקשר ביניהם באופן אלחוטי. וביטחון הוא מצרך חשוב במרביתם, רצוי שהאקר לא יצליח להשתלט מרחוק על משאבת אינסולין או על בלמים של רכב בזמן נסיעה.

תחום חדש יחסית הנקרא צופן בלוקים קל משקל אמור לתת מענה לבעיה זו. קיים כיום היצע רחב וארגוני התקינה שוקדים על הכנסת צפנים כאלה לתקנים הבינלאומיים, עמם נמנים PRESENT,‏ KATAN,‏ KLEIN ו-Picolo. הצפנים Simon ו-Speck אמורים להשתלב בין הצפנים קלי המשקל תוך שהם מפגינים ביטחון הכרחי כנדרש, גמישות וביצועים טובים ביותר ונפח הקטן ביותר האפשרי לעומת הצפנים המתחרים. צופן בלוקים הוא פרימיטיב קריפטוגרפי ורסטילי ולו שימושים רבים כחלק מפרוטוקולים ומערכות הצפנה ולכן חשיבותו רבה. היות שהתחום צעיר, לא קיימת הגדרה ברורה למושג "קל משקל". באופן כללי מתייחסים לשני נושאים, מימוש מינימלי בחומרה במונחים של תואמי שערים לוגיים (GE) או מימוש בתוכנה בכמות זיכרון SRAM או הבזק מינימליים. ניצול שטח קטן בחומרה פירושו פונקציית סבב פנימית פשוטה יותר גם אם המחיר הוא עלייה במספר הסבבים. בחומרה זעירה מסוג זה שלעיתים פועלת ללא מקור אנרגיה עצמאי, אין חשיבות רבה לתפוקה אלא מושם דגש יותר על צריכת אנרגיה נמוכה. למרות שלא הוגדר בתקן, המוסכמה היא תפוקה של 12 קילוביט לשנייה בתדר של 100KHz. כדי שיהיה שמיש, צופן בלוקים קל משקל צריך להיות גמיש מספיק להתאמה למגוון פלטפורמות ולצורכי ביטחון שונים. לדוגמה אם החומרה פחות מוגבלת רצוי שהצופן יוכל לנצל זאת לשיפור התפוקה על חשבון תוספת שערים.

לאור האמור, קיימים מספר היבטים שיש להתחשב בהם כמו: סריאליות, מקביליות ותאימות. סריאליות משפיעה על היכולת למזער את שטח החומרה שהצופן מאכלס למשל אם הצופן עושה שימוש בתיבות החלפה קבועות קשה להתעלם מהשטח שהן תופסות לכן רצוי להימנע מכך. מסיבה זו למבנה ARX יתרון כי הוא אינו עושה שימוש בתיבות החלפה כלל, האי-ליניאריות שלו מושגת משילוב פעולות אריתמטיות בשדות אלגבריים שונים (חיבור מודולרי ו-XOR). מקביליות משפיעה על התפוקה של הצופן ותאימות מתייחסת ליכולת להתאים את האלגוריתם לשימוש ספציפי. לדוגמה בלוק בגודל 64 סיביות ומפתח באורך 128 סיביות בדרך כלל טיפוסיים לתוכנה בעוד שבחומרה לפעמים מעדיפים משיקולי יעילות בלוק באורך 48 סיביות ומפתח באורך 96 סיביות (כאשר מודל הביטחון מאפשר זאת). מסיבה זו Simon ו-Speck עוצבו באופן שיוכלו להשתלב במגוון תצורות (ראו טבלה).

| אורך הבלוק | אורך המפתח |
| --- | --- |
| 32 | 64 |
| 48 | 72, 96 |
| 64 | 96, 128 |
| 96 | 96, 144 |
| 128 | 128, 192, 256 |

Simon
-----

תיאור מבנה פייסטל של הפונקציה הפנימית בצופן Simon
צופן Simon הוא רשת פייסטל מאוזנת הפועלת על מילים באורך {\displaystyle n} סיביות ולכן הבלוק באורך {\displaystyle 2n} סיביות. הצופן מקבל בלוק קריא באורך {\displaystyle 2n} סיביות ומחזיר בלוק מוצפן באורך {\displaystyle 2n} סיביות. למען הנוחות הוא מסומן בקיצור SIMON2n כאשר {\displaystyle n\in \{16,24,32,48,64\}}. אם {\displaystyle m\in \{2,3,4\}} אז צופן SIMON2n עם מפתח באורך {\displaystyle mn} מסומן בקיצור SIMON2n/mn. לדוגמה SIMON64/128 מתייחס לגרסה הפועלת על מילים באורך 32 סיביות, בלוק באורך 64 סיביות ומפתח באורך 128 סיביות. הצפנה ופענוח ב-SIMON2n עושה שימוש בשלוש פעולות בסיסיות בלבד בסגנון ARX הידוע בחוסנו וקיים בשימוש צפנים רבים ביניהם Salsa20 והם: XOR,‏ AND והזזה מעגלית {\displaystyle S^{j}} כאשר {\displaystyle j} מציין את מספר הפוזיציות שיש להזיז (אם {\displaystyle j} שלילי ההזזה היא לימין).

### פונקציית הסבב

עבור מפתח {\displaystyle k\in {\text{GF}}(2)^{n}} (מחרוזת אקראית באורך {\displaystyle n} סיביות) פונקציית הסבב תלויית המפתח מתבצעת בשני שלבים. מיפוי פייסטל {\displaystyle R\_{k}:{\text{GF}}(2)^{n}\times {\text{GF}}(2)^{n}\rightarrow {\text{GF}}(2)^{n}\times {\text{GF}}(2)^{n}} המוגדר על ידי 

{\displaystyle R\_{k}(x,y)=(y\oplus f(x)\oplus k,x)}
והפונקציה {\displaystyle f(x)=(S^{1}x\ \ \&\ \ S^{8}x)\oplus S^{2}x} כאשר {\displaystyle k} הוא מפתח הסבב.

הביטוי {\displaystyle S^{i}x} פירושו הזזה מעגלית של {\displaystyle x} לשמאל {\displaystyle i} סיביות והסימן & מייצג את האופרטור AND. הפונקציה ההופכית של פונקציית הסבב הנחוצה לצורך הפענוח היא {\displaystyle R\_{k}^{-1}(x,y)=(y,x\oplus f(y)\oplus k)}. לעיתים קרובות משקולי יעילות מיישמים את הצפנים הללו בתצורה שבה יש צורך רק בפונקציית ההצפנה שהיא טובה גם להצפנה וגם לפענוח (ראו מצב מונה לדוגמה).

תהליך הכנת המפתח מקבל את המפתח שסופק על ידי המשתמש ומייצר ממנו סדרה של {\displaystyle T} מילים: {\displaystyle k\_{0},k\_{1},...k\_{T-1}}. כאשר {\displaystyle T} הוא מספר הסבבים. ההצפנה היא בעצם הרכבה של הפונקציות {\displaystyle R\_{k\_{T-1}}\circ \cdots \circ R\_{k\_{1}}\circ R\_{k\_{0}}} (מימין לשמאל).

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

### הכנת המפתח

תהליך הכנת המפתח של Simon כולל שימוש בסדרה של קבועי סבב באורך סיבית אחת. תוספת זו הוכנסה כדי להרוס את הסימטריות של ההזזה המעגלית וכן כדי לסכל התקפת גלישה. למעשה וריאציות של Simon מופרדות באופן קריפטוגרפי על ידי חמש סדרות שונות של קבועים: {\displaystyle z\_{0},z\_{1},z\_{2},z\_{3},z\_{4}}. כל אחת מהן היא פונקציה של אחת משלוש הסדרות המחזוריות הקבועות {\displaystyle u,v,w} עם מחזוריות באורך 31 סיביות שאותן מחשבים לפי מטריצות קבועות המובאות להלן. את חמש הסדרות של הקבועים מחשבים כדלהלן: שתי הראשונות הן למעשה {\displaystyle z\_{0}=u} וכן {\displaystyle z\_{1}=v}. שלוש הנותרות {\displaystyle z\_{2},z\_{3}} ו-{\displaystyle z\_{4}} הן בעלי מחזוריות באורך 62 סיביות ואותן מחשבים על ידי XOR של הסדרה המחזורית {\displaystyle t=t\_{0}t\_{1}t\_{2},...} במחזוריות 2 (שהיא המחרוזת "01010101...") עם הסדרות {\displaystyle u,v} ו-{\displaystyle w} בהתאמה. המטריצות להכנת {\displaystyle u,v} ו-{\displaystyle w} הן שלוש מטריצות קבועות מסדר {\displaystyle 5\times 5} מעל {\displaystyle GF(2)}:

{\displaystyle U={\begin{bmatrix}0&1&0&0&0\\0&0&1&0&0\\1&0&0&1&0\\0&0&0&0&1\\1&0&0&0&1\end{bmatrix}},V={\begin{bmatrix}0&1&1&0&0\\0&0&1&0&0\\1&0&0&1&0\\0&0&0&0&1\\1&0&0&0&0\end{bmatrix}},W={\begin{bmatrix}0&1&0&0&0\\0&0&1&0&0\\1&0&0&1&0\\0&0&0&0&1\\1&0&0&0&0\end{bmatrix}}}
הסיבית ה-{\displaystyle i} בכל רצף מחושבת על ידי אתחול אוגר זיזה ממושב באורך חמש סיביות בערכים 00001, ואז מפעילים את האוגר {\displaystyle i} פעמים עם המטריצה המתאימה, וחילוץ הסיבית המשמעותית ביותר. למשל {\displaystyle u\_{i}=(0,0,0,0,1)U^{i}(0,0,0,0,1)^{t}}.

יהי {\displaystyle c=2^{n}-4} שהוא מחרוזת של {\displaystyle n-2} אחדים המסתיימת בשני אפסים ("{\displaystyle 111...11100}"). אז עם מילות המפתח הסודי של המשתמש {\displaystyle k\_{m-1},k\_{m-2},...k\_{1},k\_{0}} ומחרוזת הקבועים {\displaystyle z\_{j}}, מחשבים תת-מפתחות נוספים עבור כל הסבבים של הצופן:

{\displaystyle k\_{i+m}={\begin{cases}c\oplus (z\_{j})\_{i}\oplus k\_{i}\oplus (I\oplus S^{-1})S^{-3}k\_{i+1},&{\mbox{if }}m=2\\c\oplus (z\_{j})\_{i}\oplus k\_{i}\oplus (I\oplus S^{-1})S^{-3}k\_{i+2},&{\mbox{if }}m=3\\c\oplus (z\_{j})\_{i}\oplus k\_{i}\oplus (I\oplus S^{-1})(S^{-3}k\_{i+3}\oplus k\_{i+1}),&{\mbox{if }}m=4\end{cases}}}
עבור {\displaystyle 0\leq i<T-m}. שימו לב שהמילים {\displaystyle k\_{0}} עד {\displaystyle k\_{m-1}} משמשים ל-{\displaystyle m} הסבבים הראשונים של הצופן, הם נטענים כמו שהם לאוגר הזיזה כאשר {\displaystyle k\_{0}} מצד ימין ו-{\displaystyle k\_{m-1}} מצד שמאל (הצד העליון או הכי משמעותי של הערך). הטבלה הבאה כוללת את כל הקבועים תלויי הגרסה של Simon.

| אורך הבלוק {\displaystyle 2n} | אורך המפתח {\displaystyle mn} | גודל מילה {\displaystyle n} | מספר מילות המפתח {\displaystyle m} | הקבוע seq | מספר סבבים {\displaystyle T} |
| --- | --- | --- | --- | --- | --- |
| 32 | 64 | 16 | 4 | {\displaystyle z\_{0}} | 32 |
| 48 | 72 | 24 | 3 | {\displaystyle z\_{0}} | 36 |
|  |  | 96 | 4 | {\displaystyle z\_{1}} | 36 |
| 64 | 96 | 32 | 3 | {\displaystyle z\_{2}} | 42 |
|  |  | 128 | 4 | {\displaystyle z\_{3}} | 44 |
| 96 | 96 | 48 | 2 | {\displaystyle z\_{2}} | 52 |
|  |  | 144 | 3 | {\displaystyle z\_{3}} | 54 |
| 128 | 128 | 64 | 2 | {\displaystyle z\_{2}} | 68 |
|  |  | 192 | 3 | {\displaystyle z\_{3}} | 69 |
|  |  | 256 | 4 | {\displaystyle z\_{4}} | 72 |

### פסאודו-קוד

הקלט הוא בלוק הטקסט הגלוי כשהוא מחולק לשני חצאים {\displaystyle (x,y)} והמפתח הסודי באורך {\displaystyle m} מילים המסומנות ב-{\displaystyle k[0]} עד {\displaystyle k[m-1]}.

|  |
| --- |
| {\displaystyle n={\text{word size }}(16,24,32,48,{\text{ or }}64)},
{\displaystyle m={\text{ number of keys: }}{\begin{cases}4&{\text{ if }}n=16,\\3{\text{ or }}4&{\text{ if }}n=24{\text{ or }}32,\\2{\text{ or }}3&{\text{ if }}n=48\\2,3,{\text{ or }}4&{\text{ if }}n=64\end{cases}}}
{\displaystyle z={\begin{matrix}[11111010001001010110000111001101111101000100101011000011100110,\\10001110111110010011000010110101000111011111001001100001011010,\\10101111011100000011010010011000101000010001111110010110110011,\\11011011101011000110010111100000010010001010011100110100001111,\\11010001111001101011011000100000010111000011001010010011101111]\end{matrix}}}
{\displaystyle (T,j)={\begin{cases}(32,0),&{\text{ if }}n=16\\(36,0){\text{ or }}(36,1)&{\text{ if }}n=24,m=3{\text{ or }}4\\(42,2){\text{ or }}(44,3)&{\text{ if }}n=32,m=3{\text{ or }}4\\(52,2){\text{ or }}(54,3)&{\text{ if }}n=48,m=2{\text{ or }}3\\(68,2),(69,3),{\text{ or }}(72,4)&{\text{ if }}n=64,m=2,3,{\text{ or }}4\end{cases}}}
{\displaystyle {\text{for }}i=m{\text{ to }}T-1{\text{ do:}}}
{\displaystyle \ \ \ \ tmp=S^{-3}k[i-1],}
{\displaystyle \ \ \ \ {\text{if }}m=4{\text{ then }}tmp=tmp\oplus k[i-3]}
{\displaystyle \ \ \ \ tmp=tmp\oplus S^{-1}tmp}
{\displaystyle \ \ \ \ k[i]=\neg k[i-m]\oplus tmp\oplus z[j][(i-m){\text{ mod }}62]\oplus 3}
{\displaystyle {\text{for }}i=0{\text{ to }}T-1{\text{ do:}}}
{\displaystyle \ \ \ \ tmp=x}
{\displaystyle \ \ \ \ x=y\oplus (Sx\ \ \&\ \ \ S^{8}x)\oplus S^{2}x\oplus k[i]}
{\displaystyle \ \ \ \ y=tmp} |

הסמל {\displaystyle \oplus } מייצג פעולת XOR, הסימן {\displaystyle \neg } מייצג את אופרטור השלילה, הביטוי {\displaystyle S^{-3}k[i-1]} פירושו שהערך המצוי בכניסה {\displaystyle k[i-1]} מסובב בהזזה מעגלית לימין 3 סיביות. שימו לב שהלולאה הראשונה היא הכנת המפתח והלולאה השנייה היא ההצפנה.

Speck
-----

תיאור מבנה פייסטל של הפונקציה הפנימית בצופן Speck
לצופן Speck יש עשר גרסאות שכולן עוצבו כדי להשיג ביצועים אופטימליים במיוחד בתוכנה. בדומה לצופן הקודם את הגרסאות השונות נהוג לסמן ב-SPECK2n/mn, כמו למשל SPECK96/144 כשהכוונה היא לבלוק באורך 96 סיביות ומפתח באורך 144 סיביות. בצופן זה נוספה פעולה בסיסית של חיבור מלא מודולו {\displaystyle 2^{n}}. הצמצום המודולרי מתבצע באופן עקיף כי כשהתוצאה נחתכת בגבולות המילה הדבר דומה למודולו {\displaystyle 2^{n}} כך שאין צורך בחילוק. הפונקציה הפנימית היא:

{\displaystyle R\_{k}(x,y)=((S^{-\alpha }x+y)\oplus k,S^{\beta }y\oplus (S^{-\alpha }x+y)\oplus k)}.
כאשר {\displaystyle \alpha =7,\beta =2} אם {\displaystyle n=16} (בלוק באורך 32) אחרת {\displaystyle \alpha =8,\beta =3}. קיים דמיון קל בין פונקציית הסבב של Speck לפונקציית הסבב של צופן Threefish. הפונקציה ההופכית של פונקציית הסבב הנחוצה בפענוח משתמשת בחיסור מודולו {\displaystyle 2^{n}} במקום חיבור והיא נראית כך:

{\displaystyle R\_{k}^{-1}(x,y)=(S^{\alpha }((x\oplus k)-S^{-\beta }(x\oplus y)),S^{-\beta }(x\oplus y))}.
הטבלה הבאה מציגה את כל הפרמטרים של גרסאות צופן Spec בהתאמה:

| אורך הבלוק {\displaystyle 2n} | אורך המפתח {\displaystyle mn} | גודל מילה {\displaystyle n} | מספר מילות מפתח {\displaystyle m} | הזזה מעגלית {\displaystyle \alpha } | הזזה מעגלית {\displaystyle \beta } | מספר סבבים {\displaystyle T} |
| --- | --- | --- | --- | --- | --- | --- |
| 32 | 64 | 16 | 4 | 7 | 2 | 22 |
| 48 | 72 | 24 | 3 | 8 | 3 | 22 |
|  | 96 |  | 4 |  |  | 23 |
| 64 | 96 | 32 | 3 | 8 | 3 | 26 |
|  | 128 |  | 4 |  |  | 27 |
| 96 | 96 | 48 | 2 | 8 | 3 | 28 |
|  | 144 |  | 3 |  |  | 29 |
| 128 | 128 | 64 | 2 | 8 | 3 | 32 |
|  | 192 |  | 3 |  |  | 33 |
|  | 256 |  | 4 |  |  | 34 |

תהליך הרחבת המפתח מקבל את המפתח הסודי של המשתמש ומפיק ממנו {\displaystyle T} מפתחות {\displaystyle k\_{0},...k\_{T-1}} כאשר {\displaystyle T} הוא מספר הסבבים. ההצפנה היא הרכבה של הפונקציות {\displaystyle R\_{k\_{T-1}}\circ \cdots \circ R\_{k\_{1}},R\_{k\_{0}}} (מימין לשמאל). במילים אחרות זהו מבנה המתקבל משילוב שתי העתקות דמויות רשת פייסטל ביחס לשתי סוגי פעולות חיבור, האחת: {\displaystyle (x,y)\mapsto (y,(S^{-\alpha }x+y)\oplus k)} והשנייה {\displaystyle (x,y)\mapsto (y,S^{\beta }x\oplus y)}.

### הכנת מפתח

תהליך הכנת המפתח של Speck מנצל את פונקציית הסבב כדי להכין את המפתחות {\displaystyle k\_{i}}. אם {\displaystyle K} הוא המפתח אפשר לכתוב אותו בצורה {\displaystyle K=(\ell \_{m-2},...\ell \_{0},k\_{0})}, כאשר {\displaystyle \ell \_{i},k\_{0}\in {\text{GF}}(2)^{n}} עם ערך של {\displaystyle m\in \{2,3,4\}}. הסדרות {\displaystyle k\_{i}} ו-{\displaystyle \ell \_{i}} מוגדרות כך:

{\displaystyle \ell \_{i+m-1}=(k\_{i}+S^{-\alpha }\ell \_{i})\oplus i}, וכן
{\displaystyle k\_{i+1}=S^{\beta }k\_{i}\oplus \ell \_{i+m-1}}. המילה {\displaystyle k\_{i}} היא מפתח הסבב ה-{\displaystyle i} עבור {\displaystyle 0\leq i<T}.
### פסאודו-קוד

הקלט הוא בלוק הטקסט הגלוי כשהוא מחולק לשני חצאים {\displaystyle (x,y)} והמפתח הסודי באורך {\displaystyle m} מילים המסומנות ב-{\displaystyle \ell [m-2],\cdots ,\ell [0],k[0]}.

|  |
| --- |
| {\displaystyle n={\text{ word size }}(16,24,32,48,{\text{ or }}64),}
{\displaystyle m={\text{ number of key words: }}{\begin{cases}4&{\text{ if }}n=16\\3{\text{ or }}4&{\text{ if }}n=24{\text{ or }}32\\2{\text{ or }}3&{\text{ if }}n=48\\2{\text{ or }}3{\text{ or }}4&{\text{ if }}n=64\end{cases}}}
{\displaystyle T={\begin{cases}22&{\text{ if }}n=16\\22{\text{ or }}23&{\text{ if }}n=24,m=3{\text{ or }}4\\26{\text{ or }}27&{\text{ if }}n=32,m=3{\text{ or }}4\\28{\text{ or }}29&{\text{ if }}n=48,m=2{\text{ or }}3\\32,33,{\text{ or }}34&{\text{ if }}n=64,m=2,3,{\text{ or }}4\end{cases}}}
{\displaystyle (\alpha ,\beta )=(7,2){\text{ if }}n=16,{\text{ or }}(8,3){\text{ otherwise}}}
{\displaystyle {\text{for }}i=0{\text{ to }}T-2{\text{ do:}}}
{\displaystyle \ \ \ \ \ \ell [i+m-1]=(k[i]+S^{-\alpha }\ell [i])\oplus i}
{\displaystyle \ \ \ \ \ k[i+1]=S^{\beta }k[i]\oplus \ell [i+m-1]}
{\displaystyle {\text{for }}i=0{\text{ to }}T-1{\text{ do:}}}
{\displaystyle \ \ \ \ \ x=(S^{-\alpha }x+y)\oplus k[i]}
{\displaystyle \ \ \ \ \ y=S^{\beta }y\oplus x} |

ביטחון
------

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

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

סירוב ארגון התקינה הבינלאומי לתקנן את הצפנים
--------------------------------------------

נציגים ממדינות רבות, בהן ישראל, בלגיה, יפן וגרמניה בארגון התקינה הבינלאומי ISO התנגדו לניסיון של ה-NSA להוסיף את הצפנים שלהם לתקן הבינלאומי בקטגוריית צופן בלוקים קל משקל לחומרה זעירה. הם הביעו דאגה שה-NSA מקדם את הצפנים שלו תוך ידיעה של חולשות נסתרות שכנראה הוכנסו בהם במכוון. ל-NSA היסטוריה עשירה של ניסיונות להחדיר לשוק האזרחי טכנולוגיות הצפנה פרי פיתוחם שידוע לפחות על חלקם שהכילו דלתות סתר וחולשות, חלקם הוחדרו במכוון וחלקם היו ידועים להם ונשמרו בסוד. לטענתם, ה-NSA לא סיפקו קריפטואנליזה, הסברים ושיקולים תאורטיים שהנחו אותם בפיתוח הצפנים ובעיקר בקביעת מספר הסבבים עבור כל וריאציה של הצפנים וכן השיקולים שהנחו אותם לבחירת המטריצות U,V ו-W בתהליך הכנת המפתח. ב-NSA הביעו תרעומת על כך שארגון התקינה בחר שלא לקבל את הצפנים שלהם שלטענתם טובים מאוד, למרות שלא הייתה כל בעיה לקבל צפנים שפותחו על ידי הרוסים או הסינים. ד"ר תומר אשור המייצג את בלגיה בוועדת התקינה הגיב: "ארגון ה-NSA התנהג בבריונות וסירב לבקשות הוועדה לקבלת הסברים וכמעט שהצליח בכך", לדעתו "לארגוני מודיעין אין מקום בתקינה אזרחית". אור דונקלמן המייצג את ישראל בארגון התקינה אמר "קיימים אנשים רבים ב-NSA שחושבים שהעבודה שלהם היא להחליש את התקן, תפקידנו הוא לחזק אותו". הצפנים היחידים הנתמכים על ידי התקן נכון ל-2018 הם CLEFIA ו-PRESENT.

ברוס שנייר התבטא בבלוג שלו כי הוא אינו מאמין שהצפנים Simon ו-Speck מכילים חולשות נסתרות או דלתות סתר כלשהן. "זה מסקרן לדעת מדוע בכלל הצפנים האלו פורסמו ולמה דווקא בעיתוי זה" הוא אמר. "זה תמיד מרתק לנתח צפנים שפותחו על ידי ה-NSA, בעיקר משך את תשומת ליבי הדמיון של חלקים של Speck ל-Threefish (ששנייר הוא אחד ממפתחיו). התרשמתי ביותר מתהליך הכנת המפתח שלהם, זה תמיד מרתק לראות צופן של ה-NSA, זה כמו להתבונן בטכנולוגיה חייזרית...".

קוד לדוגמה
----------

להלן קוד ייחוס של האלגוריתם בגרסה החזקה ביותר שלו Speck128/256 בשפת C++‎ ללא אופטימיזציות.

```
typedef unsigned \_\_int64 uint64;

#define ROR(x, r) ((x >> r) | (x << (64 - r)))
#define ROL(x, r) ((x << r) | (x >> (64 - r)))
#define R(x, y, k) (x = ROR(x, 8), x += y, x ^= k, y = ROL(y, 3), y ^= x)

void speck\_encrypt(uint64 const pt[2], uint64 ct[2], uint64 const K[4])
{
 uint64 i, b = K[0], a[3];
 ct[0] = pt[0]; ct[1] = pt[1];

 for (i = 0; i < 3; i++){
 a[i] = K[i + 1];
 }

 R(ct[1], ct[0], b);
 for (i = 0; i < 33; i++) {
 R(a[i % 3], b, i);
 R(ct[1], ct[0], b);
 }
}

#define RR(x, y, k) (y ^= x, y = ROR(y, 3), x ^= k, x -= y, x = ROL(x, 8))

void speck\_decrypt(uint64 const ct[2], uint64 pt[2], uint64 const K[4])
{
 uint64 i, b = K[0], a[3];
 pt[0] = ct[0]; pt[1] = ct[1];

 for (i = 0; i < 3; i++){
 a[i] = K[i + 1];
 }

 for (i = 0; i < 33; i++){
 R(a[i % 3], b, i);
 }

 for (i = 0; i < 34; i++) {
 RR(pt[1], pt[0], b);
 RR(a[((32) - i) % 3], b, (32 - i));
 }
}

```

ראו גם
------

* צופן בלוקים
* AES
* Threefish

הערות שוליים
------------

1. ↑  The SIMON and SPECK families of lightweight block ciphers
2. ↑  Simon and Speck: Block Ciphers for the Internet of Things
3. ↑  Differential Analysis of Block Ciphers SIMON and SPECK
4. ↑  Linear Cryptanalysis of Reduced-Round Speck
5. ↑  Notes on the design and analysis of Simon and Speck
6. ↑  ISO rejects the NSA's IoT crypto standard, believing it to be backdoored
7. ↑  NSA: Our Crypto Is Good. ISO: No Thanks Though
8. ↑  SIMON and SPECK: New NSA Encryption Algorithms

| קריפטוגרפיה |
| --- |
| 

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

 |
| 

| הצפנה קלאסית |
| --- |
| מכונת הצפנה • צופן החלפה • צופן אתב"ש • צופן קיסר • צופן ויז'נר • צופן ורנם • צופן פלייפייר • צופן היל • אולטרה • אניגמה • ציקלומטר • קולוסוס • PURPLE • ג'ייד • מג'יק • צופן שחלוף |

 |
| 

| צופן בלוקים |
| --- |
| לוציפר • AES • 3DES • DES • Threefish • Twofish • Blowfish • FEAL • SEED • CAST • IDEA • RC2 • RC6 • MARS • RC5 • GOST • סרפנט • MISTY • KASUMI • קמליה • ARIA • SAFER • TEA • LEA • CLEFIA • SEA • Hummingbird • PRESENT • KATAN • KeeLoq • Simon & Speck • אנוביס |

 |
| 

| אופני הפעלה |
| --- |
| אופן הפעלה של צופן בלוקים • EAX • OCB • IAPM • CWC mode • GCM • CCM |

 |
| 

| צופן זרם |
| --- |
| RC4 • Salsa20 • SOSEMANUK • גריין • E0 • A5/1 • A5/2 • A5/3 • A5/4 • MICKEY • HC-128 • SNOW • Trivium • Rabbit • ZUC • ChaCha |

 |
| 

| הצפנה אסימטרית |
| --- |
| פרוטוקול דיפי-הלמן • חידות מרקל • חתימת למפורט • הצפנת תרמיל • RSA • הצפנת רבין • חתימה דיגיטלית רבין • צופן אל-גמאל • חתימה דיגיטלית אל-גמאל • DSA • הצפנת בלום-גולדווסר • ECC • הצפנת קריימר-שופ • הצפנת פאיי • הצפנת מקאליס • GGH • NTRU • עקום 25519 • חתימה דיגיטלית של שנור • הצפנת אוקמוטו-אושיאמה |

 |
| 

| פרוטוקולים |
| --- |
| עץ מרקל • פרוטוקול אתגר-מענה • פרוטוקול נידהאם-שרודר • פרוטוקול קרברוס • הוכחה באפס ידע • פרוטוקול פייגה-פיאט-שמיר • העברה עלומה • חלוקת סוד • TLS (SSL) • Secure Shell • MQV • X.509 • פרוטוקול שיתוף מפתח
• מיסור שלא לפרסום • פרוטוקול סיגנל |

 |
| 

| פרימיטיבים תאורטיים |
| --- |
| מחולל פסבדו-אקראי קריפטוגרפי • פונקציה חד-כיוונית • תמורה חד-כיוונית • סיבית קשה • פונקציה פסבדו-אקראית קריפטוגרפית • תמורה פסאודו-אקראית • פונקציית גיבוב קריפטוגרפית • וקטור אתחול • פונקציית ספוג • הצפנה מבוססת סריג |

 |
| 

| קריפטואנליזה |
| --- |
| ניתוח תדירויות • כוח גס • התקפת איזון זמן/זיכרון • תקיפת היפגשות באמצע • קריפטואנליזה ליניארית • קריפטואנליזה דיפרנציאלית • התקפת גלוי-ידוע • התקפת גלוי-נבחר • התקפת מוצפן-נבחר • פירוק לגורמים של מספר שלם • התקפת ערוץ צדדי • התקפת קורלציה • התקפת שיבוש • מודל אורקל אקראי • התקפת התנגשויות |

 |
| 

| בעיות מתמטיות ואלגוריתמים |
| --- |
| בעיית לוגריתם דיסקרטי • תחשיב אינדקסים • נפה ריבועית • אלגוריתם rho של פולרד • נפת שדה מספרים • אלגוריתם רו של פולרד ללוגריתמים • אלגוריתם פוליג-הלמן |

 |
| 

| פונקציות גיבוב קריפטוגרפיות |
| --- |
| SHA • MD5 • MD4 • SHA-1 • SHA-2 • SHA-3 • RIPEMD • Skein • BLAKE • Grøstl • SipHash |

 |
| 

| אימות וזיהוי |
| --- |
| אימות זהות • סיסמה • קוד אימות מסרים • Poly1305 • סיסמה חד-פעמית |

 |
| 

| נושאים נלווים |
| --- |
| מספר אקראי • מספר ראשוני • יתירות • מפתח שיחה • סטגנוגרפיה • הצפנה קוונטית • הצפנה פוסט-קוונטית • עקרון קרקהופס • אבטחת מידע • קריפטוגרפיה ויזואלית • אליס ובוב • מסיבת חתימה על מפתחות ציבוריים • שידור מוצפן • הצפנת דיסקים • הצפנת סף • חתימה דיגיטלית מבוססת פונקציית גיבוב • פונקציה זניחה • רשת פייסטל • רשת החלפה-תמורה • הלבנה • אימות מסרים • חתימה עיוורת • חישוב רב משתתפים בטוח |

 |