SEA (צופן)

SEA (ראשי תיבות של Scalable Encryption Algorithm), הוא צופן בלוקים סקלבילי פרמטרי בסגנון רשת פייסטל המותאם למערכות משובצות מחשב זעירות. SEA הוצג בספרד בוועידת 2006 CARDIS (ועידה שנתית בינלאומית לכרטיסים חכמים).

==מוטיבציה==
בצפנים סימטריים שהתפרסמו מאז תקן AES בדרך כלל נלקח בחשבון שקלול עלויות יישום מול ביצועים עם דגש על יעילות על מגוון רחב של פלטפורמות מחשוב כיעד משני. לעומת זאת קיימים צפנים מודרניים המתמקדים דווקא בסביבה בה עוצמת המחשוב מוגבלת והתפוקה נמוכה. המטרה היא בעיקר טכנולוגיות בית חכם כמו שליטה ובקרה מרחוק בתאורה, מיזוג אוויר וטמפרטורה מטעמים של חסכון באנרגיה וידידותיות לסביבה. לשם כך קיימת רשת אינטרנט 0 שהיא רשת עמית לעמית איטית אך זולה ופשוטה, הפועלת בסביבה מוגבלת משאבים ומאפשרת לכל מכשיר להתקשר עם מכשיר אחר ישירות. כמו בכל רשת חובה להגן על התקשורת מפני גורמים עוינים או מתחרים. והדבר דורש סט כלים ייעודיים. <math>\text{SEA}_{n,b}</math> הוצע כפתרון אפשרי להצפנה ואימות תעבורת הרשת במערכת כזו. כמו כן בשל זעירות הקוד מתאים גם לתיוג RFID ולסנסרורים אלחוטיים.

צופן SEA פותח על ידי François-Xavier StandaertGilles PiretNeil GershenfeldJean-Jacques Quisquater כצופן פרמטרי גמיש שניתן להתאמה למצבים רבים כמו אופי הקלט, סוג מעבד או אורך המפתח. הוא מותאם להשגת ביצועים אופטימליים עם קוד מינימלי על כל מעבד והביטחון שלו הוא פונקציה של אורך המפתח שנבחר. הצופן ניחן בפשטות הן בהצפנה ופענוח והן בהכנת מפתח ההצפנה.

==תיאור האלגוריתם==
פונקציית הסבב הפנימית עם פונקציית המפתח של צופן SEA
הפרמטרים מתייחסים לאופן הפעלת הצופן במצבים שונים. גודל בלוק הקלט בסיביות, גודל מפתח הצפנה בסיביות ומספר סבבים משתנה. באופן כללי:
* <math>b</math> מתייחס לגודל מילה במערכת בה מיושם הצופן.
* <math>n</math> מתייחס לגודל הקלט בסיביות (צריך להיות כפולה של <math>6b</math>).
* <math>\textstyle n_b = \frac{n}{2b}</math> מתייחס למספר המילים בהסתעפות רשת פייסטל.
* <math>n_r</math> הוא מספר החזרות של פונקציית ההצפנה הפנימית. 
הפעולות בצופן הן ברמה הבסיסית ביותר הנתמכת בכל מעבד כיום. XOR, הזזה מעגלית לשמאל או לימין ברמת מילים או סיביות, חיבור מודולו <math>2^b</math> ופונקציית החלפה לפי טבלה.

לצורך החלפה הצופן משתמש בטבלת החלפה 3x8 סיביות:
<center>
:<math>\boldsymbol{S_T=\{0,5,6,7,4,3,1,2\}}</math>.
</center>
למען היעילות ההחלפה מתבצעת באופן רקורסיבי על כל שלוש מילות קלט כדלקמן:
{| dir="ltr"
|-
|
:<math>\boldsymbol{S:\mathbb{Z}_{2^b}^{n_b}\longrightarrow\mathbb{Z}_{2^b}^{n_b}:x\rightarrow x=S(x)\ \ \ \ \Leftrightarrow}</math>
:::<math>\ \ \ \ x_{3i}=(x_{3i+2}\land x_{3i+1})\oplus x_{3i}</math>,
:::<math>\ \ \ \ x_{3i+1}=(x_{3i+2}\land x_{3i})\oplus x_{3i+1}</math>,
:::<math>\ \ \ \ x_{3i+2}=(x_{3i}\lor x_{3i+1})\oplus x_{3i+2}</math>, כאשר <math>0\le i\le n_b/3-1</math>. 
|}
הסימנים <math>\lor</math> ו-<math>\land</math> מייצגים את וגם ואו. 

