بلوفیش

**بلوفیش** (Blowfish) یک شیوه رمزنگاری بر پایه استفاده از کلید رمز و یک رمزگذاری قطعه‌ای متقارن است که در سال ۱۹۹۳ توسط بروس اشنایر طراحی و در بسیاری از مجموعه‌های رمزنگاریی و محصولات رمزگذاری گنجانده شد. بلوفیش نرخ رمزگذاری خوبی را در نرم‌افزار ارائه می‌دهد و تا امروز هیچ تحلیل رمز موثری بر روی آن پیدا نشده‌است. با این حال، استاندارد رمزگذاری پیشرفته (AES) امروزه بیشتر مورد توجه‌است.
شینر بلوفیش را به عنوان یک الگوریتم همه منظوره به عنوان جایگزینی عاری از مشکل و محدودیت‌های برقراری ارتباط با الگوریتم‌های دیگر، برای استاندارد رمزنگاری داده‌ها قدیمی طراحی کرد. زمانی که بلوفیش منتشر شد بسیاری از طرح‌های دیگر گرفتار قانون ثبت اختراع بودند یا جز اسرار تجاری-دولتی محسوب می‌شدند. شینر اعلام کرد که، "بلوفیش ثبت نشده‌است، و در تمام کشورها این گونه باقی خواهد ماند. بدینوسیله الگوریتم در مالکیت عمومی قرار می‌گیرد و توسط هرکسی می‌تواند آزادانه استفاده شود."
خصوصیات قابل توجه این طراحی شامل کلید- وابسته به s-box و یک زمانبند کلید بسیار پیچیده‌است.

## الگوریتم
دی‌ای‌اس (DES) یکی از پرکاربردترین الگوریتم‌های رمزنگاری. آخرین طراحی از یک ماشین یک میلیون دلاری که توانست کلید دی‌ای‌اس را تنها در ۳٫۵ ساعت بازیابی کند تنها آنچه را که همگان می‌دانستند بیان کرد: اندازه کلید دی‌ای‌اس برای امروز بسیار کوچک است.
دنیا تنها به این دلیل نسبتاً به دی‌ای‌اس اطمینان دارد که توانست از بررسی ان‌اس‌ای جان سالم بدر ببرد. متخصصان از این جهت به دی‌ای‌اس اطمینان دارند که یک استاندارد منتشر شده‌است، و همچنین توانسته‌است طی ۲۰ سال از تحلیل رمزهای شدید رمزگذاران در سراسر جهان نجات پیدا کند. دنیای رمزنگاری این چنین است: میزان اعتماد به یک الگوریتم هنگامی افزایش می‌یابد که هر گروه از پی گروه دیگر برای شکستن آن تلاش کنند و شکست بخورند.

کاندیدهای جایگزینی مدام در حال ظهروند اما هیچ نتوانسته‌اند توجه زیادی را به خود جلب کنند. دی‌ای‌اس سه‌گانه (3DES) رویکردی محافظه کارانه دارد؛ IDEA(که در PGP به کار رفته‌است) نویدبخش‌ترین الگوریتم جدید است. همچنین دسته‌ای از الگوریتم‌های ثبت نشده‌ای که در حال اجرا هستند: RC4 (در ابتدا یک راز تجاری شرکت امنیت داده RSA بود اما اکنون در اینترنت در دسترس عموم قرار دارد)، SAFER، و بلوفیش.

### شرح بلوفیش
بلوفیش یک رمزنگاری قطعه‌ای است که داده‌ها در فطعه‌های ۸ بایتی رمز می‌کند. الگوریتم شامل دو بخش است: یک بخش بسط کلید و یک بخش رمزگذاری داده. بسط کلید یک کلید با طول متغیر و حداکثر ۵۶ بایت (۴۴۸بیت) را به آرایه‌ای از چندین زیرکلید مجموعاً ۴۱۶۸بایت، تبدیل می‌کند
بلوفیش 16 دور دارد. هر دور شامل یک جایگشت وابسته به کلید، و یک جانشانی وابسته به کلید و داده‌است. تمامی عملگرها XORها و جمع‌هایی هستند که بر روی کلمات ۳۲ بیتی اعمال می‌شوند. تنها عملگر اضافی چهار آرایه شاخص دار جستجوی داده در هر دور است.
طول قطعه در بلوفیش 64 بیت و طول کلید از ۳۲ بیت تا ۴۴۸ بیت متغیر است. این روش یک رمزنگاری فیستل ۱۶ دوره‌است و از کلید بزرگی وابسته به s-box استفاده می‌کند. در ساختار شبیه CAST-128 است که از s-box ثابت استفاده می‌کند.

### زیرکلید
بندانگشتی|چپ|200px|ساختار بلوفیش فیستل.
بلوفیش از تعداد زیادی زیرکلید استفاده می‌کند. این کلیدها باید پیش از هرگونه رمزگذاری یا رمزگشایی محاسبه شوند. آرایه پی شامل ۱۸تا زیرکلید ۳۲بیتی است: P1، P2،... ،P18. همچنین چهار S-box سی و دو بیتی با ۲۵۶ عضو در هرکدام وجود دارد: S1,0، S1,1،... ، S1,255؛S2,0، S2,1،.... ، S2,255؛ S3,0، S3,1،.... ، S3,255؛ S4,0، S4,1،.... ، S4,255.

