Simon & Speck

בקריפטוגרפיה, 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 עוצבו באופן שיוכלו להשתלב במגוון תצורות (ראו טבלה). צופן Simon הוא רשת פייסטל מאוזנת הפועלת על מילים באורך n {\displaystyle n} סיביות ולכן הבלוק באורך 2 n {\displaystyle 2n} סיביות. הצופן מקבל בלוק קריא באורך 2 n {\displaystyle 2n} סיביות ומחזיר בלוק מוצפן באורך 2 n {\displaystyle 2n} סיביות. למען הנוחות הוא מסומן בקיצור SIMON2n כאשר n ∈ { 16 , 24 , 32 , 48 , 64 } {\displaystyle n\in \{16,24,32,48,64\}} . אם m ∈ { 2 , 3 , 4 } {\displaystyle m\in \{2,3,4\}} אז צופן SIMON2n עם מפתח באורך m n {\displaystyle mn} מסומן בקיצור SIMON2n/mn. לדוגמה SIMON64/128 מתייחס לגרסה הפועלת על מילים באורך 32 סיביות, בלוק באורך 64 סיביות ומפתח באורך 128 סיביות. הצפנה ופענוח ב-SIMON2n עושה שימוש בשלוש פעולות בסיסיות בלבד בסגנון ARX הידוע בחוסנו וקיים בשימוש צפנים רבים ביניהם Salsa20 והם: XOR,‏ AND והזזה מעגלית S j {\displaystyle S^{j}} כאשר j {\displaystyle j} מציין את מספר הפוזיציות שיש להזיז (אם j {\displaystyle j} שלילי ההזזה היא לימין). עבור מפתח k ∈ GF ( 2 ) n {\displaystyle k\in {\text{GF}}(2)^{n}} (מחרוזת אקראית באורך n {\displaystyle n} סיביות) פונקציית הסבב תלויית המפתח מתבצעת בשני שלבים. מיפוי פייסטל R k : GF ( 2 ) n × GF ( 2 ) n → GF ( 2 ) n × GF ( 2 ) n {\displaystyle R_{k}:{\text{GF}}(2)^{n}\times {\text{GF}}(2)^{n}\rightarrow {\text{GF}}(2)^{n}\times {\text{GF}}(2)^{n}} המוגדר על ידי R k ( x , y ) = ( y ⊕ f ( x ) ⊕ k , x ) {\displaystyle R_{k}(x,y)=(y\oplus f(x)\oplus k,x)} והפונקציה f ( x ) = ( S 1 x     &     S 8 x ) ⊕ S 2 x {\displaystyle f(x)=(S^{1}x\ \ \&\ \ S^{8}x)\oplus S^{2}x} כאשר k {\displaystyle k} הוא מפתח הסבב. הביטוי S i x {\displaystyle S^{i}x} פירושו הזזה מעגלית של x {\displaystyle x} לשמאל i {\displaystyle i} סיביות והסימן & מייצג את האופרטור AND. הפונקציה ההופכית של פונקציית הסבב הנחוצה לצורך הפענוח היא R k − 1 ( x , y ) = ( y , x ⊕ f ( y ) ⊕ k ) {\displaystyle R_{k}^{-1}(x,y)=(y,x\oplus f(y)\oplus k)} . לעיתים קרובות משקולי יעילות מיישמים את הצפנים הללו בתצורה שבה יש צורך רק בפונקציית ההצפנה שהיא טובה גם להצפנה וגם לפענוח (ראו מצב מונה לדוגמה). תהליך הכנת המפתח מקבל את המפתח שסופק על ידי המשתמש ומייצר ממנו סדרה של T {\displaystyle T} מילים: k 0 , k 1 , . . . , k T − 1 {\displaystyle k_{0},k_{1},...,k_{T-1}} . כאשר T {\displaystyle T} הוא מספר הסבבים. ההצפנה היא בעצם הרכבה של הפונקציות R k T − 1 ∘ ⋯ ∘ R k 1 ∘ R k 0 {\displaystyle R_{k_{T-1}}\circ \cdots \circ R_{k_{1}}\circ R_{k_{0}}} (מימין לשמאל). כדי לחסוך במעגלים צופן Simon אינו כולל שלב הלבנה כלל וכן בניגוד ל-AES כל הסבבים זהים לחלוטין למעט המפתח. צופן Simon סימטרי לחלוטין ביחס לפעולת ההזזה המעגלית. בגלל מבנה פייסטל הסבב הראשון והסבב האחרון אינם מבצעים פעולה קריפטוגרפית כלשהי מלבד טעינת המפתח המתאים, כי הם למעשה מבטלים זה את זה (במבנה פייסטל מחצית מבלוק הקלט מוצפנת עם המחצית השנייה כאשר השנייה נותרת ללא שינוי, ראו תרשים). תהליך הכנת המפתח של Simon כולל שימוש בסדרה של קבועי סבב באורך סיבית אחת. תוספת זו הוכנסה כדי להרוס את הסימטריות של ההזזה המעגלית וכן כדי לסכל התקפת גלישה. למעשה וריאציות של Simon מופרדות באופן קריפטוגרפי על ידי חמש סדרות שונות של קבועים: z 0 , z 1 , z 2 , z 3 , z 4 {\displaystyle z_{0},z_{1},z_{2},z_{3},z_{4}} . כל אחת מהן היא פונקציה של אחת משלוש הסדרות המחזוריות הקבועות u , v , w {\displaystyle u,v,w} עם מחזוריות באורך 31 סיביות שאותן מחשבים לפי מטריצות קבועות המובאות להלן. את חמש הסדרות של הקבועים מחשבים כדלהלן: שתי הראשונות הן למעשה z 0 = u {\displaystyle z_{0}=u} וכן z 1 = v {\displaystyle z_{1}=v} . שלוש הנותרות z 2 , z 3 {\displaystyle z_{2},z_{3}} ו- z 4 {\displaystyle z_{4}} הן בעלי מחזוריות באורך 62 סיביות ואותן מחשבים על ידי XOR של הסדרה המחזורית t = t 0 t 1 t 2 , . . . {\displaystyle t=t_{0}t_{1}t_{2},...} במחזוריות 2 (שהיא המחרוזת "01010101...") עם הסדרות u , v {\displaystyle u,v} ו- w {\displaystyle w} בהתאמה. המטריצות להכנת u , v {\displaystyle u,v} ו- w {\displaystyle w} הן שלוש מטריצות קבועות מסדר 5 × 5 {\displaystyle 5\times 5} מעל G F ( 2 ) {\displaystyle GF(2)} : U = [ 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 ] , V = [ 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 ] , W = [ 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 ] {\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}}} הסיבית ה- i {\displaystyle i} בכל רצף מחושבת על ידי אתחול אוגר זיזה ממושב באורך חמש סיביות בערכים 00001, ואז מפעילים את האוגר i {\displaystyle i} פעמים עם המטריצה המתאימה, וחילוץ הסיבית המשמעותית ביותר. למשל u i = ( 0 , 0 , 0 , 0 , 1 ) U i ( 0 , 0 , 0 , 0 , 1 ) t {\displaystyle u_{i}=(0,0,0,0,1)U^{i}(0,0,0,0,1)^{t}} . יהי c = 2 n − 4 {\displaystyle c=2^{n}-4} שהוא מחרוזת של n − 2 {\displaystyle n-2} אחדים המסתיימת בשני אפסים (" 111...11100 {\displaystyle 111...11100} "). אז עם מילות המפתח הסודי של המשתמש k m − 1 , k m − 2 , . . . , k 1 , k 0 {\displaystyle k_{m-1},k_{m-2},...,k_{1},k_{0}} ומחרוזת הקבועים z j {\displaystyle z_{j}} , מחשבים תת-מפתחות נוספים עבור כל הסבבים של הצופן: k i + m = { c ⊕ ( z j ) i ⊕ k i ⊕ ( I ⊕ S − 1 ) S − 3 k i + 1 , if  m = 2 c ⊕ ( z j ) i ⊕ k i ⊕ ( I ⊕ S − 1 ) S − 3 k i + 2 , if  m = 3 c ⊕ ( z j ) i ⊕ k i ⊕ ( I ⊕ S − 1 ) ( S − 3 k i + 3 ⊕ k i + 1 ) , if  m = 4 {\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}}} עבור 0 ≤ i < T − m {\displaystyle 0\leq i<T-m} . שימו לב שהמילים k 0 {\displaystyle k_{0}} עד k m − 1 {\displaystyle k_{m-1}} משמשים ל- m {\displaystyle m} הסבבים הראשונים של הצופן, הם נטענים כמו שהם לאוגר הזיזה כאשר k 0 {\displaystyle k_{0}} מצד ימין ו- k m − 1 {\displaystyle k_{m-1}} מצד שמאל (הצד העליון או הכי משמעותי של הערך). הטבלה הבאה כוללת את כל הקבועים תלויי הגרסה של Simon. הקלט הוא בלוק הטקסט הגלוי כשהוא מחולק לשני חצאים ( x , y ) {\displaystyle (x,y)} והמפתח הסודי באורך m {\displaystyle m} מילים המסומנות ב- k [ 0 ] {\displaystyle k[0]} עד k [ m − 1 ] {\displaystyle k[m-1]} . הסמל ⊕ {\displaystyle \oplus } מייצג פעולת XOR, הסימן ¬ {\displaystyle \neg } מייצג את אופרטור השלילה, הביטוי S − 3 k [ i − 1 ] {\displaystyle S^{-3}k[i-1]} פירושו שהערך המצוי בכניסה k [ i − 1 ] {\displaystyle k[i-1]} מסובב בהזזה מעגלית לימין 3 סיביות. שימו לב שהלולאה הראשונה היא הכנת המפתח והלולאה השנייה היא ההצפנה. לצופן Speck יש עשר גרסאות שכולן עוצבו כדי להשיג ביצועים אופטימליים במיוחד בתוכנה. בדומה לצופן הקודם את הגרסאות השונות נהוג לסמן ב-SPECK2n/mn, כמו למשל SPECK96/144 כשהכוונה היא לבלוק באורך 96 סיביות ומפתח באורך 144 סיביות. בצופן זה נוספה פעולה בסיסית של חיבור מלא מודולו 2 n {\displaystyle 2^{n}} . הצמצום המודולרי מתבצע באופן עקיף כי כשהתוצאה נחתכת בגבולות המילה הדבר דומה למודולו 2 n {\displaystyle 2^{n}} כך שאין צורך בחילוק. הפונקציה הפנימית היא: R k ( x , y ) = ( ( S − α x + y ) ⊕ k , S β y ⊕ ( S − α x + y ) ⊕ k ) {\displaystyle R_{k}(x,y)=((S^{-\alpha }x+y)\oplus k,S^{\beta }y\oplus (S^{-\alpha }x+y)\oplus k)} . כאשר α = 7 , β = 2 {\displaystyle \alpha =7,\beta =2} אם n = 16 {\displaystyle n=16} (בלוק באורך 32) אחרת α = 8 , β = 3 {\displaystyle \alpha =8,\beta =3} . קיים דמיון קל בין פונקציית הסבב של Speck לפונקציית הסבב של צופן Threefish. הפונקציה ההופכית של פונקציית הסבב הנחוצה בפענוח משתמשת בחיסור מודולו 2 n {\displaystyle 2^{n}} במקום חיבור והיא נראית כך: R k − 1 ( x , y ) = ( S α ( ( x ⊕ k ) − S − β ( x ⊕ y ) ) , S − β ( x ⊕ y ) ) {\displaystyle R_{k}^{-1}(x,y)=(S^{\alpha }((x\oplus k)-S^{-\beta }(x\oplus y)),S^{-\beta }(x\oplus y))} . הטבלה הבאה מציגה את כל הפרמטרים של גרסאות צופן Spec בהתאמה: תהליך הרחבת המפתח מקבל את המפתח הסודי של המשתמש ומפיק ממנו T {\displaystyle T} מפתחות k 0 , . . . , k T − 1 {\displaystyle k_{0},...,k_{T-1}} כאשר T {\displaystyle T} הוא מספר הסבבים. ההצפנה היא הרכבה של הפונקציות R k T − 1 ∘ ⋯ ∘ R k 1 , R k 0 {\displaystyle R_{k_{T-1}}\circ \cdots \circ R_{k_{1}},R_{k_{0}}} (מימין לשמאל). במילים אחרות זהו מבנה המתקבל משילוב שתי העתקות דמויות רשת פייסטל ביחס לשתי סוגי פעולות חיבור, האחת: ( x , y ) ↦ ( y , ( S − α x + y ) ⊕ k ) {\displaystyle (x,y)\mapsto (y,(S^{-\alpha }x+y)\oplus k)} והשנייה ( x , y ) ↦ ( y , S β x ⊕ y ) {\displaystyle (x,y)\mapsto (y,S^{\beta }x\oplus y)} . תהליך הכנת המפתח של Speck מנצל את פונקציית הסבב כדי להכין את המפתחות k i {\displaystyle k_{i}} . אם K {\displaystyle K} הוא המפתח אפשר לכתוב אותו בצורה K = ( ℓ m − 2 , . . . , ℓ 0 , k 0 ) {\displaystyle K=(\ell _{m-2},...,\ell _{0},k_{0})} , כאשר ℓ i , k 0 ∈ GF ( 2 ) n {\displaystyle \ell _{i},k_{0}\in {\text{GF}}(2)^{n}} עם ערך של m ∈ { 2 , 3 , 4 } {\displaystyle m\in \{2,3,4\}} . הסדרות k i {\displaystyle k_{i}} ו- ℓ i {\displaystyle \ell _{i}} מוגדרות כך: ℓ i + m − 1 = ( k i + S − α ℓ i ) ⊕ i {\displaystyle \ell _{i+m-1}=(k_{i}+S^{-\alpha }\ell _{i})\oplus i} , וכן k i + 1 = S β k i ⊕ ℓ i + m − 1 {\displaystyle k_{i+1}=S^{\beta }k_{i}\oplus \ell _{i+m-1}} . המילה k i {\displaystyle k_{i}} היא מפתח הסבב ה- i {\displaystyle i} עבור 0 ≤ i < T {\displaystyle 0\leq i<T} . הקלט הוא בלוק הטקסט הגלוי כשהוא מחולק לשני חצאים ( x , y ) {\displaystyle (x,y)} והמפתח הסודי באורך m {\displaystyle m} מילים המסומנות ב- ℓ [ m − 2 ] , ⋯ , ℓ [ 0 ] , k [ 0 ] {\displaystyle \ell [m-2],\cdots ,\ell [0],k[0]} . היות שהצפנים 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 The SIMON and SPECK families of lightweight block ciphers Simon and Speck: Block Ciphers for the Internet of Things Differential Analysis of Block Ciphers SIMON and SPECK Linear Cryptanalysis of Reduced-Round Speck Notes on the design and analysis of Simon and Speck ISO rejects the NSA's IoT crypto standard, believing it to be backdoored NSA: Our Crypto Is Good. ISO: No Thanks Though SIMON and SPECK: New NSA Encryption Algorithms