MARS

MARS הוא צופן בלוקים סימטרי שפותח ב-1998 בחברת IBM על ידי צוות מפתחים בראשות דון קופרשמידט שהיה מעורב בפיתוח DES כמועמד לתקן ההצפנה המתקדם. MARS הגיע למקום האחרון מבין חמשת המועמדים המובילים (אחרי RC6). הצופן קומפקטי, מתאים ליישום בתוכנה ובחומרה, מנצל את יכולות המעבד המודרני להשגת מהירות, יעילות וביטחון טובים יותר לעומת אלגוריתמים מדור קודם כמו DES או IDEA ונועד להצפנה מסיבית. MARS פועל על בלוקים בגודל 128 סיביות ומפתח הצפנה בטווח גדלים של 128 - 400 סיביות. כיתר המועמדים המובילים שעלו לגמר הוכרז במהלך התחרות שלא התגלו התקפות מעשיות שמסכנות את ביטחונו. IBM התירה את השימוש בו ומימוש שלו ברישיון חופשי במגבלות מסוימות, למרות היותו מוגן בפטנט וזכויות יוצרים. השיקולים שהנחו את IBM בפיתוח הצופן כדי לעמוד בדרישות התקן החדש הם: ניצול מלא של 'פעולות חזקות' הזמינות במעבדים המודרניים כגון כפל מהיר ב-32 סיביות או הזזה מעגלית לפי ערכים משתנים. מבנה ייחודי שהוא תוצר של ניסיון רב שנים. ייחודו נובע מפיצול סבבי הצפנה לשלושה מרכיבים עיקריים; עליון אמצעי ותחתון, השלב האמצעי נחשב לגרעין הקריפטוגרפי שמבצע את ההצפנה, בעוד שהאחרים משמשים כשכבת הגנה. השיטה אומצה מנאור-ריינגלוד ובעיקרה עיטוף של גרעין קריפטוגרפי באמצעות טרנספורמציה לא קריפטוגרפית כלשהי, כדי להקשות על קריפטואנליזה. לאפשר ניתוח יעיל של ביטחון מרכיבי האלגוריתם והימנעות מפעולות 'קשות לניתוח'. שימוש ברשת פייסטל מסוג 3. סוג של רשת החלפה-תמורה שבכל סבב מילת קלט אחת משפיעה על כל מילות הקלט האחרות (בניגוד לרשת המקורית שבה כל מילה משפיעה על מילה אחת אחרת). לשיטה זו יתרונות על פני קודמתה הן ביעילות והן בביטחון. סימטריה בין הצפנה לפענוח. כדי להתמודד עם התקפות המנצלות חוסר סימטריה בין חלק מסבבי ההצפנה (כגון צופנים שבהם הסבב האחרון שונה מהיתר כמו ריינדל), עובדה המאפשרת התקפה שבה 'מקלפים' את השכבה העליונה או התחתונה ומתמקדים בשכבה הפנימית העיקרית. חיבור, חיסור ו-XOR, בעיקר לערבוב ערכי קלט עם ערכי מפתח (פעולות אילו לא נועדו להשגת ביטחון). טבלת חיפוש (Table lookup) הנקראת גם תיבות החלפה (s-box), המספקות את הביטחון העיקרי של הצופן. MARS משתמש בטבלה בגודל 512 כניסות של מילים בגודל 32 סיביות. תיבות ההחלפה תוכננו להשגת אפקט מפולת מהיר ונבחרו בקפידה כדי לעמוד בפני התקפות דיפרנציאליות וליניאריות. חסרונן העיקרי שנדרשות שלוש פקודות מכונה לכל החלפה וכן צריכת זיכרון - מה שעשוי להיות קריטי במעבד קטן. הזזה מעגלית (Rotation) קבועה או דינאמית התלויה בקלט. בפעולה זו הסיביות הנפלטות מצד אחד מוחזרות לצד השני. שימוש מסיבי בהזזה מעגלית קיים באלגוריתמים מודרניים אחרים כמו RC6. חסרונן העיקרי הוא שלעיתים תוצאת ההזזה אינה מושפעת מכל סיביות האופרנדים, דבר המוביל לחולשה מסוימת. לדוגמה, אם מספר הפוזיציות להזזה מיוצג על ידי משתנה count בגודל 32 סיביות, הרי שלכל היותר נדרשות שש סיביות מתוכו כדי לייצג את ההזזה (הייצוג הבינארי של הזזה מקסימלית - 32 פוזיציות), ליתר הסיביות אין השפעה. הפתרון אפשרי הוא שילוב עם פעולת כפל. פעולת כפל שלמים מודולו 2 w {\displaystyle 2^{w}} כאשר w {\displaystyle w} מתייחס לגודל מילה בסיביות. כמו בצופן IDEA פעולות אילו מניבים פיזור גבוה ותכונות דיפרנציאליות טובות. בארכיטקטורת מעבדים מודרניים חל צמצום ניכר במספר מחזורי שעון לפעולת כפל. לכן השימוש בהן הופך אטרקטיבי. קלט ופלט הצופן הם ארבע מילים בגודל 32 סיביות D 0 , D 1 , D 2 , D 3 {\displaystyle D_{0},D_{1},D_{2},D_{3}} . המפתח מיוצג על ידי 40 מילים K 0 , . . . , K 39 {\displaystyle K_{0},...,K_{39}} . ו-512 תיבות ההחלפה כשהן מחולקות לשתיים דהיינו 256 הכניסות הראשונות נקראות S 0 {\displaystyle S_{0}} והאחרונות S 1 {\displaystyle S_{1}} . כל הפעולות הפנימיות מבוצעות ברמת מילים. את בתי הקלט ממירים למילים לפי סדר בתים קטן (הבית הראשון מכיל את הספרות הפחות משמעותיות של המילה). השלד העיקרי של האלגוריתם מורכב מהפעולות הבאות לפי סדר זה: חיבור מפתח. שמונה סבבים של ערבוב לפנים ללא מפתח. שמונה סבבים של ערבוב לפנים עם מפתח. שמונה סבבים של ערבוב לאחור עם מפתח. שמונה סבבים של ערבוב לאחור ללא מפתח. חיסור מפתח. אפשר לראות את הסימטריה הרבה של הצופן. הוספת חלק מהמפתח המורחב שנקראת 'הלבנה' (whitening) מסתיימת בפעולה ההפוכה של חיסור המפתח. שני המרכיבים הבאים נקראים 'ערבוב לפנים' (Forward mixing), מטרתם לספק ערבוב מהיר ואפקט מפולת להגנה מפני התקפת גלוי-נבחר, זאת באמצעות הוספת חלק מהמפתח המורחב, פעולות ערבוב והזזה נוספות בין מילות הקלט, שימוש בתיבות ההחלפה כאשר שני בתי קלט b 0 , b 2 {\displaystyle b_{0},b_{2}} משמשים אינדקס ל- S 0 {\displaystyle S_{0}} והבתים b 1 , b 3 {\displaystyle b_{1},b_{3}} ל- S 1 {\displaystyle S_{1}} , כל זה במבנה מסוג רשת פייסטל. שני המרכיבים האמצעיים נקראים 'גרעין קריפטוגרפי' ומורכבים משישה-עשר סבבים של רשת פייסטל מסוג 3, שכוללת פונקציית הרחבה E (ראה להלן) וקומבינציה של כפל בשלמים עם הזזה מעגלית, גם הם מחולקים לקדמי ואחורי לצורך הסימטריה. שני המרכיבים המסיימים נקראים 'ערבוב לאחור' בהם מתבצעות פעולות הפוכות לפעולות שבוצעו בשלבים הפותחים ובסדר הפוך (כלומר הקלט מוזן בסדר הפוך והאינדקסים לתיבות ההחלפה הפוכים) ולמעשה האפקט הוא ביטול השפעת הערבוב הקדמי על הטקסט המוצפן. הערבוב המסיים נועד להגנה מפני התקפת מוצפן-נבחר. כאמור מטרת פעולות אילו אינה קריפטוגרפית ולא נועדה להסתיר את המידע אלא למנוע מהמתקיף למקד את ההתקפה בגרעין האמצעי על ידי הוספת שכבת הגנה. פונקציית ההרחבה E מקבלת מילה אחת i n {\displaystyle in} ומחזירה שלוש מילים o u t 1 , o u t 2 , o u t 3 {\displaystyle out_{1},out_{2},out_{3}} באמצעות שתי מילים מהמפתח המורחב k 1 , k 2 {\displaystyle k_{1},k_{2}} . התהליך מתואר בתרשים ובפסאודו קוד להלן. הפונקציה מבצעת הזזות מעגליות קבועות ותלויות משתנים, החלפות בתיבות s-box, כפל שלמים מודולו 2 w {\displaystyle 2^{w}} ופעולות XOR. השילוב נעשה באופן שינוצלו היתרונות שבכל אחת מהן, למשל ידוע שבכפל שלמים לסיביות הנמוכות השפעה גדולה יותר על המכפלה מאשר העליונות לכן דואגים לכך שסיביות האינדקס לתיבות ההחלפה יהיו מהגבוהות. וכן הסיביות העליונות של המכפלה חזקות יותר במובן שהן מושפעות מכמעט כל סיביות הקלט. בבניית תיבות ההחלפה (s-box) הכניסות חושבו בסגנון פסאודו-רנדומלי ונבדקו שלהם תכונות דיפרנציאליות וליניאריות טובות כדלהלן; עבור i = 0 , . . . , 102 ,     j = 0 , . . . , 4 {\displaystyle i=0,...,102,\ \ j=0,...,4} הכניסה S 5 i + j {\displaystyle S_{5i+j}} מחושבת על ידי הפעלת פונקציית הגיבוב הקריפטוגרפית SHA-1 שמחזירה 4 מילים של 32 סיביות: S 5 i + j = SHA-1 ( 5 i | | c 1 | | c 2 | | c 3 ) j {\displaystyle S_{5i+j}={\mbox{SHA-1}}(5i||c_{1}||c_{2}||c_{3})_{j}} הסימן "||" מייצג שרשור והערך SHA-1 ( ⋅ ) j {\displaystyle {\mbox{SHA-1}}(\cdot )_{j}} הוא המילה ה- j {\displaystyle j} של פלט הפונקציה. הקבועים c 1 = B7E15162 , c 2 = 243F6A88 {\displaystyle c_{1}={\mbox{B7E15162}},c_{2}={\mbox{243F6A88}}} (בבסיס הקסדצימלי) חושבו מהקבועים המתמטיים פאי ו-e ועבור המשתנה c 3 {\displaystyle c_{3}} נבדקו ערכים רבים במטרה למצוא אחד כזה שיניב תוצאה אופטימלית מבחינה קריפטוגרפית. הבדיקות הן: (א) שלא נוצרו במקרה תיבות החלפה המכילות רק אפסים או רק אחדים. (ב) שכל זוג ערכים מקבילים מהתיבות S 0 , S 1 {\displaystyle S_{0},S_{1}} יהיו שונים לפחות בשלושה מתוך ארבעת הבתים. (ג) שהתיבות אינן מכילות שני ערכים S i , S j ,   ( i ≠ j ) {\displaystyle S_{i},S_{j},\ (i\neq j)} כך שמתקיים S i = S j , S i = ¬ S j {\displaystyle S_{i}=S_{j},S_{i}=\neg S_{j}} או S [ i ] = − S [ j ] {\displaystyle S[i]=-S[j]} . (ד) של- S {\displaystyle S} יהיו ( 512 2 ) {\displaystyle \textstyle {512 \choose 2}} הפרשי XOR שונים וכן 2 × ( 512 2 ) {\displaystyle 2\times \textstyle {512 \choose 2}} הפרשי חיסור שונים. (ה) שכל זוג כניסות יהיו שונות לפחות בארבע סיביות אחת מהשנייה. באופן דומה בודקים שלתיבות תכונות ליניאריות טובות; הטיית זוגיות נמוכה והטיית סיביות נמוכה וקורלציה נמוכה. התיבות נבדקו עם ערכים שונים של c 3 {\displaystyle c_{3}} בבדיקה נמשכה כשבוע ימים ונבדקו מעל 2 26 {\displaystyle 2^{26}} ערכים אפשריים עד שנמצא הערך האופטימלי c 3 = 02917D59 {\displaystyle c_{3}={\mbox{02917D59}}} . בפסאודו קוד להלן הסימנים " ⋘ {\displaystyle \lll } " ו-" ⋙ {\displaystyle \ggg } " פירושם הזזה מעגלית בסיביות (bitwise rotation) לימין או לשמאל לפי כיוון החצים והערך לצידם המציין את מספר הפוזיציות שיש להזיז, הסימן ⊕ {\displaystyle \oplus } הוא XOR. ארבעת הבתים של D 0 {\displaystyle D_{0}} משמשים אינדקסים לתיבות ההחלפה, למשל S 1 [ 2 n d  byte of  D 0 ] {\displaystyle S_{1}[2^{nd}{\mbox{ byte of }}D_{0}]} פירושו שהבית השני של D 0 {\displaystyle D_{0}} משמש אינדקס לתיבה המתאימה ב- S 1 {\displaystyle S_{1}} . Phase (I) השלב הפותח שנקרא ערבוב לפנים For  i = 0  to  3  do: {\displaystyle {\mbox{For }}i=0{\mbox{ to }}3{\mbox{ do:}}} D i = D i + K i {\displaystyle D_{i}=D_{i}+K_{i}} For  i = 0  to  7  do: {\displaystyle {\mbox{For }}i=0{\mbox{ to }}7{\mbox{ do:}}} D 1 = D 1 ⊕ S 0 [ 1 s t  byte of  D 0 ] + S 1 [ 2 n d  byte of  D 0 ] {\displaystyle D_{1}=D_{1}\oplus S_{0}[1^{st}{\mbox{ byte of }}D_{0}]+S_{1}[2^{nd}{\mbox{ byte of }}D_{0}]} D 2 = D 2 + S 0 [ 3 r d  byte of  D 0 ] {\displaystyle D_{2}=D_{2}+S_{0}[3^{rd}{\mbox{ byte of }}D_{0}]} D 3 = D 3 ⊕ S 1 [ 4 t h  byte of  D 0 ] {\displaystyle D_{3}=D_{3}\oplus S_{1}[4^{th}{\mbox{ byte of }}D_{0}]} D 0 = D 0 ⋙ 24 {\displaystyle D_{0}=D_{0}\ggg 24} If  i = 0  or  4  then:   D 0 = D 0 + D 3 {\displaystyle {\mbox{If }}i=0{\mbox{ or }}4{\mbox{ then:}}\ D_{0}=D_{0}+D_{3}} If  i = 1  or  5  then:   D 0 = D 0 + D 1 {\displaystyle {\mbox{If }}i=1{\mbox{ or }}5{\mbox{ then:}}\ D_{0}=D_{0}+D_{1}} ( D 3 , D 2 , D 1 , D 0 ) ← ( D 0 , D 3 , D 2 , D 1 ) {\displaystyle (D_{3},D_{2},D_{1},D_{0})\leftarrow (D_{0},D_{3},D_{2},D_{1})} הפעולה האחרונה מבצעת הזזה מעגלית של ארבעת המילים פוזיציה אחת ימינה והמילה הראשונה מועברת לסוף. השלב האמצעי כולל שימוש בפונקציית E כשהוא מחולק לשניים, שמונת הסבבים האחרונים שונים מהראשונים. קלט: i n , k 1 , k 2 {\displaystyle in,k_{1},k_{2}} בגודל 32 סיביות כל אחד. שימו לב שהביטוי S [ lowest 9 bits of  M ] {\displaystyle S[{\mbox{lowest 9 bits of }}M]} מתייחס לאינדקס בגודל 9 סיביות לטבלה המאוחדת מ- S 0 {\displaystyle S_{0}} ו- S 1 {\displaystyle S_{1}} M = i n + k 1 {\displaystyle M=in+k_{1}} R = ( i n ⋘ 13 ) × k 2 {\displaystyle R=(in\lll 13)\times k_{2}} L = S [ lowest 9 bits of  M ] {\displaystyle L=S[{\mbox{lowest 9 bits of }}M]} R = R ⋘ 5 {\displaystyle R=R\lll 5} M = M ⋘  lowest 5 bits of  R {\displaystyle M=M\lll {\mbox{ lowest 5 bits of }}R} L = L ⊕ R {\displaystyle L=L\oplus R} R = R ⋘ 5 {\displaystyle R=R\lll 5} L = L ⊕ R {\displaystyle L=L\oplus R} L = L ⋘  lowest 6 bits of  R {\displaystyle L=L\lll {\mbox{ lowest 6 bits of }}R} הפלט הוא ( L , M , R ) {\displaystyle (L,M,R)} . Phase (II) גרעין קריפטוגרפי For  i = 0  to  15  do: {\displaystyle {\mbox{For }}i=0{\mbox{ to }}15{\mbox{ do:}}} ( o u t 1 , o u t 2 , o u t 3 ) = E ( D 0 , K 2 i + 1 , K 2 i + 5 ) {\displaystyle (out_{1},out_{2},out_{3})=E(D_{0},K_{2i+1},K_{2i+5})} D 2 = D 2 + o u t 2 {\displaystyle D_{2}=D_{2}+out_{2}} If  i < 8  then: {\displaystyle {\mbox{If }}i<8{\mbox{ then:}}} D 1 = D 1 + o u t 1 ,   D 3 = D 3 ⊕ o u t 3 {\displaystyle D_{1}=D_{1}+out_{1},\ D_{3}=D_{3}\oplus out_{3}} Else: {\displaystyle {\mbox{Else:}}} D 3 = D 3 + o u t 1 ,   D 1 = D 1 ⊕ o u t 3 {\displaystyle D_{3}=D_{3}+out_{1},\ D_{1}=D_{1}\oplus out_{3}} ( D 3 , D 2 , D 1 , D 0 ) ← ( D 0 ⋘ 13 , D 3 , D 2 , D 1 ) {\displaystyle (D_{3},D_{2},D_{1},D_{0})\leftarrow (D_{0}\lll 13,D_{3},D_{2},D_{1})} Phase (III) השלב המסיים המשלים של השלב הפותח שנקרא ערבוב לאחור. For  i = 0  to  7  do: {\displaystyle {\mbox{For }}i=0{\mbox{ to }}7{\mbox{ do:}}} If  i = 2  or  6  then:   D 0 = D 0 − D 3 {\displaystyle {\mbox{If }}i=2{\mbox{ or }}6{\mbox{ then:}}\ D_{0}=D_{0}-D_{3}} If  i = 3  or  7  then:   D 0 = D 0 − D 1 {\displaystyle {\mbox{If }}i=3{\mbox{ or }}7{\mbox{ then:}}\ D_{0}=D_{0}-D_{1}} D 1 = D 1 ⊕ S 1 [ 1 s t  byte of  D 0 ] {\displaystyle D_{1}=D_{1}\oplus S_{1}[1^{st}{\mbox{ byte of }}D_{0}]} D 2 = D 2 − S 0 [ 4 t h  byte of  D 0 ] {\displaystyle D_{2}=D_{2}-S_{0}[4^{th}{\mbox{ byte of }}D_{0}]} D 3 = D 3 − S 1 [ 3 r d  byte of  D 0 ] ⊕ S 0 [ 2 n d  byte of  D 0 ] {\displaystyle D_{3}=D_{3}-S_{1}[3^{rd}{\mbox{ byte of }}D_{0}]\oplus S_{0}[2^{nd}{\mbox{ byte of }}D_{0}]} D 0 = D 0 ⋘ 24 {\displaystyle D_{0}=D_{0}\lll 24} ( D 3 , D 2 , D 1 , D 0 ) ← ( D 0 , D 3 , D 2 , D 1 ) {\displaystyle (D_{3},D_{2},D_{1},D_{0})\leftarrow (D_{0},D_{3},D_{2},D_{1})} For  i = 0  to  3  do: {\displaystyle {\mbox{For }}i=0{\mbox{ to }}3{\mbox{ do:}}} D i = D i − K 36 + i {\displaystyle D_{i}=D_{i}-K_{36+i}} פלט הצופן הוא ארבע המילים ( D 3 , D 2 , D 1 , D 0 ) {\displaystyle (D_{3},D_{2},D_{1},D_{0})} . Phase (I) For  i = 0  to  3  do: {\displaystyle {\mbox{For }}i=0{\mbox{ to }}3{\mbox{ do:}}} D i = D i + K 36 + i {\displaystyle D_{i}=D_{i}+K_{36+i}} For  i = 7  down to  0  do: {\displaystyle {\mbox{For }}i=7{\mbox{ down to }}0{\mbox{ do:}}} ( D 3 , D 2 , D 1 , D 0 ) ← ( D 2 , D 1 , D 0 , D 3 ) {\displaystyle (D_{3},D_{2},D_{1},D_{0})\leftarrow (D_{2},D_{1},D_{0},D_{3})} D 0 = D 0 ⋙ 24 {\displaystyle D_{0}=D_{0}\ggg 24} D 3 = D 3 ⊕ S 0 [ 2 n d  byte of  D 0 ] + S 1 [ 3 r d  byte of  D 0 ] {\displaystyle D_{3}=D_{3}\oplus S_{0}[2^{nd}{\mbox{ byte of }}D_{0}]+S_{1}[3^{rd}{\mbox{ byte of }}D_{0}]} D 2 = D 2 + S 0 [ 4 t h  byte of  D 0 ] {\displaystyle D_{2}=D_{2}+S_{0}[4^{th}{\mbox{ byte of }}D_{0}]} D 1 = D 1 ⊕ S 1 [ 1 s t  byte of  D 0 ] {\displaystyle D_{1}=D_{1}\oplus S_{1}[1^{st}{\mbox{ byte of }}D_{0}]} If  i = 2  or  6  then:   D 0 = D 0 + D 3 {\displaystyle {\mbox{If }}i=2{\mbox{ or }}6{\mbox{ then:}}\ D_{0}=D_{0}+D_{3}} If  i = 3  or  7  then:   D 0 = D 0 + D 1 {\displaystyle {\mbox{If }}i=3{\mbox{ or }}7{\mbox{ then:}}\ D_{0}=D_{0}+D_{1}} Phase (II) For  i = 15  down to 0 do: {\displaystyle {\mbox{For }}i=15{\mbox{ down to 0 do:}}} ( D 3 , D 2 , D 1 , D 0 ) ← ( D 2 , D 1 , D 0 , D 3 ) {\displaystyle (D_{3},D_{2},D_{1},D_{0})\leftarrow (D_{2},D_{1},D_{0},D_{3})} D 0 = D 0 ⋙ 13 {\displaystyle D_{0}=D_{0}\ggg 13} ( o u t 1 , o u t 2 , o u t 3 ) = E ( D 0 , K 2 i + 4 , K 2 i + 5 ) {\displaystyle (out_{1},out_{2},out_{3})=E(D_{0},K_{2i+4},K_{2i+5})} D 2 = D 2 − o u t 2 {\displaystyle D_{2}=D_{2}-out_{2}} If  i < 8  then: {\displaystyle {\mbox{If }}i<8{\mbox{ then:}}} D 1 = D 1 − o u t 1 ,   D 3 = D 3 ⊕ o u t 3 {\displaystyle D_{1}=D_{1}-out_{1},\ D_{3}=D_{3}\oplus out_{3}} Else: {\displaystyle {\mbox{Else:}}} D 3 = D 3 − o u t 1 ,   D 1 = D 1 ⊕ o u t 3 {\displaystyle D_{3}=D_{3}-out_{1},\ D_{1}=D_{1}\oplus out_{3}} Phase (III) For  i = 7  down to 0 do: {\displaystyle {\mbox{For }}i=7{\mbox{ down to 0 do:}}} ( D 3 , D 2 , D 1 , D 0 ) ← ( D 2 , D 1 , D 0 , D 3 ) {\displaystyle (D_{3},D_{2},D_{1},D_{0})\leftarrow (D_{2},D_{1},D_{0},D_{3})} If  i = 0  or 4 then:   D 0 = D 0 − D 3 {\displaystyle {\mbox{If }}i=0{\mbox{ or 4 then:}}\ D_{0}=D_{0}-D_{3}} If  i = 1  or 5 then:   D 0 = D 0 − D 1 {\displaystyle {\mbox{If }}i=1{\mbox{ or 5 then:}}\ D_{0}=D_{0}-D_{1}} D 0 = D 0 ⋘ 24 {\displaystyle D_{0}=D_{0}\lll 24} D 3 = D 3 ⊕ S 1 [ 4 t h  byte of  D 0 ] {\displaystyle D_{3}=D_{3}\oplus S_{1}[4^{th}{\mbox{ byte of }}D_{0}]} D 2 = D 2 − S 0 [ 3 r d  byte of  D 0 ] {\displaystyle D_{2}=D_{2}-S_{0}[3^{rd}{\mbox{ byte of }}D_{0}]} D 1 = D 1 − S 1 [ 2 n d  byte of  D 0 ] ⊕ S 0 [ 1 s t  byte of  D 0 ] {\displaystyle D_{1}=D_{1}-S_{1}[2^{nd}{\mbox{ byte of }}D_{0}]\oplus S_{0}[1^{st}{\mbox{ byte of }}D_{0}]} For  i = 0  to 3 do: {\displaystyle {\mbox{For }}i=0{\mbox{ to 3 do:}}} D i = D i − K i {\displaystyle D_{i}=D_{i}-K_{i}} הרחבת המפתח נעשית מתוך מפתח צופן k {\displaystyle k} בגודל n {\displaystyle n} מילים של 32 סיביות, טווח ערכים אפשריים הוא 4 ≤ n ≤ 14 {\displaystyle 4\leq n\leq 14} . אותו מרחיבים למפתח K {\displaystyle K} עם 40 מילים. ההרחבה מתבצעת כדלהלן: נתון מערך עזר T {\displaystyle T} שבכניסותיו הראשונות מציבים את מפתח הצופן, מוסיפים את ערכו של n {\displaystyle n} ומרפדים את היתר באפסים. לאחר מכן מבצעים ארבעה סבבים של פעולות הכוללות טרנספורמציה ליניארית וערבוב באמצעות רשת פייסטל מסוג 1. בכל סבב מחלצים עשרה ערכים וכדי להימנע ממפתחות חלשים, עוברים על כל הערכים שהתקבלו וקובעים את שתי הסיביות הפחות חשובות בכל 'מילת-מפתח' המשמשת לכפל ל-"11" וכן מוודים שלא יהיו עשרה אפסים או עשרה אחדים עוקבים באף אחת מהן, להלן פסאודו קוד: B = { A4A8D57B ,    5B5BD193B ,    C8A8309B ,    73F9A978 } {\displaystyle B=\{{\mbox{A4A8D57B}},\ {\mbox{ 5B5BD193B}},\ {\mbox{ C8A8309B}},\ {\mbox{ 73F9A978}}\}} T [ 0 , . . . , n − 1 ] = k [ 0 , . . . , n − 1 ] , T [ n ] = n , T [ n + 1 , . . . , 14 ] = 0 {\displaystyle T[0,...,n-1]=k[0,...,n-1],T[n]=n,T[n+1,...,14]=0} For  j = 0  to 3 do: {\displaystyle {\mbox{For }}j=0{\mbox{ to 3 do:}}} For  i = 0  to 14 do: {\displaystyle {\mbox{For }}i=0{\mbox{ to 14 do:}}} T i = T i ⊕ ( ( T ( i − 7 )  mod  15 ⊕ T ( i − 2 )  mod  15 ) ⋘ 3 ) ⊕ ( 4 i + j ) {\displaystyle T_{i}=T_{i}\oplus ((T_{(i-7){\mbox{ mod }}15}\oplus T_{(i-2){\mbox{ mod }}15})\lll 3)\oplus (4i+j)} Repeat 4 times: {\displaystyle {\mbox{Repeat 4 times:}}} For  i = 0  to 14 do: {\displaystyle {\mbox{For }}i=0{\mbox{ to 14 do:}}} j = low 9 bits of  T ( i − 1 ) mod   15 {\displaystyle j={\mbox{low 9 bits of }}T_{(i-1){\bmod {\ }}15}} T i = ( T i + S j ) ⋘ 9 {\displaystyle T_{i}=(T_{i}+S_{j})\lll 9} For  i = 0  to 9 do: {\displaystyle {\mbox{For }}i=0{\mbox{ to 9 do:}}} K 10 j + i = T 4 i  mod  15 {\displaystyle K_{10j+i}=T_{4i{\mbox{ mod }}15}} For  i = 5 , 7 , . . . , 35  do:    (this are the multiplication keys) {\displaystyle {\mbox{For }}i=5,7,...,35{\mbox{ do:}}\ {\mbox{ (this are the multiplication keys)}}} j = least 2 bits of  K i {\displaystyle j={\mbox{least 2 bits of }}K_{i}} w = K i ∨ 3   (the 2 lower bits is set to 1) {\displaystyle w=K_{i}\vee 3\ {\mbox{(the 2 lower bits is set to 1)}}} M l = 1  Iff  w l  belongs to a sequence of 10 consecutive 1's or 0's, And  {\displaystyle M_{l}=1{\mbox{ Iff }}w_{l}{\mbox{ belongs to a sequence of 10 consecutive 1's or 0's, And }}} 2 ≤ l ≤ 30  And Also  w l − 1 = w l = w l + 1 {\displaystyle 2\leq l\leq 30{\mbox{ And Also }}w_{l-1}=w_{l}=w_{l+1}} r =  least 5 bits of  K i − 1 {\displaystyle r={\mbox{ least 5 bits of }}K_{i-1}} p = B j ⋘ r {\displaystyle p=B_{j}\lll r} K i = w ⊕ ( p ∧ M ) {\displaystyle K_{i}=w\oplus (p\wedge M)} בקוד המתואר M {\displaystyle M} נקרא מסכת סיביות (bit mask) כאשר הסיביות M l {\displaystyle M_{l}} מחושבות לפי ערכי w l {\displaystyle w_{l}} . וגודל המסכה הוא לכל היותר l = 30 {\displaystyle l=30} . הסמל ∨ {\displaystyle \vee } הוא האופרטור OR והסמל ∧ {\displaystyle \wedge } הוא האופרטור AND. בבדיקות שנעשו הגיע צופן MARS למהירות של 28 מגה בקירוב לשנייה בהצפנה ופענוח על מחשב מסוג Pentium-Pro. הסתבר שמהדר בורלנד (שנמנה מבין דרישות התקן) לא הניב ביצועים אופטימליים. הצופן ניתן ליישום יעיל על פלטפורמות שונות הן בחומרה והן בתוכנה, אך נופל בביצועיו לעומת המתחרים האחרים. למעשה קיבל את הניקוד הנמוך ביותר לפי דירוג NIST של חמשת המובילים. להערכת המפתחים עם מפתח 256 סיביות ההתקפה הכי טובה היא 2 256 {\displaystyle 2^{256}} על בסיס הערכה זו, מנימוקים קריפטוגרפיים, אין כל סיבה להשתמש במפתחות גדולים יותר. כמו כן ההתקפה הטובה ביותר האפשרית כנגד האלגוריתם (גם ליניארית וגם דיפרנציאלית) היא בסיבוכיות מקום של 2 128 {\displaystyle 2^{128}} - שזה מעבר למידע הזמין בעולם. הערכת המפתחים שהאלגוריתם יהיה בטוח לפחות לעשור הקרוב. ועדת המחקר של האיחוד האירופי לבחירת תקן ההצפנה אירופאי הנקראת NESSIE (מקבילה של NIST) ביקרה את כל המועמדים המובילים לתקן AES בשנים 2000 - 2003 וציינה מספר בעיות בקשר ל-MARS. לדעת הוועדה, טענת המפתחים לגבי ביטחון הצופן מכילה מספר שגיאות ואין בהירות מספקת לגבי תרומתו של המבנה המיוחד (תוספת הסבבים ללא המפתח) לביטחונו, אם כי אין מספיק מידע כדי לפתח התקפה מעשית. קיימות למעשה התקפות תאורטיות (של ביהם ושנייר) על מספר סבבים מצומצם של הצופן שמלמדות שאין הוכחה ברורה ליתרון זה. ניתוח תהליך הרחבת המפתח מאוד איטי ואינו מעיד בהכרח על ביטחונו. במיוחד העובדה ששתי הסיביות הנמוכות של חלקים מהמפתח המשתתפים בכפל שנקבעו ל-"11", משליכה שתמיד יהיו שני קלטים שלא ישתנו בשלב הכפל בלי התחשבות במפתח. המבקרים מסכמים שמבנה MARS היה מורכב מדי להערכה בזמן הקצר של התחרות ואין ביטחון שלא יתגלו חולשות. ההתקפה הטובה ביותר הידועה (נכון לשנת 2000) כנגד צופן MARS היא התקפה דיפרנציאלית של ג'ון קלסי, ברוס שנייר וטדיושי קונו. ההתקפה שנקראת 'בומרנג' מצליחה לפרוץ את MARS באחד-עשר סבבים של הגרעין הקריפטוגרפי בסיבוכיות של 2 65 {\displaystyle 2^{65}} טקסטים גלויים נבחרים עם זיכרון 2 70 {\displaystyle 2^{70}} ו- 2 229 {\displaystyle 2^{229}} ניסיונות (הצפנה חלקית - ללא שכבת הערבוב). AES The MARS Encryption Algorithm Comments by the NESSIE Project on the AES Finalists Boomerang attack on MARS