#### تولید زیرکلید
زیرکلیدهای محاسبه شده از الگوریتم بلوفیش استفاده می‌کنند:
۱. ابتدا P-array و پس از آن چهار S-box به ترتیب، با یک رشته ثابت مقداردهی می‌شوند. این رشته شامل ارقام هگزادسیمال عدد پی: P1 = 0x243f6a88, P2 = 0x85a308d3, P3 = 0x13198a2e, P4 = 0x03707344, الی آخر.
2. P1 را با ۳۲ بیت اول کلید یای مانعةالجمع می‌کنیم، P2 را با ۳۲ بیت دوم، و همین‌طور تا آخر برای تمام بیت‌های کلید (احتمالاً تا P14). مکرراً بین بیت‌های کلید می‌چرخیم تا تمام عناصر آرایه پی (P-array) با بیت‌های کلید یای مانعةالجمع (XOR) شده شوند. (برای هر کلید کوتاه، حداقل یک کلید بلندتر هم ارز وجود دارد؛ برای مثال، اگر A یک کلید ۶۴ بیتی باشد، آنگاه AA, AAA و… کلیدهای هم ارز هستند)
۳. رشته‌های تمام صفر را با الگوریتم بلوفیش با استفاده از زیرکلیدهای شرح داده شده در مراحل ۱ و ۲، رمزگذاری می‌کنیم.
۴. P1 و P2 را با خروجی‌های مرحله ۳ معاوضه می‌کنیم.
۵. خروجی مرحله ۳ را با استفاده از الگوریتم بلوفیش با زیرکلیدهای اصلاح شده رمزگذاری می‌کنیم.
۶. P3 و P4 را با خروجی مرحله ۵ معاوضه می‌کنیم.
۷. عملیات را آنقدر ادامه می‌دهیم تا تمام عناصر آرایه پی و پس از آن به ترتیب تمام چهار تا S-box با خروجی مدام در حال تغییر الگوریتم بلوفیش، معاوضه شده باشند.
به‌طور کلی ۵۲۱ تکرار لازم است تا تمام زیرکلیدهای لازم تولید شوند. برنامه‌های کاربردی می‌توانند به جای اجرای چندین باره این فرایند اشتقاقی، کلیدهای را ذخیره کنند
شکل مقابل نحوه عمل بلوفیش را نمایش می‌دهد. هر خط نشان دهنده ۳۲ بیت است. الگوریتم دو آرایه از زیرکلیدها را نگه می‌دارد: یک آرایه پی با ۱۸ ورودی و چهار S-box با ۲۵۶ ورودی. s-boxها ۸ بیت به عنوان ورودی دریافت می‌کنند و ۳۲ بیت خروجی تولید می‌کنند. در هر دور یکی از اعضای آرایه پی استفاده می‌شود، و پس از دور آخر، هر نیمه قطعه با یکی از دو عضو باقی‌مانده‌استفاده نشده از اعضای p، یای مانعةالجمع (XOR) می‌شوند.
شکل بالا سمت چپ تابع فیستل بلوفیش را نشان می‌دهد. تابع ۳۲ بیت ورودی را به چهار قسمت ۸ بیتی تقسیم می‌کند، و سپس یک چهارم‌ها را به عنوان ورودی s-boxها استفاده می‌کند. خروجی‌ها به هم نهشتی ۲^۳۲ اضافه می‌شوند و برای تولید ۳۲بیت خروجی نهایی XOR می‌گردند.

## رمزگذاری و رمزگشایی
بلوفیش 16 دور دارد. ورودی یک عنصر داده ۶۴ بیتی به نام xاست. x به دو نیمه ۳۲بیتی تقسیم می‌شود: xL، xR. سپس برای i = ۱ تا ۱۶:
xL = xL XOR Pi	
xR = F(xL) XOR xR
Swap xL and xR
پس از دور شانزدهم، : xL و xR دوباره تعویض می‌شوند تا آخرین تعویض بی‌اثر شود. سپس مقادیر xR = xR XOR P17 و xL = xL XOR P18 محاسبه می‌شوند. در آخر xL و xR با هم یکی می‌شوند تا متن رمز شده بدست آید.
تابع F چیزی شبیه این است: xL به چهار قسمت ۸بیتی شکسته می‌شود: a، b، c و d. آنگاه،
F(xL) = ((S1,a + S2,b mod 232) XOR S3,c) + S4,d mod 232
رمزگشایی دقیقاً مانند رمزگذاری است، با این تفاوت که P1، P2،... ،P18 به ترتیب معکوس استفاده می‌شوند

## تحلیل رمز بلوفیش
هیچ تحلیل رمز موثری تا سال ۲۰۱۱ بر روی نسخه تمام دور بلوفیش وجود نداشت. یک خطای Sign extension در کد C منتشر شده شناخته شده‌است.

