کاسومی

**کاسومی** یک رمزگذاری قطعه‌ای است که در سامانه جهانی مخابرات سیار، جی‌اس‌ام، سرویس بسته امواج رادیویی تلفن همراه استفاده می‌شود. در سامانه جهانی مخابرات سیار، کاسومی به عنوان الگوریتم‌های رازداری و یکپارچگی داده‌ها به ترتیب به نام‌های  و  به کار رفته‌است. در جی‌اس‌ام، کاسومی در تولیدکنندهٔ جریان‌کلید برای **A5/3** به کار رفته‌است. در سرویس بسته امواج رادیویی، کاسومی در تولیدکنندهٔ جریان‌کلید برای **GEA3** به کار رفته‌است.

کاسومی برای پروژه مشارکتی نسل سوم شبکه تلفن همراه  طراحی شده بود تا به وسیلهٔ گروهی از متخصصان الگوریتم‌های امنیتی  (بخشی از سازمان استانداردهای اروپایی به نام نهاد استانداردهای مخابراتی اروپا) در سامانه امنیتی سامانه جهانی مخابرات سیار به کار رود.

به خاطر برنامهٔ فشرده برای استانداردسازی 3GPP، گروه SAGE پیشنهاد گروه فنی مخصوص 3GPP  را در مورد بخش امنیتی 3G  قبول کرد. پیشنهاد به این صورت بود که برای بخش امنیتی، به جای توسعه یک الگوریتم رمزگذاری جدید، از یک الگوریتم موجود که مورد ارزیابی قرار گرفته بود، استفاده شود. آن‌ها برای این کار، الگوریتم  را که توسعه‌یافته بود و توسط میتسوبیشی الکتریک، ثبت‌شده بود را انتخاب کردند. اصل الگوریتم برای پیاده‌سازی راحت‌تر توسط سخت‌افزار و فراهم‌کردن دیگر مجموعه نیازمندی‌های لازم برای امنیت ارتباطی تلفن‌های همراه 3G، مقداری تغییر کرد.

اسم کوسامی که بعد از نام اصلی الگوریتم  به علت معادل ژاپنی برای  انتخاب شد. (به هیراگانا معادل  و به روماجی معادل ** است)

در ژانویه ۲۰۱۰، اوردانکلمن ، ناتان‌کلر  و ادی شامیر یک مقاله‌ای را منتشر نمودند که در آن نشان‌داده شده بود که می‌توان الگوریتم کوسامی را با یک حمله کلیدهای مرتبط  و منابع محاسباتی خیلی مدرن، شکست. البته این حمله در برابر MYSTY1 بی‌اثر بود.

## توضیحات
کاسومی یک الگوریتم است که به صورت خاص در تکنولوژی‌های 3GPP تعریف‌شده‌است. کاسومی یک رمزگذاری قطعه‌ای با کلیدی به طول ۱۲۸ بیت، ورودی و خروجی ۶۴ بیتی است. هستهٔ اصلی کاسومی یک شبکهٔ فایستل با ۸ دور می‌باشد. توابع هر دور شبکهٔ فایستل، تبدیلات شبکه‌ای برگشت هستند. در هر دور، تابع مربوط به دور از یک زیرکلید ۱۶ بیتی که از طریق کلید ۱۲۸ بیتی اصلی الگوریتم و توسط یک زمان‌بند کلید ثابت تولیدشده است، استفاده می‌کند.

### زمان‌بند کلید
کلید اصلی ۱۲۸ بیتی به اسم K، به ۸ زیرکلید ۱۶ بیتی K_i (1 \le i \le 8) تقسیم می‌شود:

K=K_1 \| K_2 \| K_3 \| K_4 \| K_5 \| K_6 \| K_7 \| K_8\,

همچنین در کنار کلید اصلی، یک کلید تغییریافته به اسم K^' استفاده می‌شود که به روش مشابه، به ۸ زیرکلید ۱۶ بیتی K^'_i (1 \le i \le 8) تقسیم می‌شود. این کلید تغییریافته به وسیلهٔ یای‌انحصاری کلید اصلی K با عدد {(123456789ABCDEFFEDCBA9876543210)}_{16} به دست می‌آید. 

این زیرکلیدهای هر دور، به وسیلهٔ چرخش بیتی به سمت چپ با مقداری مشخص یا از طریق کلیدهای تغییریافته (بدون تغییر) محاسبه می‌شوند.

کلیدهای ۸ دو به صورت زیر هستند:


\begin{array}{lcl}
KL_{i,1} & = & {\rm ROL}(K_i,1) \\
KL_{i,2} & = & K'_{i+2} \\
KO_{i,1} & = & {\rm ROL}(K_{i+1},5) \\
KO_{i,2} & = & {\rm ROL}(K_{i+5},8) \\
KO_{i,3} & = & {\rm ROL}(K_{i+6},13) \\
KI_{i,1} & = & K'_{i+4} \\
KI_{i,2} & = & K'_{i+3} \\
KI_{i,3} & = & K'_{i+7}
\end{array}


