PRESENT (צופן)

PRESENT הוא צופן בלוקים קל משקל, בסגנון רשת החלפה-תמורה, המיועד לריצה על חומרה מוגבלת משאבים כמו RFID ורשת סנסורים אלחוטיים. פותח על ידי קבוצת חוקרים ממעבדות אורנג', DTU (האוניברסיטה הטכנית של דנמרק) ו-RUB (אוניברסיטת רוהר בוכום) והוצג בסדנת CHES 2007 (ועידה בנושא קריפטוגרפיה בחומרה ומערכות משובצות) בווינה. ידוע בקומפקטיות שלו, הוא קטן מ-AES פי שנים וחצי בקירוב ונכלל בתקן איזו ISO/IEC 29192-2 בקטגוריית צופן בלוקים קל משקל.

הצופן עוצב במיוחד תוך התחשבות בסביבת מחשוב אולטרה זעירה, עם צריכת אנרגיה מאוד נמוכה. הוא משלב מוטיבים מצופן DES ומסרפנט (מכאן שמו). בנוי בסגנון רשת החלפה-תמורה עם תיבת החלפה אחת בגודל <math>4\times 16</math> סיביות. מקבל בלוק טקסט גלוי באורך 64 סיביות (שמונה בתים), מפתח הצפנה באורך 80 או 128 סיביות (עשרה או שישה עשר בתים) לפי העדפה ומחזיר בלוק מוצפן באורך 64 סיביות. 

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

במסגרת פרויקט eSTREAM פותחו מספר צפני זרם מאוד יעילים בחומרה ביניהם גריין ו-Trivium. אך בניגוד לצופן זרם, צופן בלוקים נחשב לפרימיטיב יותר ורסטילי. יתרה מזו, אמנות פיתוח צופן בלוקים מבוססת ומובנת יותר מפיתוח צופן זרם. למרות שקיימת תאוריה עשירה בנושא LFSR שנחשב לכלי הטוב ביותר לבניית צופן זרם מהיר במינימום מעגלים, עדיין קשה להגיע לשילוב בטוח ובשל כך האמון בצופן זרם מסוג כזה חלש יותר. בבניית צופן בלוקים קל משקל כמו PRESENT, אין די במיטוב אלגוריתם קיים אלא עדיף לפתח אותו מההתחלה תוך התחשבות בסביבה בה יפעל. כמובן בהתחשב במינימום הביטחון ההכרחי בסטנדרטים של ימינו. למשל יש לקחת בחשבון שאם הצופן מקבל בלוק קצר מדי, למשל 64 סיביות הדבר חושף אותו להתקפת יום הולדת ואם ההתקן אמור להצפין כמויות גדולות של מידע (מה שלא סביר שיקרה בהתקנים זעירים) יש צורך להחליף מפתחות בתדירות גבוהה יותר.

ידוע שצופן DES נחשב ליעיל מאוד בחומרה אפילו בהשוואה לצפנים מודרניים. הסיבה היא שמפתחי הצופן מראש שאפו לייעדו לחומרה. בהתחשב בעובדה שבעת פיתוח DES מזעור המוליכים למחצה היה עדיין בחיתוליו זה לא מפתיע שניתן לממש את DES בחומרה עם 2300 GE (שערים לוגיים). לשם השוואה AES במימוש הכי ממוטב בחומרה, צורך לפחות 3600 שערים. בקטגוריה של צפנים קלי משקל קיימות מספר הצעות טובות כמו SEA, TEA, mCrypton ו-HIGHT שבממוצע צורכים כ-2500 GE. הבעיה עם DES היא העובדה שהמפתח קצר מדי (רק 56 סיביות לעומת צפנים מודרניים 128 סיביות לפחות), הגרסה המשופרת שלו DESXL (עם מפתחות באורך כולל של 168 סיביות) צורכת כ-2200 GE. את PRESENT אפשר לממש בחומרה עם 1570 GE מה שמעמיד אותו כמתחרה ראוי אף לצופן זרם.