در سال ۱۹۹۶ سرج وادنی (Serge Vaudenay) حمله‌ای با استفاده از متن آشکار معلوم پیدا کرد که برای شکستن رمز به 2^(8r+1) متن آشکار معلوم نیاز داشت، که در آن r تعدا دورها است. علاوه بر این، او کلاسی از کلیدهای ضعیف را شناسایی کرد. برای برخی از کلیدهای ضعیف که S-boxهای ضعیفی تولید می‌کنند(شانس بدست آوردن آن‌ها به‌طور تصادفی ۱ در ۲^۱۴ است)، حمله‌ای مشابه نیازمند تنها 24r+1 متن آشکار انتخاب شده‌است تا بتواند آرایه پی را بازسازی کند(یادآوری می‌کنیم که فرض بر این است که S-boxها مشخص هستند). بدون مشخص بودن S-boxها، این حمله تنها می‌تواند تشخیص دهد که یک کلید ضعیف در حال استفاده‌است، اما نمی‌تواند مشخص کند که چیست (نه S-boxها و آرایه پی و نه خود کلید). این حمله تنها علیه نوع‌هایی با تعداد دور پایین کاربرد دارد؛ این حمله در برابر بلوفیش با ۱۶ دور کاملاً بی‌اثر است.

وینسنت رایمن در پایان‌نامه دکترای خویش، یک حمله دیفرانسیلی مرتبه دوم را معرفی کرد که تنها می‌توانست چهار دور را بشکند و نه بیشتر. تا امروز هیچ راهی برای شکستن ۱۶-دور تمام شناخته نشده مگر جستجوی جامع!
جان کلسی حمله‌ای را طراحی کرد که می‌توانست ۳-دور بلوفیش را بشکند اما قادر نبود آن را بسط دهد
ویکرا سینگ چابرا به راه‌های مؤثر برای پیاده‌سازی ماشین جستجوی آزمون جامع روی آورده بود.

سرج وادنی به بررسی یک نوع ساده از بلوفیش پرداخت که در آن S-box مشخص و مستقل از کلید بود. در این حالت یک حمله تفاضلی می‌تواند آرایه پی را با انتخاب 28r+1 متن آشکار بازسازی کند (r تعداد دورها است). این حمله برای بلوفیش با ۸ دور و بیشتر غیرممکن است، زیرا متون آشکار بیشتر از آنچه که یک رمزنگار قطعه‌ای ۶۴ بیتی بتواند تولید کند، نیاز دارد.

### نتیجه
هیچ کس تاکنون نتوانسته به ایجاد حمله‌ای که بتواند بلوفیش را بشکند نزدیک هم بشود. با این وجود، تحلیل رمزهای بیشتری پیش از آنکه یک الگوریتم را امن بخوانیم مورد نیاز است.
بروس شینر اشاره می‌کند در حالیکه بلوفیش هنوز مورد استفاده قرار می‌گیرد، اما او توصیه می‌کند از الگوریتم اخیر توفیش (Twofish) به جای آن استفاده شود.

## بلوفیش در عمل
بلوفیش یک رمزنگاری قطعه‌ای سریع محسوب می‌شود، به جز هنگامیکه کلیدها عوض می‌شوند. هر کلید جدید نیازمند پیش-پردازشی است که معادل رمزگذاری یک فایل متنی تقریباً ۴کیلوبایتی است، که نسبت به دیگر رمزنگاری‌های قطعه‌ای بسیار کند است. این مسئله مانع از استفاده آن در برخی از برنامه‌های کاربردی می‌شود، اما در دیگر برنامه‌ها مشکلی نیست. در یک برنامه کاربردی، این یک مزیت به‌شمار می‌آید: روش درهم سازی رمزعبور که در اپن بی‌اس‌دی استفاده می‌شود از الگوریتمی استفاده می‌کند که از بلوفیش مشتق شده‌است که این موضوع سرعت محاسبات کلید را کاهش می‌دهد؛ ایده این کار این است که تلاش‌های اضافی محاسباتی در برابر حمله واژه‌نامه‌ای حفاظت ایجاد می‌کند. *نگاه کنید* به کشش کلید.

بلوفیش تنها ۴کیلوبایت از فضای حافظه دسترسی تصادفی را به خود اختصاص می‌دهد. این محدودیت نه تنها مشکلی برای کامپیوترهای قدیمی و لپ‌تاپ‌ها به حساب نمی‌آید، بلکه آن را برای استفاده در کوچک‌ترین سیستم‌های تعبیه شده ای مانند کارت‌های هوشمند اولیه مناسب می‌کند.

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

## منابع

* ویکی‌پدیای انگلیسی.

* http://www.schneier.com/paper-blowfish-oneyear.html
* http://www.schneier.com/paper-blowfish-fse.html
* http://www.schneier.com/blowfish-bug.txt
* http://www.schneier.com/blowfish.html

رده:رمزنگاری قطعه‌ای
رده:رمزنگاری‌های فیستل
رده:سایفرهای رایگان