زیراندیس‌های به کار رفته در فرمول‌های بالا به صورت گردشی است، یعنی اگر یک زیراندیس به صورت i + j از عدد ۸ بزرگتر شد، باید ۸ تا از آن کم شود تا مقدار واقعی اندیس محاسبه شود.

### الگوریتم
الگوریتم کاسومی یک کلید ۶۴ بیتی را به صورت ۲ بخش ۳۲ بیتی در قالب بخش چپ (L_i) و بخش راست (R_i) پردازش می‌کند. ورودی الگوریتم کاسومی، الحاق سمت چپ و راست از اولین دور می‌باشد:

{\rm input} = R_0\|L_0\,

در هر دور، بخش سمت راست (R_i) با خروجی تابع دور، یای‌انحصاری می‌شود و بعد از آن، جای دو بخش سمت چپ و راست تغییر می‌کند. (در تابع زیر، KL_i, KO_i, KI_i همان کلیدهای دور iام محسوب می‌شوند)

\begin{array}{rcl}L_i & = & F_i(KL_i,KO_i,KI_i,L_{i-1})\oplus R_{i-1} \\ R_i & = & L_{i-1}\end{array}

تابع دور  برای دورهای زوج و فرد متفاوت می‌باشد. با این حال، در هر دور، تابع دور یک تابع از دو بخش FL_i و FO_i است. برای دورهای فرد، تابع دور به صورت زیر است:

F_i(K_i,L_{i-1})=FO(KO_i, KI_i, FL(KL_i, L_{i-1}))\,

و برای دورهای زوج، تابع دور به صورت زیر است:

F_i(K_i,L_{i-1})=FL(KL_i, FO(KO_i, KI_i, L_{i-1}))\,.

خروجی الگوریتم، الحاق بخش‌های خروجی دور آخر می‌باشد.

{\rm output} = R_8\|L_8\,

هر دو تابع FL و FO ورودی ۳۲ بیتی خود را به دو بخش ۱۶ بیتی تبدیل می‌کنند. تابع FL یک تابع تغییر بیت‌ها به صورت بازگشت‌پذیر است در حالی که تابع FO یک شبکه فایستل ۳ دوره بازگشت‌ناپذیر است.

#### تابع <math>FL</math>
ورودی ۳۲ بیتی (x) تابع FL(KL_i,x)، به دو بخش ۱۶ بیتی تقسیم می‌شود: x=l\|r

بخش سمت چپ ورودی (l) با کلید دور KL_{i,1}، به صورت بیتی عطف منطقی می‌شود و سپس به اندازهٔ یکی بیت، به سمت چپ چرخش داده می‌شود. خروجی آن، با سمت راست ورودی (r)، یای‌انحصاری می‌شود تا سمت راست خروجی (r') تولید شود:

r'= {\rm ROL}(l \wedge KL_{i,1},1) \oplus r

سپس خروجی قبلی (r') با کلید دور KL_{i,2} فصل منطقی می‌شود و سپس به اندازهٔ یک بیت به سمت چپ، چرخش پیدا می‌کند. سپس خروجی آن، با سمت چپ ورودی (l) یای‌انحصاری می‌شود تا سمت چپ خروجی (l') تولید شود:

l'= {\rm ROL}(r' \vee KL_{i,2},1) \oplus l

در نهایت خروجی، الحاق دو بخش سمت چپ و راست می‌باشد: x'=l'\|r'

#### تابع <math>FO</math>
ورودی ۳۲ بیتی (x) تابع FO(KO_i, KI_i, x)، به دو بخش ۱۶ بیتی تقسیم می‌شود: x=l_0\|r_0

سپس در درون ۳ دور از شبکهٔ فایستل عبور می‌کند.

در هر یک از سه دور شبکهٔ فایستل (دارای اندیس‌های ۱ و ۲ و ۳) سمت چپ تغییر می‌کند تا سمت راست دور بعدی را بسازد و سمت راست، به عنوان سمپ چپ دور بعدی استفاده می‌شود.


\begin{array}{lcl}
r_j & = & FI(KI_{i,j}, l_{j-1} \oplus KO_{i,j}) \oplus r_{j-1} \\
l_j & = & r_{j-1}
\end{array}


در نهایت خروجی تابع به صورت روبرو خواهد بود: x' = l_3\|r_3

#### تابع <math>FI</math>
تابع FI یک شبکه فایستل غیرمعمولی است.

ورودی ۱۶ بیتی (x) تابع FI(KI,x) به دو بخش به صورت روبرو تقسیم می‌شود: x=l_0\|r_0

