סיכום ארבעת הצעדים הראשונים של צופן SOSEMANUK בהינתן המצב ההתחלתי המתואר:
תיבות החלפה.
תיבות ההחלפה של SOSEMANUK הן שמונה תיבות ההחלפה של סרפנט, formula_90 סיביות כל אחת, המוגדרות כתמורה מעל formula_91:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
S0 : 03, 08, 15, 01, 10, 06, 05, 11, 14, 13, 04, 02, 07, 00, 09, 12
S1 : 15, 12, 02, 07, 09, 00, 05, 10, 01, 11, 14, 08, 06, 13, 03, 04
S2 : 08, 06, 07, 09, 03, 12, 10, 15, 13, 01, 14, 04, 00, 11, 05, 02
S3 : 00, 15, 11, 08, 12, 09, 06, 03, 13, 01, 02, 04, 10, 07, 05, 14
S4 : 01, 15, 08, 03, 12, 00, 11, 06, 02, 05, 04, 10, 09, 14, 07, 13
S5 : 15, 05, 02, 11, 04, 10, 09, 12, 00, 03, 14, 08, 13, 06, 07, 01
S6 : 07, 02, 12, 05, 08, 04, 06, 11, 14, 09, 01, 15, 13, 03, 10, 00
S7 : 01, 13, 15, 00, 14, 08, 02, 11, 07, 04, 12, 10, 09, 03, 05, 06
לצורך האצת ביצועים, מעדיפים בפועל החלפה בשיטת Bitslice כמו בסרפנט. בשיטה זו החלפה של ארבע מילים מתבצעת במקביל על ידי צירוף פעולות בסיסיות כמו XOR ו-AND.
פונקציה ליניארית.
הפונקציה הליניארית פועלת על ארבע מילים באורך 32 סיביות כל אחת המסומנות formula_92 כאשר formula_93 היא המילה הפחות משמעותית (LSW) והיא מוגדרת כך:
ביטחון ויעילות.
לפי תקן eSTREAM הצופן הוכרז בטוח לשימוש נכון לשנת 2008. SOSEMANUK נבדק היטב על ידי קריפטוגרפים רבים, לא ידוע על התקפות יעילות כנגד הצופן ולהערכת המפתחים ביטחונו הוא formula_101. ב-2006 פותחה התקפה שנקראת Guess-and-determine כנגד הצופן שבה אפשר לשחזר את מצבו הפנימי המלא של הצופן לאחר האתחול, בסך הכול 384 סיביות בסיבוכיות זמן של formula_102. צריך לזכור שגם ניחוש מצבו הפנימי של הצופן אינו חושף את מפתח ההצפנה כיוון שלשם כך צריך לפרוץ גם את Serpent24 שמהווה חלק מהכנת המפתח. ב-ASIACRYPT-2008 הוצגה התקפה כנגד SOSEMANUK שבעזרתה אפשר לשבור את הצופן על ידי שחזור המצב הפנימי בזמן של formula_103 ולאחר מכן הוצג שיפור של אותה התקפה בפקטור של formula_104. התקפה חדשה שפורסמה ב-2010 שהיא סוג של Guess-and-determine דהיינו ניחוש המצב הפנימי של הצופן מגיעה לזמן של formula_105.
צופן SOSEMANUK מהיר יותר מצופן SNOW ומסרפנט במיוחד בתוכנה. הצופן יכול להגיע לתפוקה של 4.7 מחזורי שעון לבית בישום ממוטב.
קוד לדוגמה.
להלן קוד ב-C++ של צופן SOSEMANUK לפי המלצת התקן. הקוד עושה שימוש בתיבות החלפה ממוטבות חלקית לפי שיטת Bitslice.
typedef struct
unsigned int r[2];
unsigned int s[10];
unsigned char t;
} sosemanuk_state;
typedef struct
unsigned int k[100];
} sosemanuk_master_state;
//Partially optimized Serpent S Box in Bitslice mode
t1 = a ^ d; t2 = a &amp; d; t3 = c ^ t1; t4 = b ^ t3; \
h = t2 ^ t4; t6 = b &amp; t1; t7 = a ^ t6; t8 = c | t7; \
g = t4 ^ t8; t10 = ~t3; t11 = t3 ^ t7; t12 = h &amp; t11; \
f = t10 ^ t12; t14 = ~t7; e = t12 ^ t14
t1 = ~a; t2 = b ^ t1; t3 = a | t2; t4 = d | t2; \
t5 = c ^ t3; g = d ^ t5; t7 = b ^ t4; t8 = t2 ^ g; \
t9 = t5 &amp; t7; h = t8 ^ t9; t11 = t5 ^ t7; f = h ^ t11; \
t13 = t8 &amp; t11; e = t5 ^ t13
t1 = ~a; t2 = b ^ d; t3 = c &amp; t1; e = t2 ^ t3; \
t5 = c ^ t1; t6 = c ^ e; t7 = b &amp; t6; h = t5 ^ t7; \
t9 = d | t7; t10 = e | t5; t11 = t9 &amp; t10; g = a ^ t11; \
t13 = d | t1; t14 = t2 ^ h; t15 = g ^ t13; f = t14 ^ t15
t1 = a ^ b; t2 = a &amp; c; t3 = a | d; t4 = c ^ d; \
t5 = t1 &amp; t3; t6 = t2 | t5; g = t4 ^ t6; t8 = b ^ t3; \
t9 = t6 ^ t8; t10 = t4 &amp; t9; e = t1 ^ t10; t12 = g &amp; e; \
f = t9 ^ t12; t14 = b | d; t15 = t4 ^ t12; h = t14 ^ t15
t1 = a ^ d; t2 = d &amp; t1; t3 = c ^ t2; t4 = b | t3; \
h = t1 ^ t4; t6 = ~b; t7 = t1 | t6; e = t3 ^ t7; \
t9 = a &amp; e; t10 = t1 ^ t6; t11 = t4 &amp; t10; g = t9 ^ t11; \
t13 = a ^ t3; t14 = t10 &amp; g; f = t13 ^ t14
t1 = ~a; t2 = a ^ b; t3 = a ^ d; t4 = c ^ t1; \
t5 = t2 | t3; e = t4 ^ t5; t7 = d &amp; e; t8 = t2 ^ e; \
f = t7 ^ t8; t10 = t1 | e; t11 = t2 | t7; t12 = t3 ^ t10; \
g = t11 ^ t12; t14 = b ^ t7; t15 = f &amp; t12; h = t14 ^ t15
t1 = ~a; t2 = a ^ d; t3 = b ^ t2; t4 = t1 | t2; \
t5 = c ^ t4; f = b ^ t5; t7 = t2 | f; t8 = d ^ t7; \
t9 = t5 &amp; t8; g = t3 ^ t9; t11 = t5 ^ t8; e = g ^ t11; \
t13 = ~t5; t14 = t3 &amp; t11; h = t13 ^ t14
t1 = b ^ c; t2 = c &amp; t1; t3 = d ^ t2; t4 = a ^ t3; \
t5 = d | t1; t6 = t4 &amp; t5; f = b ^ t6; t8 = t3 | f; \
t9 = a &amp; t4; h = t1 ^ t9; t11 = t4 ^ t8; t12 = h &amp; t11; \
g = t3 ^ t12; t14 = ~t11; t15 = h &amp; g; e = t14 ^ t15
// Multiplication by alpha: alpha * x = T32(x « 8) ^ mul_a[x » 24]
static unsigned int mul_a[] = {
0x00000000, 0xE19FCF13, 0x6B973726, 0x8A08F835, 0xD6876E4C, 0x3718A15F, 0xBD10596A, 0x5C8F9679,
0x05A7DC98, 0xE438138B, 0x6E30EBBE, 0x8FAF24AD, 0xD320B2D4, 0x32BF7DC7, 0xB8B785F2, 0x59284AE1,
0x0AE71199, 0xEB78DE8A, 0x617026BF, 0x80EFE9AC, 0xDC607FD5, 0x3DFFB0C6, 0xB7F748F3, 0x566887E0,
0x0F40CD01, 0xEEDF0212, 0x64D7FA27, 0x85483534, 0xD9C7A34D, 0x38586C5E, 0xB250946B, 0x53CF5B78,
0x1467229B, 0xF5F8ED88, 0x7FF015BD, 0x9E6FDAAE, 0xC2E04CD7, 0x237F83C4, 0xA9777BF1, 0x48E8B4E2,
0x11C0FE03, 0xF05F3110, 0x7A57C925, 0x9BC80636, 0xC747904F, 0x26D85F5C, 0xACD0A769, 0x4D4F687A,
0x1E803302, 0xFF1FFC11, 0x75170424, 0x9488CB37, 0xC8075D4E, 0x2998925D, 0xA3906A68, 0x420FA57B,
0x1B27EF9A, 0xFAB82089, 0x70B0D8BC, 0x912F17AF, 0xCDA081D6, 0x2C3F4EC5, 0xA637B6F0, 0x47A879E3,
0x28CE449F, 0xC9518B8C, 0x435973B9, 0xA2C6BCAA, 0xFE492AD3, 0x1FD6E5C0, 0x95DE1DF5, 0x7441D2E6,
0x2D699807, 0xCCF65714, 0x46FEAF21, 0xA7616032, 0xFBEEF64B, 0x1A713958, 0x9079C16D, 0x71E60E7E,
0x22295506, 0xC3B69A15, 0x49BE6220, 0xA821AD33, 0xF4AE3B4A, 0x1531F459, 0x9F390C6C, 0x7EA6C37F,
0x278E899E, 0xC611468D, 0x4C19BEB8, 0xAD8671AB, 0xF109E7D2, 0x109628C1, 0x9A9ED0F4, 0x7B011FE7,
0x3CA96604, 0xDD36A917, 0x573E5122, 0xB6A19E31, 0xEA2E0848, 0x0BB1C75B, 0x81B93F6E, 0x6026F07D,
0x390EBA9C, 0xD891758F, 0x52998DBA, 0xB30642A9, 0xEF89D4D0, 0x0E161BC3, 0x841EE3F6, 0x65812CE5,
0x364E779D, 0xD7D1B88E, 0x5DD940BB, 0xBC468FA8, 0xE0C919D1, 0x0156D6C2, 0x8B5E2EF7, 0x6AC1E1E4,
0x33E9AB05, 0xD2766416, 0x587E9C23, 0xB9E15330, 0xE56EC549, 0x04F10A5A, 0x8EF9F26F, 0x6F663D7C,
0x50358897, 0xB1AA4784, 0x3BA2BFB1, 0xDA3D70A2, 0x86B2E6DB, 0x672D29C8, 0xED25D1FD, 0x0CBA1EEE,
0x5592540F, 0xB40D9B1C, 0x3E056329, 0xDF9AAC3A, 0x83153A43, 0x628AF550, 0xE8820D65, 0x091DC276,
0x5AD2990E, 0xBB4D561D, 0x3145AE28, 0xD0DA613B, 0x8C55F742, 0x6DCA3851, 0xE7C2C064, 0x065D0F77,
0x5F754596, 0xBEEA8A85, 0x34E272B0, 0xD57DBDA3, 0x89F22BDA, 0x686DE4C9, 0xE2651CFC, 0x03FAD3EF,
0x4452AA0C, 0xA5CD651F, 0x2FC59D2A, 0xCE5A5239, 0x92D5C440, 0x734A0B53, 0xF942F366, 0x18DD3C75,
0x41F57694, 0xA06AB987, 0x2A6241B2, 0xCBFD8EA1, 0x977218D8, 0x76EDD7CB, 0xFCE52FFE, 0x1D7AE0ED,
0x4EB5BB95, 0xAF2A7486, 0x25228CB3, 0xC4BD43A0, 0x9832D5D9, 0x79AD1ACA, 0xF3A5E2FF, 0x123A2DEC,
0x4B12670D, 0xAA8DA81E, 0x2085502B, 0xC11A9F38, 0x9D950941, 0x7C0AC652, 0xF6023E67, 0x179DF174,
0x78FBCC08, 0x9964031B, 0x136CFB2E, 0xF2F3343D, 0xAE7CA244, 0x4FE36D57, 0xC5EB9562, 0x24745A71,
0x7D5C1090, 0x9CC3DF83, 0x16CB27B6, 0xF754E8A5, 0xABDB7EDC, 0x4A44B1CF, 0xC04C49FA, 0x21D386E9,
0x721CDD91, 0x93831282, 0x198BEAB7, 0xF81425A4, 0xA49BB3DD, 0x45047CCE, 0xCF0C84FB, 0x2E934BE8,
0x77BB0109, 0x9624CE1A, 0x1C2C362F, 0xFDB3F93C, 0xA13C6F45, 0x40A3A056, 0xCAAB5863, 0x2B349770,
0x6C9CEE93, 0x8D032180, 0x070BD9B5, 0xE69416A6, 0xBA1B80DF, 0x5B844FCC, 0xD18CB7F9, 0x301378EA,
0x693B320B, 0x88A4FD18, 0x02AC052D, 0xE333CA3E, 0xBFBC5C47, 0x5E239354, 0xD42B6B61, 0x35B4A472,
0x667BFF0A, 0x87E43019, 0x0DECC82C, 0xEC73073F, 0xB0FC9146, 0x51635E55, 0xDB6BA660, 0x3AF46973,
0x63DC2392, 0x8243EC81, 0x084B14B4, 0xE9D4DBA7, 0xB55B4DDE, 0x54C482CD, 0xDECC7AF8, 0x3F53B5EB
// Division by alpha: x / alpha = (x » 8) ^ div_a[x &amp; 0xFF]
static unsigned int div_a[] = {
0x00000000, 0x180F40CD, 0x301E8033, 0x2811C0FE, 0x603CA966, 0x7833E9AB, 0x50222955, 0x482D6998,
0xC078FBCC, 0xD877BB01, 0xF0667BFF, 0xE8693B32, 0xA04452AA, 0xB84B1267, 0x905AD299, 0x88559254,
0x29F05F31, 0x31FF1FFC, 0x19EEDF02, 0x01E19FCF, 0x49CCF657, 0x51C3B69A, 0x79D27664, 0x61DD36A9,
0xE988A4FD, 0xF187E430, 0xD99624CE, 0xC1996403, 0x89B40D9B, 0x91BB4D56, 0xB9AA8DA8, 0xA1A5CD65,
0x5249BE62, 0x4A46FEAF, 0x62573E51, 0x7A587E9C, 0x32751704, 0x2A7A57C9, 0x026B9737, 0x1A64D7FA,
0x923145AE, 0x8A3E0563, 0xA22FC59D, 0xBA208550, 0xF20DECC8, 0xEA02AC05, 0xC2136CFB, 0xDA1C2C36,