یک عدد جونیور علاقه مند به حوزه امنیت :)
رمزنگاری مقدماتی : بررسی حملات رمزنگاری
در این مقاله میخوایم انواع حملات رمزنگاری رو بررسی کنیم و ببینیم اساسا چند نوع حمله داریم و چطوری اجرا میشن ؟
این نکته رو من در انتهای این مطلب خیلی باز میکنم ، ولی به صورت کلی بدونید که وقتی اسم حملات رمزنگاری میاد ، ما :
1- از ضعف کلیدی که استفاده شده سوء استفاده میکنیم (یعنی کلید خیلی کوتاهه یا سادست)
2- یا الگریتم رو آنالیز میکنیم و ازش مشکل امنیتی پیدا میکنیم
3- یا روی پیاده سازی الگریتم نقص پیدا میکنیم
پس این سه مورد رو خاطرتون باشه که جلوتر هم میشکافمشون هم میخوایم درک کنیم کدوم حمله به کدوم دسته اختصاص داده میشه
نکته : دقت کنید که هدف ما از حملات رمزنگاری اینه که کلا هرجا به Cipher Text خوردیم ، بتونیم راحت برسیم به Plain Text
امنیت کلید :
برای دسته اول که گفتم بهتون ، فارغ از الگریتم ، ما میریم سراغ KeySpace یا فضای کلیدمون ، برای مثال الگریتم سزار رو بیایید بررسی کنیم :
تو الگریتم سزار اگر حروف رو شیفت یک حرفی روبه جلو بدیم A میشه B ، اگر شیفت سه حرفی بدیم A میشه D ، اگر شیفت 26 حرفی بدیم ، A همون A میشه ، اگر شیفت 27 حرفی بدیم چی؟ A میشه B و با شیفت یک حرفی فرقی نداره :
1 Word Shift : A->B
3 Words Shift : A->D
26 Words Shift : A->A
27 Words Shift : A->B
پس میبینیم که بیشتر از 25 تا نمیتونیم شیفت بدیم ، اینجاست که میرسیم به مفهومی به اسم فضای کلید ، هرچقد فضای کلید ما کمتر باشه ، الگریتم هرچقدرم قوی باشه باز کلید ضعیف باعث میشه CT سریع دیکریپت بشه
فضای کلید ما در الگریتم سزار خیلی کوچیکه و 25 تاست ، و 25 تا حدس بیشتر نیاز نیست که الگریتم ما افشا بشه
(به حمله حدس زدن میگن Brute Force که یکم جلوتر میرسیم بهش)
الگریتم های جدید نسبت به Brute Force مقاومن ، مثلا الگریتم DES از کلید 56 بیتی استفاده میکنه ، دو رو به توان 56 برسونیم میشه :
72057594037927936
72 کوادرلیون احتمال وجود داره که این کلید چی باشه ، اگر بریم سراغ AES 128 بیتی :
340282366920938463463374607431768211456
میتونید بخونیدش؟ الا بریم سراغ AES 256 ، یعنی 2 به توان 256 :
115792089237316195423570985008687907853269984665640564039457
584007913129639936
توجه کنید که کرک کردن کلید 56 بیتی بالا که اشاره کردیم الان خیلی سادست ، کافیه برید یکی از این سایت های VPS Provider و یه سرور گرافیکی بخرید با 64 هسته و بندازیدش به جون این رمز و زیر یک ساعت بهتون جوابتو تحویل میده
حالت های مختلف حملات :
1. Known Plaintext only attack :
این دسته از حمله به این صورته که مهاجم به یک PT و CT نظیرش دسترسی داره ، و میخواد الگریتم و کلیدو کشف کنه
2. Known Ciphertext only attack :
مهاجم فقط به CT یا متن خروجی دسترسی داره و هیچ چیز دیگه ای نمیدونه ، مثلا فقط متن رمزنگاری شده رو میدونه ، نه میدونه کلید چیه نه الگریتم چیه نه PT چیه ، یا مثلا فقط یه هش داره
3. Chosen Plaintext attack :
مثل مورد اوله ولی فرقش اینجاست که مهاجم دسترسی داره که PT خودشو بده و CT مربوطه براش تولید بشه
در اینجا مهاجم به کلید و الگریتم دسترسی داره و با دادن PT خودش ، نتیجه رو آنالیز میکنه که ببینه الگریتم و کلید چطوری روی PT اثر میزارن و CT رو تولید میکنن
4. Chosen Ciphertext attack :
این مورد هم مثل مورد دومه ولی فرقش اینه که یدونه CT دیگه نیست ، تعداد CT ها زیاده و مهاجم میتونه به روشی CT خودشو بسازه
این روش برای حمله به الگریتم های نامتقارن استفاده میشه که کلید عمومی در اختیار هست و مهاجم سعی میکنه به کلید خصوصی برسه
5. Adaptive chosen plaintext/ciphertext attack :
مثلا مورد 3و4 هست و ولی مهاجم میتونه توی رمزنگاری های بلوکی ، مهاجم میتونه PT یا CT خودشو توی هر بلوک انتخاب کنه و نتیجرو ببینه (نسبت به نتایج قبل)
زیاد درگیر اینا نشید و توی سری پیشرفته بیشتر بازشون میکنیم ، ولی بریم یه سری حملات رو ببینیم :
انواع حملات :
- Brute Force Attack
- Dictionary Attack
- Rainbow Table
- Side Channel Attacks
- Fault Injection Attacks
- Timing Attacks
- Birthday Attacks
- Frequency Analysis
1. توی حمله اول یا Brute Force ما با یه CT سروکار داریم که هیچی ازش نمیدونیم و میخوایم بریم سراغ امتحان کردن همه حالت های ممکن که برسیم به PT ، این حمله از دسته اوله (Known Plaintext) و یا گاهی دوم(Known Cipher Text) هست و معمولا نوع اول و یا دوم حملات رو شامل میشه (اکثرا معتقدن نوع اوله )
حمله برو فورس میاد هر ترکیب ممکن رو پیاده میکنه که نتیجه بگیره ، مثلا شما یه قفل قدیمی کیفی دارید که سه تا رقم میگیره که باز بشه ، پس رقم ها از 000 تا 999 میرن و شما باید 1000 تا مورد رو امتحان کنید
این حمله خیلی قویه و درصد احتمال اینکه موفقیت امیز باشه خیلی بالاست ولی خیلی زمان بره
نکات مربوط به Brute Force رو بالاتر توی بخش امنیت کلید گفتم ، یه بار دیگه بخونیدش (با این دیدی که الان دارید ، بیشتر متوجه خواهید شد)
نکته : ی مورد خیلی ریز و مهمی که هست اینه که الگریتم های امروزی درمقابل حملات بروت فورس با کلید قوی مقاومن ، ولــــــی اگر الگریتم بیاد و یه طوری محدویت بزاره برای طول کلید و شما مجبور بشید طول کلید ضعیفی انتخاب کنید ، حملات Brute Force ممکن خواهد بود ، مثال ؟ WEP و حمله ای که بهش میشه
توی بروت فورس ما یه لیست از پسورد داریم که از aa, aaa, aaaa, aaaaa, aaaaaa, bb,bbb و.. گرفته تا اعداد و ارقام و ترکیبات پیشرفته
2. توی حمله دوم یا Dictionary Attack ما بجای اینکه هر چیز ممکنی رو امتحان کنیم ، یکم هوش بخرج میدیم و کلماتی که احتمالش هست رو امتحان میکنیم
مثلا اگر پسورد اکانت کسی رو میخوایم کرک کنیم میریم سراغ اسمش ، فامیلیش ، تاریخ تولدش، شمارش و.. و یه لیستی میسازیم که احتمال استفاده شدن ازش بیشتر باشه
توی این روش ما یه لیست اینطوری داریم : ali, ali918,alighaemi و...
چون انسان موجودی فراموش کاره پس احتمال زیاد از کلماتی استفاده میکنه که بیشتر یادش میمونه ، مثل اسم فامیلی کد ملی شماره تلفن و .. پس استفاده از اینا احتمال موفقیت امیز بودن حمله رو بیشتر میکنه
3. قبل حمله سوم که Rainbow Table هست بگم که ما یه Pre Computed Table هم داریم ، به این صورته که وقتی میخوایم ببینیم مقدار یه Hash چقدره یا اصطلاحا هشو کرک کنیم (Crack) و بهش حمله کنیم ، میاییم و یه لیست اماده میکنیم ، حالا چه از روش Brute Force چه از روش Dictionary و تک تک ایتمای اون لیستو با الگریتم مورد نظر هش میگیریم و در انتها میاییم اون هشی که میخواستیم کرک کنیم رو توی لیست سرچ میکنیم ببینیم متن نظیرش تو لیست چی هست ، قبلا هم اشاره کردم تو این سری و یه سری سایت هم هستن که این کارو برای ما میکنن
آمـــــــا ، توی این روش ما میاییم چیکار میکنیم ؟ فرض کنیم ما یه کلمه داریم و از اون رسیدیم به یه هشی ، مثلا چی؟ مثلا این کلمه : virgool و از این کلمه با MD5 هش میگیریم که میشه :
889c91ac0c322f57248b7dc1d93af971
حالا میاییم و از 5 کاراکتر اولش جدا هش میگیریم ، یعنی از "889c9" جدا هش میگیریم که میشه :
fc50cbf06d495182fa0a66f7795977e2
دوباره از 5 کاراکتر اول این هش جدید هش میگیریم و همینطور ادامه میدیم ، اینطوری یه Pre Computed Table انگار ساختیم ولی به وسیله روش Brute Force و این روش اگر انجام بشه ، ما لیست هش بسیار جامعی از تمامی عبارات رندوم داریم
4 . حمله چهارم یا Side Channel Attack که یک حمله بسیار مبتکرانست ، روشش به چه صورته ؟
من یه بار اینو با یه مثال توضیح دادم تو این سری ، فرض کنید شما میخواید هندونه بخرید ، روش اصولی اینکه مطمئن بشید این هندونه خیلی شیرینه و خوبه چیه؟ اینه که قاچش کنید و بچشیدش ، ولی شما نمیتونید همه هندونه هارو تو مغازه باز کنید و اگر شیرین نبود نخرید، بجاش چیکار میکنید؟ هندونه رو میگیرید دستتون و چند تا ضربه میزنید که ببینید چقد سنگینه ، اگر سنگین تر باشه و صدا پوکی نده یعنی بهتره ، به رگه هاش نگاه میکنید اگر سبز نباشه رسیده است ، و.. ما همین روشو برای الگریتم های رمزنگاری هم انجام میدیم
وقتی یک برنامه با یک الگریتم رمزنگاری و یه کلید ، میاد یه PT رو میکنه CT ، یک مقدار Cycle سیپیو مصرف میکنه ، یه زمان خاصی صرف میکنه و... و محققا فهمیدن که اگر مثلا الگریتم DES باشه 10 سایکل سیپیو مصرف میشه و اگر مثلا AES باشه 12 سایکل ، اگر طول کلید زیر 8 تا باشه مثلا 5 ثانیه طول میکشه ، اگر بالای 8 باشه ، 10 ثانیه طول میکشه و... پس اینطوری اگر آنالیز بکنن میفهمن که الگریتم چی بوده و یا طول کلید چقد بوده ، حالا شاید بگید خب این به چه دردی میخوره؟ یه سری اطلاعات ناقص چه کمکی میکنه ؟
اگر تعداد حملات کانال جانبی یا Side Channel زیاد باشه میتونیم مثل یه حمله واقعی در نظرش بگیریم و میتونه باعث لیکیج کلید یا PT بشه
5 . حمله Fault Injection به این صورته که ما میاییم و به اون دستگاهی که داره عملیات رمزنگاری رو انجام میده (معمولا قطعات سخت افزاری) ولتاژ بالا یا پایین میدیم ، یا دما رو بالا و پایین میکنیم و چیز های شبیه این که باعث بشه اون دستگاه عملکرد خودشو از دست بده و رمزنگاری رو ناقص یا اشتباه انجام بده یا Leakage یا نشتی داشته باشه
6. حمله Timing دقیقا همون مفهومیه که تو Side Channel توضیحش دادم ، گفتم یکی از کار هایی که تو کانال جانبی میکنیم سنجیدن زمانه ، اگر روی این مبحث حرفه ای وارد بشیم و خیلی زمان بزاریم ، میشه Timing Attack که ما روی زمان بندی انجام کار ها خیلی تمرکز میکنیم (اگر به مفاهیم سیستم عامل مسلط باشید ، ما مفهوم کوانتوم داریم که میشه 15 میلی ثانیه ، تایم های سیپیو و کرنل به میلی ثانیه سنجیده میشه و خیلی ریزه)
7. میریم سراغ حمله تاریخ تولد یا Birthday Attack ، اگر یادتونه باشه توی این مقاله مفهوم لونه کبوتر رو بررسی کردم ، این هم همونه تقریبا
حمله تاریخ تولد خیلی سادست ، فرض کنید ما یه اتاق داریم که 23 نفر توشن ، با احتمال تقریبا بیشتر از 50% دونفر توی این اتاق تاریخ تولدشون یکیه (ماه و روز)؛ نکته این حمله اینطوریه که ما باید احتمال هر دو نفر از این 23 نفر رو بررسی کنیم ، نه احتمال یک نفر خاص در مقابل همه
توی یه اتاق ما 23 نفر داریم ، یعنی یک کاندیدا و 22 شانس ، اگر کاندیدای ما اسمش محمد باشه و تاریخ تولدش با 22 تای دیگه یکی نباشه ، از اتاق میره بیرون ، میمونه 21 شانس و یک کاندیدا دیگه ،و همینطور روند چک کردن رو ادامه میدیم و اگر مچ نبود میرن بیرون
برای محاسبه چیکار میکنیم؟ 22 +21+20+19+18...+2+1 که میشه 253 جفت ، حالا هر جفت به احتمال 1 از 365 تاریخ تولدش با نفر بعدی یکیه (یک روز از سال ، یعنی یک روز و یک ماه خاص)
{اگر یکم ریاضیشو بخوام براتون بگم اینطوریه که ما 365 روز سال داریم ، اگر بخوایم احتمال اینکه دو نفر تاریخ تولد یکسان رو به اشتراک نگذارند رو بررسی کنیم 364/365 هست (سال کبیسته رو در نظر نگیریم) و اگر یه گروه n نفره داشته باشیم ، احتمال اینکه هیچ کدوم از اونا تاریخ تولد یکسان نداشته باشن میشه :
و تو احتمالات بخوایم برعکس احتمال یه چیزیو بگیریم ، 1 رو منهای اون میکنیم ، پس 1 منهای نتیجه این میشه احتمال اینکه دونفر تاریخ تولد یکسان داشته باشن ، حالا اگر ما 253 جفت داشته باشیم (یعنی 23 نفر)}
زیاد درگیر ریاضیات این حمله نشید ، فقط بدونید که این حمله برای کشف Collision توی الگریتم های Hashing استفاده میشه که توی این مقاله باهم بررسی کردیم مفهوم سادشو
8 . این مورد که مورد آخر هست و میشه گفت یه جورایی جزو Side Channel محسوب میشه ، بحث Frequency Analysis هست ، حمله تحلیل فرکانسی سعی میکنه پترن یا الگو رو بشناسه و با تکرار الگو در CT پی ببره به یه سری چیز ها در PT ، مثلا اگر ما زبان انگلیسی رو مبنا قرار بدیم ، یه سری حروف خیلی رایج داره مثل E, T, O, A, I , N و اگر شما در CT حرفی مثل X رو ببینی احتمال خیلی زیاد الگریتم شیفت حروف بوده و امده E رو جایگزین کرده با X ، یا مثلا یه سری حروف در زبان انگلیسی به هم میچسبن مثل HE - SHE -THE US و.. که شما اگر در CT ببینید دو یا سه کاراکتر خیلی تکرار میشه ، میتونید مشکوک بشید که ممکنه یکی از این ترکیب ها استفاده شده باشه ، پس یه جورایی PT احتمالی رو بدست میارید
نکته : ما همیشه یه الاکلنگی داریم بین افزایش قدرت الگریتم و طول کلید و سرعت رمزنگاری و منابع مصرفی ، از طرفی ما هرچی بخوایم امنیت داشته باشیم باید محاسبات بیشتر داشته باشیم و زمان کمتر و هرچه بخوایم اینو کمتر کنیم ، خب امنیتو از دست میدیم
نکته بعد اینه که چه زمانی یه الگریتم منسوخ میشه ؟ معمولا ساخت الگریتم رمزنگاری و تستش سال ها طول میکشه و چون بر اساس قواعد انکار ناپذیر ریاضیه ، از بین نمیرن ، اگر طراحی شون درست و اصولی باشه معمولا خیلی سال طول میکشه که کنار گذاشته بشن ، معمولا هم دلیلش ممکنه این باشه که سرعت پردازش زیاد بشه و کرک اون الگریتم با اون کلید مخصوص سریع تر بشه یا یه مشکل تو الگریتم کشف بشه و باعث لیکیج دیتا بشه که کنار گذاشته بشه ، پس الگریتم ها اینطوری نیستن که هر سال جدید ترشون بیاد و یا زود منقضی بشن
حملات به کاربر ها و پیاده سازی الگریتم ها :
اکثر اوقات مهاجمان خیلی دانش فنی و یا وقت ندارن که الگریتمی که به الگریتمی حمله کنن که چندین سال امنیتش بررسی شده + کلید قوی و پیچیده ای هم درش استفاده شده ؛ پس بجاش میان به پیاده سازی و کاربر ها حمله میکنن تا کار خودشونو انجام بدن
یک سری نکات که برای پیاده سازی ممکنه رعایت نشه و امنیت رو به خطر بندازه :
- بعد از استفاده از PT حتما از بین ببریمش
- از دیتا Decrypt شده به خوبی محافظت نشه (چه توی پوشه tmp چه توی Memory ، چه توی Variable ها)
- سیستم هایی که از بیش از یک کلید استفاده میکنن باید از تمامی کلیداشون به یه اندازه محافظت کنن ، چون اگر امنیت یک کلید هم به خطر بیفته ، کلی دردسر ساز میشه و ممکنه امنیت کل سیستم به خطر بیفته
- ریکاوری کلید های قدیمی و ذخیره اون ها هم ممکنه دردسر ساز بشه
مهاجمین ممکنه سراغ پسورد کاربر ها هم برن ، کاربر ها یا اغلب پسورد ساده میزنن که میشه با بروت فورس و دیکشنری از خجالتشون درآمد ، یا پسورد سخت میزارن که به سختی ممکنه یادشون بمونه
و یا پسورد سخت و متفاوت میزارن برای همه سایتاشون که اصلا یادشون نمیمونه
(حالا اگر توی یه سازمانی باشید که Password Complexity براش مهم باشه که همه مجبورن پسورد سخت بزارن)
پس یا روی ورقه کاغذی یا یه فایل متنی ساده این پسوردو مینویسن ، یا توی چتی یا مخاطبین یا پیامک ها ذخیره اش میکنن یا اگر خیلی حرفه ای باشن میرن سراغ Password Manager
برای دزدیدن این پسورد ها میرن سراغ حملات مختلف پسورد ، مثلا از کیلاگر استفاده میکنن یا مثلا پسورد رو دامپ کنن و کرک کنن و یا ازش استفاده کنن برای دسترسی به کامپیوتر های دیگه و .... اوووه انقدر روش زیاده که نگو
یا مثلا وقتی دیتابیسی از یه سایت لیک میشه و پسورد ها در میاد ، اون پسورد ها خودشون یه پسورد لیست خوب حساب میشن ، حالا اگر بریم سراغ ایمیل ها و یا نام های کاربری ای که لیک شده و اونو روی سایت های دیگه تست کنیم میبینیم که بلههه روی چندین سایت موفقیت آمیز بود ، یا این پسورد رو یه نفر دیگه هم ممکنه انتخاب کرده باشه و ....
بعضی جاها هم ممکنه از Certificate استفاده کنن بجای پسورد ، اگر این Certificate لو بره جریان چیه ؟ از CA رو بزنن چی؟
نکته ای که باید مد نظر داشته باشید اینه که بعضی از حملات شبکه ای که ما روی رمزنگاری و مخصوصا بخش احراز هویت داریم ، جزو حملات رمزنگاری نیست ، مثلا حملات Replay و یا دامپ و کرک پسورد از فایل Shadow یا SAM و... این ها اکثرا همون مفاهیمیه که توضیح دادیم و چیز خاص و جدیدی نیست و اصولا جزو رمزنگاری محسوب نمیشه که بخواید درکش کنید
در اینجا حملات مربوط به رمزنگاری تموم شده ولی یه بخش اعظمی که میشه حملات روی پسورد ، حملات روی احراز هویت و حملات روی الگریتم ها و.. رو من توی سری حملات و امنیت در رمزنگاری (اگر بشه) به طور مفصل باز میکنم براتون ، مثلا حملات روی پسورد های ویندوز و حملات شبکه ای یا PTH-OPTH-PTT-Replay و...که جزو اتک های حرفه ای حساب میشن رو میزاریم توی سری پیشرفته کامل بازش میکنیم ، چون خیلی پیش نیاز داره و باید بریم سراغ LSASS - NTLM -LM - KERBEROS و.. و بعد حملاتشون (این ها چون ربط مستقیم به رمزنگاری ندارن ، زود منتشر نمیشن و اولویت با خود رمزنگاریه)
یه دسته دیگه هم میمونه که حملات سمت الگریتم هایی مثل SSL-TLS و.. هست و حملاتی مثل Hash Length Extension - Padding Oracle - Bit Filliping و.. (که این رو زودتر از همه میزنیم)
دسته سومم میشن حملات روی Authentication سمت ویندوز و یا سمت وب و... (این هم زیاد ربط به رمزنگاری نداره ولی دوستان زحمتشو میکشن :) )
و طبیعتا توی سری حملات و امنیت و یا سری پیشرفته ما مباحثی مثل اینکه چگونه از این الگریتم های برای کارهای مخرب استفاده میشه مثل Ransomware و یا C2 Data Exfiltration رو بررسی میکنیم که شما موقع تجزیه و تحلیل بدافزار بتونید اون الگریتم هارو شناسایی کنید و مشکلی تو این زمینه نداشته باشید
ولی دیدی که اینجا گرفتید خیلی توی درک اون ها بهتون کمک میکنه
قسمت بعدی یه جمع بندی مختصر از مهم ترین مطالب این سریه و تماااااام
سوال یا ابهام یا انتقادی بود در خدمتم، یاعلی ;)
مطلبی دیگر از این انتشارات
رمزنگاری مقدماتی :رمزنگاری منحنی بیضوی یا Elliptic-Curve
مطلبی دیگر از این انتشارات
رمزنگاری مقدماتی : مرور و جمع بندی
مطلبی دیگر از این انتشارات
رمزنگاری مقدماتی : Password Storage - Salt - Pepper