طول بخش l_0 به اندازهٔ ۹ بیت و طول بخش r_0، ۷ بیت است.

بیت‌های موجود در بخش چپ (l_0) ابتدا توسط یک جعبهٔ جایگزینی  (به نام S9) مخلوط شده و نتیجه با گسترش‌یافتهٔ بخش راست (r_0) با بیت صفر، فصل منطقی می‌شود تا بخش سمت راست جدید (r_1) تولید شود:

r_1=S9(l_0)\oplus (00\|r_0)\,

بیت‌های موجود در بخش راست (r_0) با یک جعبهٔ جایگزینی ۷ بیتی (به نام S7) مخلوط شده و سپس نتیجهٔ آن با هفت بیت کم‌ارزش (LS7) سمت راست جدید (r_1)، فصل منطقی می‌شود تا ۷ بیت جدید سمت چپ (l_1) تولید شود:

l_1=S7(r_0)\oplus LS7(r_1)\,

در این‌جا کلمهٔ میانی x_1=l_1\|r_1 با کلید دور KI فصل منطقی می‌شود تا x_2=l_2\|r_2 تولید شود که در آن l_2 به طول ۷ بیت و r_2 به طول ۹ بیت است:

x_2=KI\oplus x_1

بیت‌های موجود در بخش راست (r_2) ابتدا توسط یک جعبهٔ جایگزینی (به نام S9) مخلوط شده و نتیجه با گسترش‌یافتهٔ بخش راست (l_2) با بیت صفر، فصل منطقی می‌شود تا بخش سمت راست جدید (r_3) تولید شود:

r_3=S9(r_2)\oplus (00\|l_2)\,

بیت‌های موجود در بخش چپ (l_2) با یک جعبهٔ جایگزینی ۷ بیتی (به نام S7) مخلوط شده و سپس نتیجهٔ آن با هفت بیت کم‌ارزش (LS7) سمت راست جدید (r_3)، فصل منطقی می‌شود تا ۷ بیت جدید سمت چپ (l_3) تولید شود:

l_3=S7(l_2)\oplus LS7(r_3)\,

در نهایت خروجی تابع از الحاق دو بخش نهایی چپ و راست تولید می‌شود: x'=l_3\|r_3

#### جعبه‌های جایگزینی
جعبه‌های جایگزنی به نام‌های S7 و S9 هر دو توسط عملیات عطف منطقی و یای انحصاری و جدول‌ها تعریف می‌شوند. عملیاتی منطقی برای پیاده‌سازی سخت‌افزاری استفاده می‌شوند ولی امروزه اکثراً برای نمایش آن از جدول‌ها استفاده می‌شوند. 

جدول جایگزینی S7 به صورت زیر تعریف‌شده‌است:


```c
int S7[128] = {
   54, 50, 62, 56, 22, 34, 94, 96, 38,  6, 63, 93,  2, 18,123, 33,
   55,113, 39,114, 21, 67, 65, 12, 47, 73, 46, 27, 25,111,124, 81,
   53,  9,121, 79, 52, 60, 58, 48,101,127, 40,120,104, 70, 71, 43,
   20,122, 72, 61, 23,109, 13,100, 77,  1, 16,  7, 82, 10,105, 98,
  117,116, 76, 11, 89,106,  0,125,118, 99, 86, 69, 30, 57,126, 87,
  112, 51, 17,  5, 95, 14, 90, 84, 91,  8, 35,103, 32, 97, 28, 66,
  102, 31, 26, 45, 75,  4, 85, 92, 37, 74, 80, 49, 68, 29,115, 44,
   64,107,108, 24,110, 83, 36, 78, 42, 19, 15, 41, 88,119, 59,  3
};
```


جدول جایگزینی S9 به صورت زیر تعریف‌شده‌است:


```c
int S9[512] = {
  167,239,161,379,391,334,  9,338, 38,226, 48,358,452,385, 90,397,
  183,253,147,331,415,340, 51,362,306,500,262, 82,216,159,356,177,
  175,241,489, 37,206, 17,  0,333, 44,254,378, 58,143,220, 81,400,
   95,  3,315,245, 54,235,218,405,472,264,172,494,371,290,399, 76,
  165,197,395,121,257,480,423,212,240, 28,462,176,406,507,288,223,
  501,407,249,265, 89,186,221,428,164, 74,440,196,458,421,350,163,
  232,158,134,354, 13,250,491,142,191, 69,193,425,152,227,366,135,
  344,300,276,242,437,320,113,278, 11,243, 87,317, 36, 93,496, 27,

  487,446,482, 41, 68,156,457,131,326,403,339, 20, 39,115,442,124,
  475,384,508, 53,112,170,479,151,126,169, 73,268,279,321,168,364,
  363,292, 46,499,393,327,324, 24,456,267,157,460,488,426,309,229,
  439,506,208,271,349,401,434,236, 16,209,359, 52, 56,120,199,277,
  465,416,252,287,246,  6, 83,305,420,345,153,502, 65, 61,244,282,
  173,222,418, 67,386,368,261,101,476,291,195,430, 49, 79,166,330,
  280,383,373,128,382,408,155,495,367,388,274,107,459,417, 62,454,
  132,225,203,316,234, 14,301, 91,503,286,424,211,347,307,140,374,

   35,103,125,427, 19,214,453,146,498,314,444,230,256,329,198,285,
   50,116, 78,410, 10,205,510,171,231, 45,139,467, 29, 86,505, 32,
   72, 26,342,150,313,490,431,238,411,325,149,473, 40,119,174,355,
  185,233,389, 71,448,273,372, 55,110,178,322, 12,469,392,369,190,
    1,109,375,137,181, 88, 75,308,260,484, 98,272,370,275,412,111,
  336,318,  4,504,492,259,304, 77,337,435, 21,357,303,332,483, 18,
   47, 85, 25,497,474,289,100,269,296,478,270,106, 31,104,433, 84,
  414,486,394, 96, 99,154,511,148,413,361,409,255,162,215,302,201,

  266,351,343,144,441,365,108,298,251, 34,182,509,138,210,335,133,
  311,352,328,141,396,346,123,319,450,281,429,228,443,481, 92,404,
  485,422,248,297, 23,213,130,466, 22,217,283, 70,294,360,419,127,
  312,377,  7,468,194,  2,117,295,463,258,224,447,247,187, 80,398,
  284,353,105,390,299,471,470,184, 57,200,348, 63,204,188, 33,451,
   97, 30,310,219, 94,160,129,493, 64,179,263,102,189,207,114,402,
  438,477,387,122,192, 42,381,  5,145,118,180,449,293,323,136,380,
   43, 66, 60,455,341,445,202,432,  8,237, 15,376,436,464, 59,461
};
```


## رمزشناسی
در سال ۲۰۰۱، یک حلمه دیفرانسیلی غیرممکن  برای ۶ دور کاسومی توسط Kühn معرفی شد.

در سال ۲۰۰۳، الادبارکن ، الی‌بیهام  و ناتان‌کلر  یک حملهٔ مرد میانی را در برابر پروتکل جی‌اس‌ام معرفی کردند که مانع از رمزگذاری A5/3 شده و سبب شکستن پروتکل شد. اما این روش به رمزگذاری A5/3 حمله نکرد. نسخهٔ کامل این مقاله بعدها رد سال ۲۰۰۶ منتشر شد.

در سال ۲۰۰۵، الی‌بیهام ، یک محقق اسرائیلی، اردانکلمن  و ناتن‌کلر  یک مقاله در مورد حمله بومرنگ  برای کاسومی منتشر نمود که می‌تواند خیلی سریع‌تر از حمله جستجوی فراگیر ۸ دور کاسومی را بشکند. این حمله به 254.6 متن آشکار که هر کدام توسط ۴ کلید مرتبط به هم، رمز شده‌اند نیاز دارد و دارای پیچیدگی زمانی برابر با 276.1 عمل رمزگذاری کاسومی است. اگر چه این یک حمله کاربردی نیست، اما اعتبار برخی از اثبات‌ها را در مورد امنیت رمزگذاری پروتکل 3GPP را که بر اساس امنیت از پیش تعیین‌شدهٔ کاسومی بود، بی‌ارزش کرد.

در سال ۲۰۱۰، دانلکمن  و کلر  و شمیر  یک حملهٔ جدید را منتشر نمودند که یک شنونده اجازه می‌داد تا بتواند کلید کامل A5/3 را توسط حملهٔ کلیدهای مرتبط  بدست آورد. مدت زمان و پیچیدگی فضای حمله آن قدر کم بود که حتی نویسندگان معتقد بودند که با یک کامپیوتر اینتل کور ۲ و حتی استفاده از پیاده‌سازی‌های غیر بهینهٔ کاسومی، آن را می‌توان در ۲ ساعت شکست. نویسندگان اشاره کرده بودند که شاید حمله برای روش A5/3 که در سامانه‌های 3G استفاده شده‌است، قابل استفاده نباشد. دلیل اصلی آن‌ها این بود که 3GPP تضمین کرده بود که تغییرات آن‌ها در الگوریتم MISTY، به صورت جدی امنیت الگوریتم را تحت تأثیر قرار نداده‌است.

## برای مطالعهٔ بیشتر
* A5/1 and A5/2
* MISTY1
* SNOW

## منابع

## پیوند به بیرون
* Nathan Keller's homepage

رده:استانداردهای پروژه مشارکتی نسل سوم
رده:رمزنگاری قطعه‌ای شکسته
رده:رمزنگاری‌های فیستل