===הצפנה ופענוח===
פונקציית ההצפנה <math>F_E</math>, פונקציית הפענוח <math>F_D</math> ופונקציית המפתח <math>F_K</math> מוגדרות כך:
{| dir="ltr"
|-
| <math>[L_{i+1},R_{i+1}]=F_E(L_i,R_i,K_i)</math> || <math>\Leftrightarrow</math> || <math>R_{i+1}=R(L_i)\oplus r(S(R_i\boxplus K_i))</math>
|-
| colspan="2" | || <math>L_{i+1}=R_i</math>
|-
| <math>[L_{i+1},R_{i+1}]=F_D(L_i,R_i,K_i)</math> || <math>\Leftrightarrow</math> || <math>R_{i+1}=R^{-1}(L_i)\oplus r(S(R_i\boxminus K_i))</math>
|-
| colspan="2" | || <math>L_{i+1}=R_i</math>
|-
| <math>[KL_{i+1},KR_{i+1}]=F_K(KL_i,KR_i,C_i)</math> || <math>\Leftrightarrow</math> || <math>KR_{i+1}=KL_i\oplus R(r(S(KR_i\boxplus C_i)))</math>
|-
| colspan="2" | || <math>KL_{i+1}=KR_i</math>
|}

בפסאודו קוד הבא מומחש תהליך ההצפנה כולו. הפונקציה מקבלת את בלוק הטקסט הגלוי <math>P</math> ומפתח סודי <math>K</math> ומייצרת את <math>C</math>, כאשר שלושתם באורך <math>n</math> סיביות וכל הפעולות בפונקציה מבוצעות ברמת מילים באורך <math>b</math> סיביות.
{| dir="ltr"
|-
|
:<math>\boldsymbol{C=\mathbf{SEA}_{n,b}(P,K)}</math>
:<math>\{</math>
:<math>\ \ \ \ L_0\ \| \ R_0=P</math>
:<math>\ \ \ \ KL_0\ \| \ KR_0=K</math>
:<math>\ \ \ \ \text{For }i=1\text{ to }\textstyle\lfloor\frac{n_r}{2}\rfloor\text{ do: }</math>
:<math>\ \ \ \ \ \ \ \ \ \ [KL_i,KR_i]=F_K(KL_{i-1},KR_{i-1}, C(i))</math>
:<math>\ \ \ \ \text{Swap}\left(KL_{\textstyle\lfloor\frac{n_r}{2}\rfloor},KR_{\textstyle\lfloor\frac{n_r}{2}\rfloor}\right)</math>
:<math>\ \ \ \ \text{For }i=\textstyle\lfloor\frac{n_r}{2}\rfloor\text{ to }n_r-1\text{ do:}</math>
:<math>\ \ \ \ \ \ \ \ \ \ [KL_i,KR_i]=F_K(KL_{i-1},KR_{i-1},C(r-i))</math>
:<math>\ \ \ \ \text{For }i=1\text{ to }\textstyle\lfloor\frac{n_r}{2}\rfloor\text{ do: }</math>
:<math>\ \ \ \ \ \ \ \ \ \ [L_i,R_i]=F_E(L_{i-1},R_{i-1},KR_{i-1})</math>
:<math>\ \ \ \ \text{For }i=\textstyle\lfloor\frac{n_r}{2}\rfloor+1\text{ to }n_r\text{ do:}</math>
:<math>\ \ \ \ \ \ \ \ \ \ [L_i,R_i]=F_E(L_{i-1},R_{i-1},KL_{i-1})</math>
:<math>\ \ \ \ C=R_{n_r}\ \| \ L_{n_r}</math>
:<math>\ \ \ \ \text{Swap}(KL_{n_r-1},KR_{n_r-1})</math>
:<math>\}</math>
|}
הסימן <math>\|</math> מייצג שרשור. הפונקציה <math>r</math> היא הזזה מעגלית ברמת סיביות והפונקציה <math>R</math> היא הזזה מעגלית ברמת מילים. הפונקציה <math>\text{Swap}(L,R)</math> פשוט מחליפה ערכים בין <math>L</math> ו-<math>R</math>. פענוח מתבצע באופן זהה למעט הקריאה לפונקציה <math>F_D</math>. לביטחון מינימלי מספר הסבבים הרצוי הוא <math>\textstyle\frac{3n}{4}+2\cdot(n_b+\lfloor b/2\rfloor)</math> וכן הוא צריך להיות אי זוגי. כאן ההנחה היא שגודל מילה הוא לפחות 8 סיביות. הקבועים <math>C(i)</math> המשמשים כמפתחות הצפנה לרשת פייסטל בשלב הכנת המפתח הוא וקטור של <math>n_b</math> מילים המאופסות כולן למעט המילה הכי פחות משמעותית (LSW) המכילה את הערך i (מונה הסבב).

==ביטחון ויעילות==
צופן SEA מבוסס על רשת פייסטל שנחקרה על ידי רבים ונחשבת לבטוחה. והוא נחשב מבין הצפנים היעילם ביותר בחומרה עם פחות מ-2280 GE (שערים). זהו צופן חדש יחסית ולכן נכון לשנת 2017 אין עדיין קריפטואנליזה נרחבת שלו.

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

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

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