Simon & Speck

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

Simon

צופן Simon הוא רשת פייסטל מאוזנת הפועלת על מילים באורך  סיביות ולכן הבלוק באורך  סיביות. הצופן מקבל בלוק קריא באורך  סיביות ומחזיר בלוק מוצפן באורך  סיביות. למען הנוחות הוא מסומן בקיצור SIMON2n כאשר . אם  אז צופן SIMON2n עם מפתח באורך  מסומן בקיצור SIMON2n/mn. לדוגמה SIMON64/128 מתייחס לגרסה הפועלת על מילים באורך 32 סיביות, בלוק באורך 64 סיביות ומפתח באורך 128 סיביות. הצפנה ופענוח ב-SIMON2n עושה שימוש בשלוש פעולות בסיסיות בלבד בסגנון ARX הידוע בחוסנו וקיים בשימוש צפנים רבים ביניהם Salsa20 והם: XOR, AND והזזה מעגלית  כאשר  מציין את מספר הפוזיציות שיש להזיז (אם  שלילי ההזזה היא לימין).

ביטחון

היות שהצפנים 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));
}}