==שימושים ומגבלות==
צופן PRESENT הוא צופן פשוט שפותח במיוחד לסביבה בעלת משאבים נמוכים מאוד ואינו מתאים לשימוש כללי. הוא מומלץ לשימוש רק במקרים מיוחדים כאשר AES אינו מתאים. באופן כללי:
*צופן PRESENT מיועד למימוש בחומרה.
*הוא מתאים רק במקרים בהם נדרש ביטחון סביר ולא ברמה הכי גבוהה. לכן מפתח באורך 80 סיביות מספק.
*הצופן לא נועד להצפנת כמויות גדולות של מידע ולכן גודל הבלוק הוגבל ל-64 סיביות.
*יש מקרים שבהם כדאי להטמיע את המפתח הסודי בחומרה. במקרה כזה שהמפתח קבוע התקפות שמסתמכות על מניפולציות של המפתח אינן ישימות.
*האספקטים החשובים שיש לוודא במימוש האלגוריתם, לפי סדר יורד, הם: ביטחון, שטח פיזי, צריכת אנרגיה ולבסוף תפוקה.
*במצב מונה אפשר לממש רק את פונקציית ההצפנה של הצופן, מה שחוסך במקום נוסף.

==תיאור הצופן==
PRESENT בנוי בסגנון רשת החלפה תמורה ב-31 סבבים. הוא מקבל מפתח הצפנה סודי בשני אורכים אפשריים. מפתח באורך 80 סיביות המתאים לשימוש רגיל בדומה לתקן eSTREAM למימוש צופן זרם בחומרה מוגבלת, כאשר דרישות הביטחון נמוכות. או מפתח באורך 128 סיביות לפי המינימום הנדרש בתקן AES במידה שיש צורך בביטחון גבוה יותר. המפתח מורחב ל-32 תת-מפתחות <math>K_1,K_2,...,K_{32}</math> בתהליך שמתואר בהמשך. בכל סבב מבוצעים שלושה מהלכים:
*חיבור עם תת-המפתח <math>K_i</math> (כאשר <math>i</math> מתייחס למספר הסבב) והמפתח <math>K_{32}</math> משמש להלבנה מסיימת.
*שכבת פיזור שהיא תמורה ליניארית ברמת סיביות.
*שכבת החלפה אי-ליניארית הכוללת תיבת החלפה S-box בגודל 4 סיביות המבוצעת 16 פעמים במקביל.

===חיבור מפתח===
החיבור עם המפתח שנקרא "addRoundKey" הוא חיבור XOR של 64 סיביות המצב הפנימי (הזיכרון) של הצופן עם 64 הסיביות הראשונות של תת-המפתח <math>K_i</math>.

===החלפה===
ההחלפה הנקראת "sBoxLayer" היא פעולת החלפה של ארבע סיביות בארבע סיביות לפי טבלה קבועה. מחלקים את בלוק המצב המכיל 64 סיביות: <math>b_{63},...,b_0</math> ל-16 חלקים באורך ארבע סיביות כל אחד: <math>w_{15},...,w_0</math> כאשר <math> w_i=b_{4i+3}\ \| \ b_{4i+2}\ \| \ b_{4i+1}\ \| \ b_{4i} </math> עבור <math>0\le i\le 15</math> ומחליפים אותם במקביל לפי הטבלה הבאה:
{| class="wikitable" dir="ltr"
|-
| x || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F
|-
| S[x] || C || 5 || 6 || B || 9 || 0 || A || D || 3 || E || F || 8 || 4 || 7 || 1 || 2
|}

===פיזור===
שכבת הפיזור הנקראת "pLayer" מובאת בטבלה הבאה:
{| class="wikitable" dir="ltr" 
|- bgcolor="#E7DCC4"
| <math>i</math> || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 || 13 || 14 || 15
|-
| <math>P(i)</math> || 0 || 16 || 32 || 48 || 1 || 17 || 33 || 49 || 2 || 18 || 34 || 50 || 3 || 19 || 35 || 51
|- bgcolor="#E7DCC4"
| <math>i</math> || 16 || 17 || 18 || 19 || 20 || 21 || 22 || 23 || 24 || 25 || 26 || 27 || 28 || 29 || 30 || 31
|-
| <math>P(i)</math> || 4 || 20 || 36 || 52 || 5 || 21 || 37 || 53 || 6 || 22 || 38 || 54 || 7 || 23 || 39 || 55
|- bgcolor="#E7DCC4"
| <math>i</math> || 32 || 33 || 34 || 35 || 36 || 37 || 38 || 39 || 40 || 41 || 42 || 43 || 44 || 45 || 46 || 47
|-
| <math>P(i)</math> || 8 || 24 || 40 || 56 || 9 || 25 || 41 || 57 || 10 || 26 || 42 || 58 || 11 || 27 || 43 || 59
|- bgcolor="#E7DCC4"
| <math>i</math> || 48 || 49 || 50 || 51 || 52 || 53 || 54 || 55 || 56 || 57 || 58 || 59 || 60 || 61 || 62 || 63
|-
| <math>P(i)</math> || 12 || 28 || 44 || 60 || 13 || 29 || 45 || 61 || 14 || 30 || 46 || 62 || 15 || 31 || 47 || 63
|}
לדוגמה אם הקלט הוא <math>i=33</math> הפלט הוא <math>P(33)=24</math>.

===הכנת מפתח===
הפרוצדורה "generateRoundKeys" אחראית להכנת המפתח המסופק על ידי המשתמש להצפנה. במקרה של 80 סיביות, תחילה טוענים את המפתח לאוגר באורך 80 סיביות: <math>K_{79},...,K_0</math>. בכל סבב משתמשים רק ב-64 הסיביות הראשונות (הכי פחות משמעותיות) של המפתח: <math>K_{63},...,K_0</math> ובכל סבב הפרוצדורה "update" מעדכנת את אוגר המפתח כדלהלן:
# <math>[k_{79}k_{78}\cdots k_{1}k_{0}] = [k_{18}k_{17} \cdots k_{20}k_{19}]</math>
# <math>[k_{79}k_{78}k_{77}k_{76}] = S[k_{79}k_{78}k_{77}k_{76}]</math>
# <math>[k_{19}k_{18}k_{17}k_{16}k_{15}] = [k_{19}k_{18}k_{17}k_{16}k_{15}]\oplus\text{RoundCounter}</math>
במילים: בכל סבב מבצעים הזזה מעגלית של אוגר המפתח 61 סיביות שמאלה, ארבע הסיביות השמאליות ביותר מוחלפות לפי תיבת ההחלפה של PRESENT וחמש הסיביות הימניות ביותר (הכי פחות משמעותיות) של מונה הסבב <math>\text{RoundCounter}</math> (ערכו של <math>i</math>) מחוברות ב-XOR עם סיביות המפתח בפוזיציות <math>k_{19},k_{18},k_{17},k_{16},k_{15}</math>.

==תיאור הצופן==
להלן פסבדו קוד הממחיש את האלגוריתם באופן כללי.
{| dir="ltr"
|-
|
:<math>1. \ \text{GenerateRoundKeys}()</math> 
:<math>2. \ \text{For }i = 1\text{ to }31\text{ do}</math>
:<math>\ \ \ \ \ \ 2.1 \ \text{addRoundKey}(\text{state},K_i)</math>
:<math>\ \ \ \ \ \ 2.2 \ \text{sBoxLayer}(\text{state})</math>
:<math>\ \ \ \ \ \ 2.3 \ \text{pLayer}(\text{state})</math>
:<math>3. \ \text{addRoundKey}(\text{state},K_{32})</math>
|}

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

==ראו גם==
* צופן בלוקים
* AES

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

קטגוריה:צפני בלוקים