1 00:00:00,000 --> 00:00:01,980 باسمه‌ تعالی 2 00:00:01,980 --> 00:00:03,980 شاخه‌ی دانشجویی انجمن رمز دانشگاه صنعتی شریف تقدیم می‌کند 3 00:00:03,980 --> 00:00:13,980 ‫این سخن‌رانی توسط توماس پیچک، شاین دِولین، اَلکس بادوچی و استیو توماس از ماتاسونو ‫در کنفرانس بلک‌هت سال ۲۰۱۴ ارائه شده است. 4 00:00:16,980 --> 00:00:34,980 ‫۶۴ حقه‌ی کوچک که رمزنگاران دوست ندارند شما از آن‌ها مطلع شوید! 5 00:00:35,980 --> 00:00:37,980 ‫با تشکر از حضور شما ... 6 00:00:37,980 --> 00:00:40,500 ارائه را شروع می‌کنیم 7 00:00:40,500 --> 00:00:43,200 در اینجا یک مسئله‌ی سبک را مطرح می‌کنیم 8 00:00:43,500 --> 00:00:46,500 ‫اگر RSA را نمی‌دانید، در اینجا خیلی سریع آن را شرح می‌دهم 9 00:00:46,900 --> 00:00:51,500 در این مسئله هر یک از طرفین یک کلید عمومی و یک کلید خصوصی دارند 10 00:00:52,500 --> 00:01:05,000 ‫کلیدِ عمومی ترکیب یک عدد صحیح یا ماژول n و یک توان عمومیِ e است؛ ‫و کلید خصوصی ترکیب ماژول n و عدد مخفیِ d می‌باشد. 11 00:01:05,500 --> 00:01:08,500 بنابراین رمزگذاری و رمزگشایی به سادگی انجام می‌شود 12 00:01:08,500 --> 00:01:14,500 ‫وقتی که می‌خواهیم یک عبارت را رمزگذاری کنیم، ‫متن ساده که همان عدد p است را به توان عمومی می‌رسانیم، ‫سپس از آن نسبت به n باقی‌مانده می‌گیریم. 13 00:01:14,500 --> 00:01:21,150 ‫‫برای رمزگشایی پیام، عبارت رمزشده به توان عدد صحیحِ مخفیِ d می‌رسد ‫و سپس از آن نسبت به n باقی‌مانده گرفته می‌شود. 14 00:01:21,150 --> 00:01:26,150 ‫باید انتخاب کنیم که از چه عددی برای توانِ e استفاده می‌کنیم. 15 00:01:26,150 --> 00:01:31,150 ‫و از آن‌جایی که عبارت به توان رساندن را انجام می‌دهیم، ‫ترجیح می‌دهیم عدد کوچک‌تری باشد که سریع‌تر انجام شود، 16 00:01:31,150 --> 00:01:33,150 ‫کمی بهینه‌تر باشد؛ 17 00:01:33,150 --> 00:01:37,150 ‫اما مشکلاتی در انتخاب اعداد کوچکِ e وجود دارد؛ 18 00:01:37,150 --> 00:01:44,150 ‫به طور مثال با انتخاب عدد ۳ برای e؛ ‫حملات همه‌پخشی یا حملات ریشه‌ی اعداد مکعب (توانِ ۳) محتمل است. 19 00:01:44,150 --> 00:01:48,150 ‫خب نگاهی به پروژه‌ی SaltStack ‫(پروژه‌ی متن‌باز مبتنی بر زبان پایتون برای مدیریت کارگزارها از راه دور) می‌اندازیم؛ 20 00:01:48,150 --> 00:01:54,150 ‫این پروژه جایگزین پروژه‌های Puppet و Ansible است ‫که به ما اجازه می‌دهد از راه دور در کارگزارهای خود فرمان اجرا کنیم. 21 00:01:54,150 --> 00:01:58,150 ‫و به جای استفاده از SSH در این پروژه از RSA استفاده شده است. 22 00:01:58,150 --> 00:02:03,150 ‫کسی می‌تواند مشکل اصلی آن‌ها در پیاده‌سازیِ RSA این پروژه را ببیند؟ 23 00:02:03,150 --> 00:02:10,150 ‫[مشکل خیلی بدیهی است] ‫اگر متوجه مشکل می‌شوید لطفاً دست خودتان را بالا بگیرید! 24 00:02:11,150 --> 00:02:17,150 این پروژه از تاثیرگذارترین توان عمومی RSA (عدد e) ‫استفاده می‌کند! 25 00:02:17,150 --> 00:02:19,150 ‫که عدد ۱ است! 26 00:02:19,150 --> 00:02:23,150 ‫جالب است که پاسخ توسعه‌دهندگان این پروژه در مورد گزارش این مشکل این بود: 27 00:02:23,150 --> 00:02:29,150 ‫«نگران نباشید، ‫کلید عمومی ما یک نیست، ما فقط از توان عمومیِ یک استفاده کرده‌ایم!» 28 00:02:29,150 --> 00:02:40,150 ‫خب همان‌طور که می‌بینید در فرمول RSA پیام به توان عدد e می‌رسد؛ ‫اگر این توان یک باشد، RSA بسیار سریع است!!! 29 00:02:40,150 --> 00:02:42,150 ‫خیلی کارآمد!!! 30 00:02:42,150 --> 00:02:48,150 ‫بهتر است بگوییم که استفاده از توان صفر ‫‫در عمل بسیار کارآمدتر از توان یک خواهد بود!!! 31 00:02:48,000 --> 00:02:53,150 بنابراین انگیزه‌ی اصلی این سخنرانی این است که به این نتیجه برسیم 32 00:02:52,150 --> 00:02:56,850 ‫هیچ‌ فردی نیست که رمزنگاری را پیاده‌سازی کند ‫و آن را به صورت صحیح متوجه شده باشد 33 00:02:57,000 --> 00:02:59,999 آسیب‌پذیری‌های خیلی خیلی زیادی در این حوزه وجود دارد 34 00:03:00,150 --> 00:03:05,150 اگر فرصت داشتید و مباحث این سخن‌رانی را از بین تمام سخن‌رانی‌ها به خاطر سپردید 35 00:03:05,150 --> 00:03:07,150 به مباحث مربوط به این آسیب‌پذیری‌ها در فروم‌ها سری بزنید 36 00:03:07,150 --> 00:03:10,150 می‌بیند که منابع زیادی در مورد هر یک از این آسیب‌پذیری‌ها وجود دارد 37 00:03:10,400 --> 00:03:13,100 خیلی مباحث فوق‌العاده‌ای که در این فوروم‌ها وجود دارد 38 00:03:15,150 --> 00:03:18,150 ما قصد داریم برخی از این مباحث را مرور کنیم 39 00:03:20,150 --> 00:03:02,150 جزییات زیادی در این سخن‌رانی وجود دارد و به همین دلیل خیلی سریع صحبت می‌کنیم 40 00:03:22,150 --> 00:03:24,150 چون فقط پنجاه دقیقه فرصت داریم 41 00:03:25,150 --> 00:03:28,150 با همین سرعت تا انتهای سخن‌رانی صحبت می‌کنم 42 00:03:31,150 --> 00:03:39,150 ‫شما قرار نیست بعد از این سخن‌رانی ‫یاد بگیرید چگونه از آسیب‌پذیری پدینگ اوراکلِ RSA سوء‌استفاده کنید ولی من می‌توانم به شما نشان دهم که حملات چقدر سرراست هستند 43 00:03:39,150 --> 00:03:42,150 و به شما این انگیزه را بدهم که خودتان از این پس دنبال این مسائل باشید 44 00:03:42,400 --> 00:03:43,900 و به شما می‌گوییم که چگونه حتی این کار را برای شما ساده‌تر کرده‌ایم 45 00:03:45,150 --> 00:03:51,500 اجازه دهید ریاضیات شما را درگیر خودش کند؛ مثل شعری در دنیای ناامنی 46 00:03:49,150 --> 00:03:57,150 ‫بنابراین به ما اعتماد کنید که این مسائل ساده‌تر از چیزی هست که به نظر می‌رسد!! 47 00:03:56,150 --> 00:04:06,150 ‫قبل از این‌که شروع کنیم چون در این سخن‌رانی جزییات زیادی از حملات ‫و چالش‌های رمزنگاری را بیان می‌کنیم؛ شما به یک پیش‌زمینه‌هایی نیاز دارید. 48 00:04:06,150 --> 00:04:12,150 ‫عملیات ویژه‌ی رمزنگاری مثل فیلد، گروه و رینگ‌ها و جبر خطی و سایر موارد. 49 00:04:12,150 --> 00:04:15,150 خب اینجا در عمل می‌گم که به چه چیزهایی احتیاج داریم 50 00:04:15,150 --> 00:04:19,150 ‫خب فعلاً قید این موارد را می‌زنیم! 51 00:04:19,150 --> 00:04:20,150 هیچ‌کدام 52 00:04:20,150 --> 00:04:24,150 این مشکلی است که مردم خجالت می‌کشند رمزنگاری را فرا بگیرند 53 00:04:24,150 --> 00:04:26,150 آن‌ها درگیر جزییات می‌شوند 54 00:04:29,150 --> 00:04:35,150 ما در این جا تقریباً همه‌ی حملاتی که در چالش‌های ماتاسانو کشف کرده‌ایم را بیان می‌کنیم 55 00:04:35,150 --> 00:04:36,150 هیچ یک از آن‌ها نیازی به این مباحث تئوری ندارند 56 00:04:36,950 --> 00:04:41,150 ‫حتی در واقع می‌گوییم که راه صحیح یادگیری تئوری‌ها این است که ‫ابتدا کد حملات را پیاده‌سازی کنید. 57 00:04:41,150 --> 00:04:43,150 تا مباحث تئوری برای شما معنی پیدا کند 58 00:04:44,150 --> 00:04:49,150 داستان ما این است که ما متوجه شدیم در کشفِ ‫آسیب‌پذیری‌های رمزنگاری خیلی توانمند شده‌ایم. 59 00:04:49,150 --> 00:04:54,150 ‫همان‌طور که قبلاً هم گفتم اگر به دنبال آسیب‌پذیری‌های رمزنگاری در ‫پروژه‌ها نباشید، آسیب‌پذیری‌های خیلی خیلی جالبی را از دست می‌دهید. 60 00:04:54,150 --> 00:04:57,150 به همین دلیل یکی از هم‌تیمی‌های من این پرونده‌ی متنی را نوشت 61 00:04:57,150 --> 00:05:00,150 که شامل یک سری تمرین‌های رمزنگاری بود 62 00:05:00,150 --> 00:05:05,150 ‫به همین دلیل در نهایت ما یک مجموعه‌ی خیلی خوب ‫از آسیب‌پذیری‌های رمزنگاری داشتیم 63 00:05:05,400 --> 00:05:07,900 و فکر کردیم که یک پست وبلاگ خیلی خوب می‌شود 64 00:05:06,150 --> 00:05:10,900 به همین دلیل تصمیم گرفتیم راهی برای به اشتراک‌گذاری آن‌ها پیدا کنیم 65 00:05:09,900 --> 00:05:15,350 من یک مشکلی داشتم که متن کامل را در اینتنرت منتشر کنیم 66 00:05:16,400 --> 00:05:18,900 من یک خوددرگیری داشتم :) 67 00:05:21,150 --> 00:05:25,650 که معتاد به این هستم که برنده‌ی بحث‌های توییتری باشم 68 00:05:25,900 --> 00:05:35,400 مشکل اساسی که داشتم این هست که افرادی هستند که در صورت بحث نمی‌توانم از ادبیات خودم استفاده کنم 69 00:05:14,150 --> 00:05:17,150 ترجیح می‌دادم که اگر قرار هست آن‌ها به راحتی مباحث را یاد بگیرند باید بدانند که معنی آ‌ن‌ها چیست 70 00:05:43,150 --> 00:05:46,150 ‫در واقع اگر افراد می‌خواهند این تمرینات را درک کنند ‫بهتر است خودشان درک کنند تا اینکه به آن‌ها توضیح دهم 71 00:05:46,150 --> 00:05:48,150 خب ما یک راه حل داشتیم 72 00:05:48,150 --> 00:05:52,150 ر‫اه‌حلی که ما از استفاده کردیم این بود که ‫بدون درگیری با افراد آن‌ها را درگیر کنیم 73 00:05:54,150 --> 00:05:58,150 ‫ما این چالش‌ها را در ۸ مجموعه مرتب کردیم 74 00:05:58,750 --> 00:06:03,150 و اگر فردی به ما ایمیل ارسال می‌کرد ما مجموعه‌ی اول را به او ارسال می‌کردیم 75 00:06:04,150 --> 00:06:04,150 ولی برای اینکه مجموعه‌ی بعدی چالش‌ها را بگیرید 76 00:06:06,150 --> 00:06:10,150 باید برای ما کدهایی که برای سوء‌استفاده از آسیب‌پذیری چالش‌ها استفاده ‫کرده بودید را ارسال می‌کردید 77 00:06:10,150 --> 00:06:14,150 بعد از دریافت پاسخ‌ها چالش‌ها را بازنگری می‌کردیم 78 00:06:14,150 --> 00:06:16,150 اغلب به جذابیت آن‌ها می‌افزودیم 79 00:06:16,150 --> 00:06:22,150 و اینکه درک کردیم بهترین راه یادگیری رمزنگاری این است که درگیر کد آسیب‌پذیری شوید 80 00:06:24,150 --> 00:06:27,150 و اینکه بیش‌تر افراد این روش را پسندیدند 81 00:06:27,150 --> 00:06:29,150 اغلب همه‌‌ی کد را خودشان می‌نوشتند 82 00:06:31,150 --> 00:06:46,150 ‫‫اتفاقی افتاد این بود که یک بلاگر (اگر نمی‌شناسید Pinboard) ‫‫که یک بلاگر خیلی خوب و یک برنامه‌نویس عالی است، در مورد حل ‫این چالش‌ها یک پست نوشت. 83 00:06:48,150 --> 00:06:50,150 ‫البته این بهترین اسکرین‌شات نیست، 84 00:06:50,150 --> 00:06:52,150 ولی یک اسکرین‌شات قدیمی از سایت هکر نیوز است 85 00:06:52,150 --> 00:06:54,150 که خیلی افراد از آن بازدید کردند 86 00:06:54,150 --> 00:06:58,150 و در نهایت تعداد زیادی شرکت‌کننده در این چالش‌ها شرکت کردند 87 00:06:58,150 --> 00:07:00,150 خیلی بیش‌تر از انتظارمان 88 00:07:00,150 --> 00:07:04,150 قبل از پست وبلاگ این فرد مشهور، ما همه چیز رو به صورت دستی انجام می‌دادیم مردم برای ما ایمیل ارسال می‌کردند و سایر مراحل طی می‌شد 89 00:07:09,150 --> 00:07:11,150 و ناگهان بیش از ده هزار شرکت‌کننده به حل چالش‌ها مشغول بودند 90 00:07:11,150 --> 00:07:13,150 افرادی که این چالش‌ها را حل می‌کردند بسیار متنوع بودند 91 00:07:14,150 --> 00:07:17,150 و از زبان‌های برنامه‌نویسی متنوعی استفاده می‌کردند 92 00:07:17,150 --> 00:07:29,150 همان‌طور که می‌بینید یک فهرست بالا به پایین از زبان‌های برنامه‌نویسی مورد استفاده وجود دارد 93 00:07:28,150 --> 00:07:31,150 پایتون در ابتدای فهرست است با نزدیک به پنجاه درصد 94 00:07:31,150 --> 00:07:36,150 و سپس گلنگ و روبی در رده‌ی دوم و سوم هستند 95 00:07:36,150 --> 00:07:44,150 عده‌ی کم‌تری از زبان‌های سنتی و شی‌گرا استفاده کرده‌اند 96 00:07:44,150 --> 00:07:48,150 البته بسیاری از افراد با یک زبان جدید چالش‌ها را حل کردند 97 00:07:48,150 --> 00:07:52,150 بنابراین اگر می‌خواهید زبان جدیدی فرا بگیرید این چالش‌ها یک راه خوب است 98 00:07:52,150 --> 00:07:56,150 اطلاعات خوبی هست که چه کسانی زبان جدید را شروع کردند 99 00:07:56,150 --> 00:07:58,150 چه کسانی خسته شدند 100 00:07:58,150 --> 00:08:00,150 چه کسانی تا انتها ادامه دادند 101 00:08:00,150 --> 00:08:02,150 از چه زبان‌های عجیبی استفاده شده بود 102 00:08:04,400 --> 00:08:08,900 خیلی از افراد چالش‌ها را تمام نکردند 103 00:08:08,150 --> 00:08:09,650 حدس می‌زنم چون به اندازه‌ی کافی با محیط آشنا نبودند 104 00:08:09,900 --> 00:08:11,400 می‌خواهم سراغ مطالب عجیب‌تری بروم 105 00:08:17,150 --> 00:08:22,150 کمی خواندنش سخت است فهرست این زبان‌های برنامه‌نویسی خیلی خیلی طولانی هست 106 00:08:22,150 --> 00:08:26,150 خب ما یک مجموعه‌ی کامل از پاسخ‌ها به ازای هر زبان برنامه‌نویسی داریم 107 00:08:26,150 --> 00:08:29,150 هر زبانی که در این فهرست هست یعنی یک نفر با این زبان چالش‌ها را تمام کرده است 108 00:08:29,150 --> 00:08:31,150 که واقعا تاثیرگذار است که بتوانیم آن‌ها را منتشر کنیم 109 00:08:36,150 --> 00:08:42,150 خب بهتر است اکسل را هم فراموش نکنیم که یک پاسخ از آن داشتیم 110 00:08:42,150 --> 00:08:46,150 ‫یک پاسخ مربوط به آسیب‌پذیری AES 111 00:08:46,150 --> 00:08:50,150 ‫وقتی می‌گوییم اکسل منظورمان اسکریپت VB نیست 112 00:08:50,150 --> 00:08:59,150 ‫منظورمان جداول و سلول‌ها است که یک نفر چالش AES را با آن حل کرده است 113 00:08:59,150 --> 00:09:04,150 این عالیه، جالب‌ترین بخش است 114 00:09:05,150 --> 00:09:20,150 یک پرونده‌ی پست‌اسکریپت به نوعی نقاشی هست که همه‌ی جداول در آن تعبیه شده است 115 00:09:21,150 --> 00:09:30,150 خب زبان‌های عجیبی بودند اما جاوااسکریپت برای رمزنگاری خیلی عجیب است 116 00:09:33,150 --> 00:09:40,150 کریپتوکت برنامه‌ای که از ابزار رمزنگاری کاربردی استفاده می‌کند 117 00:09:40,150 --> 00:09:42,150 و اینکه گربه هم وجود دارد 118 00:09:43,150 --> 00:09:46,150 ‫گربه در این نرم‌افزار خیلی مهم است!! 119 00:09:46,150 --> 00:09:57,150 ‫خب کریپتوکت یک نرم‌افزار پیام‌رسانی مدرن است که روشی جدید‌تر از رمزنگاری PGP ارائه می‌کند در عمل برنامه‌ای است که از رمزنگاری استفاده‌ی کاربردی می‌کند 120 00:09:59,150 --> 00:10:08,150 ‫‫خب چیزی که این‌جا می‌خواهیم بحث کنیم این است که این نرم‌افزار ‫از رمزنگاری منحنی‌های بیضوی و دیفی‌هلمن برای اشتراک کلید استفاده می‌کند. 121 00:10:08,150 --> 00:10:13,150 حالا می‌خواهیم توضیح دهیم که چه چیزی را اشتباه انجام داده‌اند 122 00:10:15,150 --> 00:10:19,150 در حال حاضر شما می‌توانید کلیدعمومی را بشکنید 123 00:10:19,150 --> 00:10:22,150 و گفت‌و‌گوی رمز‌شده را رمزگشایی کنید 124 00:10:22,150 --> 00:10:24,150 کمی توضیح بدهیم که چگونه 125 00:10:26,150 --> 00:10:30,150 خب جالب است که نگاهی به دوره‌های زمانی اینجا داشته باشیم 126 00:10:30,150 --> 00:10:34,150 ‫ماه مه سال ۲۰۱۲ تا ژوئن ۲۰۱۳ 127 00:10:33,150 --> 00:10:40,150 ‫البته در این بازه اتفاقات زیادی افتاده است؛ آلبومی از یک خواننده منتشر شده، مسائل زیادی در دنیای سیاست رخ داد 128 00:10:42,150 --> 00:10:43,150 یکی از اتفاقاتی که در این دوره در حال رخ دادن بود 129 00:10:43,150 --> 00:10:48,150 تصویر رمزنگاری از اسنودن است اگر می‌توانید ببینید البته نمی‌دانم رزولشن آن چطوری است 130 00:10:51,150 --> 00:10:55,150 خب داستان اسنودن در حال اتفاق افتادن بود 131 00:10:55,150 --> 00:11:02,150 ‫شاید براتون سوال شده که اسنودن که به این گربه‌ها برای امنیت ارتباطاتش اعتماد نکرده بود (برای ارسال داده‌هایی در مورد اینکه چه چیزهایی در حال رخ دادن بود) 132 00:11:08,150 --> 00:11:10,150 زمانش دقیقاً مشخص نیست 133 00:11:10,150 --> 00:11:21,150 اما از ابتدای ژوئن و شاید کمی قبل‌تر این رمزنگاری شکسته شده بود 134 00:11:21,150 --> 00:11:32,150 ‫در این زمان رمزنگاری OTR به دلایلی در دست‌رس نبود و به همین دلیل ‫از کریپتوکت برای کارایی بهتر استفاده شده بود 135 00:11:32,150 --> 00:11:34,150 بنابراین از لحاظ زمان‌بندی واقعاً موقعیت خوبی بوده است 136 00:11:34,150 --> 00:11:36,150 البته ابتدای ژوئن زمان عرضه‌ی وصله برای رفع مشکل است 137 00:11:36,150 --> 00:11:38,150 بنابراین مدتی قبل از آن 138 00:11:38,400 --> 00:11:39,900 سوم ژوئن زمان عرضه‌ی وصله بوده است 139 00:11:42,150 --> 00:11:47,150 مدتی قبل ازاینکه فایرفاکس وصله دهد، مدتی قبل از اینکه اثبات شود 140 00:11:47,150 --> 00:11:55,150 نزدیک به دو هفته بعد از سوم ژوئن که وصله اعمال شد 141 00:11:55,150 --> 00:12:05,150 ‫و اینکه آیا NSA در این بازه کریپتوکت را شنود کرده است یا خیر ... آن‌ها می‌توانستند این گفت‌و‌گوها را رمزگشایی کنند 142 00:12:05,400 --> 00:12:06,900 یک مشکلی وجود داشت 143 00:12:08,150 --> 00:12:15,550 این در واقع دیفی‌هلمن قدیمی است و برای قبل از مهاجرت به منحنی‌های بیضوی است 144 00:12:15,800 --> 00:12:17,300 این کد مربوط به قبل از تغییر به دیفی‌هلمن منحنی‌های بیضوی بوده است 145 00:12:20,150 --> 00:12:27,150 آن‌ها مشغول تغییر اندازه‌ی کلید خصوصی بودند 146 00:12:27,150 --> 00:12:29,150 ‫اول عدد را از ۶۴ تغییر دادند 147 00:12:29,150 --> 00:12:32,150 ‫سپس آن را مجددا به ۳۲ کاهش داده‌اند 148 00:12:32,400 --> 00:12:34,900 که در واقع قبل شکستن است استفاده از ۳۲ باعث شکست‌پذیری بوده است 149 00:12:40,150 --> 00:12:45,150 البته در بخش‌‌های بعدی می‌بینیم که علت چیست و می‌توانیم آن را تا ۱۶ کاهش دهیم 150 00:12:45,400 --> 00:12:48,900 و بعد تغییر ۳۲ به ۲۶ را داریم 151 00:12:40,150 --> 00:12:56,150 ‫ولی در توضیحات کد آن‌ها گفته بودند که این تغییرات مربوط به کارایی است. 152 00:12:56,150 --> 00:13:02,150 ‫ما کلید را کوچک می‌کنیم تا ببینیم این کارایی تا کجا بهتر می‌شود 153 00:13:02,150 --> 00:13:04,150 ‫تغییر ۲۶ به ۲۴!! 154 00:13:04,150 --> 00:13:06,150 خب برای این روشن‌تر شود بهتر است اضافه کنیم 155 00:13:06,150 --> 00:13:13,150 وقتی می‌گوییم قابل شکستن است یعنی چه کاری می‌توان برای شکستن کرد؟ 156 00:13:20,150 --> 00:13:24,150 خب دقیقاً برای این را نمی‌دانم 157 00:13:28,400 --> 00:13:29,900 این بخش جالبی است 158 00:13:40,150 --> 00:13:50,650 اینجا مشخص هست که آن‌ها به جای استفاده از اعداد صحیح ۱۵ بیتی از نوع ده‌دهی استفاده کرده‌اند 159 00:13:50,900 --> 00:13:54,400 بنابراین در عمل فضای کلید را کوچک کرده‌اند 160 00:14:00,150 --> 00:14:07,150 خب این نمودار قدرت کلید در طول زمان است 161 00:14:08,150 --> 00:14:10,150 چه زمانی گزارش تو در آن اعمال شده؟ 162 00:14:10,150 --> 00:14:12,150 زمانی که نمودار در بالاترین نقطه است 163 00:14:12,150 --> 00:14:14,150 خب مشخص است که در این دوره گاهی کمی بهتر شده 164 00:14:14,150 --> 00:14:18,150 اما در یک دوره‌ی طولانی که همین خط افقی قرمز است 165 00:14:25,150 --> 00:14:35,150 کریپتوکت ناامن بوده و دیفی‌هلمن مورد استفاده قابل شکستن می‌باشد 166 00:14:35,150 --> 00:14:45,150 ‫البته یک پرشی اینجا قابل مشاهده است که در آن بازه کریپتو‌کت ‫گفته بود این مشکل از ما نیست؛ در واقع پس از گزارش آسیب‌پذیری 167 00:15:05,150 --> 00:15:07,150 خب حمله‌ی مورد نظر برای سوء‌استفاده از این آسیب‌پذیری 168 00:15:07,150 --> 00:15:10,150 ‫حمله‌ی گام بزرگ- گام کوچک است 169 00:15:12,150 --> 00:15:14,150 البته این فقط شبه کد حمله است 170 00:15:18,150 --> 00:15:20,150 در عمل شما نصف بیت‌ها را با صفر مقداردهی می‌کنید 171 00:15:19,150 --> 00:15:23,150 و باقی آن‌ها را با یک عددگذاری می‌کنید 172 00:15:23,150 --> 00:15:27,150 همه‌ی کلیدها را می‌سازید و آن‌ها را در دیسک ذخیره می‌کنید 173 00:15:27,150 --> 00:15:27,150 وقتی می‌خواهید کلید را بشکنید 174 00:15:29,150 --> 00:15:32,150 از نصف باقی بیت‌ها که از آن‌ها استفاده نمی‌کردید 175 00:15:34,150 --> 00:15:38,150 کلید عمومی را می‌گیرید 176 00:15:38,150 --> 00:15:40,150 از کلید خصوصی که ساخته‌اید کم می‌کنید 177 00:15:45,150 --> 00:15:55,150 خب واضح است که این حمله‌ی کلاسیک برای شکستن دیفی‌هلمن در اینجا کافی است 178 00:15:55,150 --> 00:16:02,150 مهم‌تر از اینکه بفهمید کد چطوری کار می‌کند این است که بدانید کد خیلی کوتاه است 179 00:16:02,150 --> 00:16:04,150 خیلی خیلی ساده و خیلی کلاسیک برای شکستن این رمزنگاری 180 00:16:04,150 --> 00:16:09,150 خب از همین‌جا برای یک چالش رمزنگاری ایده آمده است که 181 00:16:09,150 --> 00:16:15,150 این حمله در آن استفاده می‌شود 182 00:16:30,400 --> 00:16:40,900 اساساً استفاده از یک هارد SSD و هشت فیلتر بلوم بزرگ و ... 183 00:16:43,150 --> 00:16:48,650 البته کد دمویی وجود دارد 184 00:16:50,900 --> 00:16:59,300 در این حالت به جای اینکه حمله چند صد ثانیه طول بکشد فقط ۲۵۰ ثانیه زمان برده است 185 00:17:00,150 --> 00:17:07,150 در واقع مشکل کریپتوکت مشکل ساده‌ای بود 186 00:17:10,150 --> 00:17:13,150 و یک دقیقه طول می‌کشید که پیام‌های کریپتوکت شکسته شود 187 00:17:15,150 --> 00:17:17,150 چند ثانیه، من معذرت می‌خواهم که کدت رو زیر سوال بردم 188 00:17:17,150 --> 00:17:19,150 چند ثانیه طول می‌کشد که پیام‌های کریپتوکت رمزگشایی شود به دلیلِ 189 00:17:19,150 --> 00:17:21,150 آسیب‌پذیری‌های کریپتوکت 190 00:17:21,150 --> 00:17:23,150 و البته این تنها آسیب‌پذیری این نرم‌افزار نیست 191 00:17:23,150 --> 00:17:25,150 خب چیزی که در چالش‌ها از آن استفاده می‌کنیم این است که 192 00:17:25,150 --> 00:17:30,150 درگیر کد این نرم‌افزار که تعداد زیادی کاربر از آن استفاده می‌کنند شوید 193 00:17:30,150 --> 00:17:32,150 و تلاش کنید آسیب‌پذیری‌های آن را پیدا کنید 194 00:17:32,150 --> 00:17:37,150 [فهرست آسیب‌پذیری‌ها در اسلاید مشخص است] 195 00:17:31,150 --> 00:17:39,150 ساده‌ترین آن‌ها فقط نیازمند تغییر چند بیت است 196 00:17:42,150 --> 00:17:48,150 و در نهایت اینکه چالش‌های جذابی از آن‌ها درمی‌آید 197 00:17:50,150 --> 00:17:52,150 خب الان از الکس می‌خواهم در مورد چالش‌های خودمان صحبت کند 198 00:17:56,150 --> 00:17:59,150 مجموعه‌ی اولی که برای چالش‌های رمزنگاری مورد استفاده قرار گرفته است 199 00:18:00,800 --> 00:18:03,150 چند تابع پایه‌ای که در اسلاید مشخص است 200 00:18:03,150 --> 00:18:04,150 XOR 201 00:18:04,150 --> 00:18:06,150 ‫تکرار XOR 202 00:18:06,150 --> 00:18:08,150 و سایر توابع که از آن‌ها برای حل چالش‌ها بهره خواهید برد 203 00:18:10,150 --> 00:18:14,150 ای مجموعه بیش‌تر برای این است که ثابت کنید می‌توانید برنامه‌نویسی کنید 204 00:18:14,150 --> 00:18:18,150 و اینکه ببنید می‌توانید با زبان چالش‌ها کنار بیایید و ادامه دهید 205 00:18:18,180 --> 00:18:25,150 مجموعه‌ی اول برای خود من سخت‌ترین بود که تکرار کلید دو هفته طول کشید 206 00:18:27,150 --> 00:18:32,150 خب اینجا چند نفر چالش‌ها را به پایان رسانده‌اند؟ چند نفر آن‌ها را شروع کرده‌اند؟ 207 00:18:35,150 --> 00:18:39,150 در مجموعه‌ی اول فقط یک چالش نیازمندِ دقت بیش‌تر مورد نیاز است 208 00:18:39,150 --> 00:18:43,150 که کمی به دانش آکادمیک نیاز دارد و مربوط به تکرار کلید است 209 00:18:43,150 --> 00:18:46,150 هم‌چنین برای حل چالش‌های بعدی مورد نیاز است 210 00:18:48,150 --> 00:18:53,150 در دسته‌ی دوم چالش‌ها کمی سخت‌تر می‌شود در مورد حملات علیه رمزنگاری‌های قطعه‌ای 211 00:18:53,150 --> 00:18:55,150 حملات خوبی در این مجموعه موجود است 212 00:18:58,150 --> 00:18:59,800 ‫این مجموعه‌ی ۲ چند چالش ECB دارد 213 00:19:00,050 --> 00:19:01,550 214 00:19:02,150 --> 00:19:06,150 به هر حال در همین مجموعه با حملات واقعی براساس رمزنگاری قطعه‌ای 215 00:19:06,150 --> 00:19:11,150 علیه نرم‌افزار‌های موجود آشنا می‌شوید 216 00:19:12,150 --> 00:19:14,150 مجموعه‌ی سوم باز هم چالش‌های بیش‌تر رمزنگاری قطعه‌ای است 217 00:19:14,300 --> 00:19:16,150 ‫به همراه حملات معروف علیه پدینگ CBC 218 00:19:17,150 --> 00:19:23,150 [فهرست سایر حملات هم در اسلاید می‌باشد] 219 00:19:23,150 --> 00:19:25,150 خب اینجا به حملات رمزنگاری جریانی رسیده‌ایم 220 00:19:35,150 --> 00:19:39,150 در خط آخر هم می‌بیند که در هر دسته چه تعداد شرکت‌کننده چالش‌ها را تمام کرده‌اند 221 00:19:39,150 --> 00:19:41,150 تقریبا هزار نفر مجموعه‌ی اول را تمام کرده‌اند 222 00:19:41,150 --> 00:19:43,150 احتمالاً نزدیک به پانصد نفر مجموعه‌ی دوم را تمام کرده‌اند 223 00:19:45,150 --> 00:19:55,150 ‫در مجموعه‌ی چهارم چالش‌های بیش‌تری در مودِ CTR ‫ و معرفی توابع درهم‌سازی، حملات علیه طول رشته‌ی درهم‌سازی و … 224 00:19:55,150 --> 00:19:59,150 ‫در مورد حملات CTR در کنفرانس چند سال پیش هم صحبت شده است به همین دلیل اینجا صحبت نمی‌کنیم 225 00:20:05,150 --> 00:20:12,150 ‫چون مود CTR مهم‌ترین مود در رمزنگاری قطعه‌ای است 226 00:20:01,400 --> 00:20:04,900 و اینکه CTR راهی برای تبدیل رمزنگاری قطعه‌ای به جریانی هست 227 00:20:08,150 --> 00:20:14,650 228 00:20:19,150 --> 00:20:22,150 در مجموعه‌ی پنجم رمزنگاری کلید عمومی 229 00:20:22,150 --> 00:20:24,150 دیفی‌هلمن 230 00:20:24,150 --> 00:20:26,150 ‫[سایر موارد که در اسلاید موجود است] 231 00:20:26,400 --> 00:20:27,900 و چند چالش جالب RSA 232 00:20:27,950 --> 00:20:28,900 گردآوری شده است 233 00:20:33,150 --> 00:20:38,150 ‫‫در مجموعه‌ی ششم چالش‌های مربوط به کلید عمومی را ادامه داده‌ایم؛ 234 00:20:38,150 --> 00:20:42,150 ‫تعدادی چالش مربوط به رمزنگاری DSA داریم 235 00:20:42,150 --> 00:20:44,150 ‫و در نهایت پدینگ اوراکل RSA را داریم 236 00:20:44,150 --> 00:20:49,150 ‫یکی از حملات معروف Daniel Bleichenbacher در سال ۱۹۹۸ روی SSL 237 00:20:49,150 --> 00:20:52,150 این یکی حمله‌ی خیلی جذاب است 238 00:20:54,400 --> 00:20:56,200 و هنوز هم حملاتی مشابه آن کشف می‌شود 239 00:20:56,500 --> 00:20:59,200 که شما می‌توانید در رمزنگاری سطح اپلیکیشن آن را شناسایی کنید 240 00:20:59,450 --> 00:21:06,950 برای کسانی که با پدینگ اوراکل آشنا هستند این شبیه به یک حمله‌ی بازیابی متن ساده است 241 00:21:07,200 --> 00:21:08,700 مهاجم قطعه کدی رمزشده دارد 242 00:21:08,950 --> 00:21:11,450 و می‌تواند ارتباطی با کارگزاری که قادر به رمزگشایی است داشته باشد 243 00:21:11,700 --> 00:21:14,200 اگر مهاجم بتواند رمزگشایی را شناسایی کند 244 00:21:14,450 --> 00:21:21,950 مهاجم به اندازه‌ی کافی اطلاعات دارد تا با کنار هم قرار دادن آن‌ها، متن اصلی را بازیابی کند 245 00:21:21,990 --> 00:21:21,990 خب می‌بینید که این حمله در دنیای واقعی هم وجود دارد 246 00:21:23,990 --> 00:21:23,990 و یکی از گام‌های تست نفوذ هم می‌تواند باشد 247 00:21:25,990 --> 00:21:31,990 مثال واضح آن یک شرکت پرداخت است که به مشتریان خود نرم‌فزار داده است 248 00:21:30,990 --> 00:21:35,500 ‫تصور کنید که ‫مشتریان می‌توانند شماره‌ی کارت‌های اعتباری خود را با RSA رمز کنند 249 00:21:35,500 --> 00:21:41,500 و فرآیند رمز RSA سمت مشتری اتفاق می‌افتد 250 00:21:41,500 --> 00:21:43,500 و سپس متن رمز‌شده به سمت کارگزار پردازش پرداخت ارسال می‌شود 251 00:21:43,500 --> 00:21:48,500 خب تصور کنید مهاجم موفق به ضبط این شماره‌های اعتباری رمزشده شود 252 00:21:47,500 --> 00:21:52,500 خب چیزی که به ذهن می‌رسد این است که شماره‌های کارت اعتباری کوچک هستند 253 00:21:54,500 --> 00:21:59,600 ‫در عمل ترکیبی از RSA و رمزنگاری قطعه‌ای استفاده می‌شود 254 00:21:59,500 --> 00:22:07,500 همین کوچک بودن و طول ثابت داشتن باعث می‌شود عملیات رمزنگاری مستقیم صورت بگیرد 255 00:21:59,500 --> 00:22:14,500 که در نهایت رمزنگاری به این شکل آن‌ها را دچار آسیب‌پذیری می‌کند 256 00:22:16,500 --> 00:22:21,500 ‫برای اینکه کمی با پدینگ RSA با جزییات بیش‌تری آشنا شویم 257 00:22:21,750 --> 00:22:24,250 پدینگ RSA در واقع برای امنیت ضروری است 258 00:22:24,500 --> 00:22:30,000 وقتی پدینگ را در مودهای دیگر رمزنگاری استفاده می‌کنیم به طور خاص در رمزنگاری متقارن 259 00:22:30,250 --> 00:22:33,750 به نظر می‌رسد اغلب از این پدینگ اجتناب می‌شود 260 00:22:34,000 --> 00:22:36,500 طوری که به نظر می‌رسد برای رمزنگاری جریانی اصلاً پدینگ لازم نیست 261 00:22:36,750 --> 00:22:38,250 ‫اما برای RSA در واقع ضروری است 262 00:22:38,500 --> 00:22:48,000 ‫در عمل رمزنگاری RSA برای یک متن خام به راحتی بدون پدینگ قابل شکستن است 263 00:22:48,250 --> 00:22:52,750 ‫‪تمرینی در مجموعه‌ی ۶ وجود دارد که پیام‌های پد نشده‌ی RSA باید شکسته شود 264 00:22:53,000 --> 00:22:58,500 همان‌طور که در اول بحث هم نشان دادیم روش RSA بسیار ساده است و در عمل به توان رساندن است که پیام را رمز می‌کند 265 00:22:58,750 --> 00:23:15,250 به نحوی این روش فریبنده است یعنی هر فردی مثل برنامه‌نویس جاوااسکریپت فکر می‌کند با کمی عملیات ریاضی یک پیام رمزشده دارد در همین جا متوقف می‌شوند 266 00:23:13,500 --> 00:23:15,000 و تصور می‌کنند که فناوری لازم برای کار با RSA را دارند 267 00:23:15,500 --> 00:23:19,000 شما خواهید دید که پیاده‌سازی‌های RSA پد نشده در دنیای واقعی وجود دارد 268 00:23:19,250 --> 00:23:24,650 و می‌بینید که آسیب‌پذیری پیچیده‌تر می‌شود و در اینجا حتی RSA پد شده را هم خواهیم شکست 269 00:23:24,900 --> 00:23:30,400 یکی از دوستان ما به نام Nate Lawson که سه چهارم از چالش‌های ما را حل کرده است و رمزنگار قابلی است 270 00:23:30,900 --> 00:23:33,400 می‌گوید که نباید پدینگ در RSA را اصلا پدینگ بگوییم 271 00:23:34,650 --> 00:23:37,150 در رمزنگاری قطعه‌ای تلاش می‌کنیم تا حد ممکن از پدینگ اجتناب کنیم 272 00:23:37,400 --> 00:23:40,900 رمزنگاران در واقع این را ترجیح می‌دهند که از مود CTR به جای CBC استفاده کنند 273 00:23:41,150 --> 00:23:42,650 چون در مورد CBC به پدینگ احتیاج داریم ولی در CTR احتیاج نداریم 274 00:23:42,900 --> 00:23:44,400 در رمزنگاری قطعه‌ای می‌خواهیم از پدینگ (مجزا) اجتناب کنیم 275 00:23:44,650 --> 00:23:46,150 در رمزنگاری RSA اینطور نیست در RSA باید پدینگ را روش زره‌پوشی این الگوریتم گوییم 276 00:23:46,400 --> 00:23:52,900 چون اگر این پدینگ یا زره را از RSA بگیریم دیگر امنیتی برایش باقی نمی‌ماند 277 00:23:53,150 --> 00:23:59,650 چیزی که در اینجا می‌بینیم نحوه‌ی پدینگ پیش‌فرضی است که در اغلب پیاده‌سازی‌ها به کار گرفته می‌شود 278 00:24:00,000 --> 00:24:06,400 البته بهترین پدینگ نیست ولی اگر یک پیاده‌سازی جدید از این رمزنگاری ببینید، این پدینگ احتمالاً به کار گرفته شده است 279 00:24:06,650 --> 00:24:08,150 ... بهتر است توضیح بدهی چگونه این پدینگ کار می کند 280 00:24:08,400 --> 00:24:18,900 روشی که این پدینگ بر اساس آن کار می‌کند این است که تا اندازه‌ی سایز ماژول، ماژول کلید عمومی پدینگ صورت بگیرد 281 00:24:18,400 --> 00:24:24,650 برای این کار با یک بایت پیشتاز شروع می‌کنیم یک بایت به مقدار دو (هر پیام معتبر با ۲ شروع می‌شود) 282 00:24:24,900 --> 00:24:26,900 سپس یک رشته‌ی پدینگ تصادفی داریم 283 00:24:27,150 --> 00:24:30,650 سپس یک بایت دیگر داریم و در انتها پیام اصلی قرار دارد 284 00:24:31,900 --> 00:24:37,400 روش سوء‌استفاده به این صورت است که بایت پیشتاز همیشه مقدار ثابت دو دارد 285 00:24:33,650 --> 00:24:43,400 این مقدار به ما می‌گوید که بازه‌ی پیامی که آن را رمز می‌کنیم به چه چیزی محدود شده است 286 00:24:43,400 --> 00:24:51,100 یادآوری می‌کنم که در اینجا می‌خواهیم یک پدینگ اوراکل را بشکنیم 287 00:24:55,150 --> 00:24:54,650 لطفاً نشان دهید که چه کسانی قبلاً پدینگ CBC که نسبتاً معروف هست را شکسته‌اند؟ 288 00:24:54,900 --> 00:25:07,400 ایده پدینگ اوراکل این هست که یک نرم‌افزاری که پیام‌های رمزشده را می‌گیرد به محض رمزگشایی پیام، پدینگ را بررسی می‌کند 289 00:25:07,650 --> 00:25:10,700 بررسی پدینگ برای این است که مطمئن شود یک پیام معتبر دارد 290 00:25:10,950 --> 00:25:16,450 پدینگ اوراکل زمانی اتفاق می‌افتد که رفتار هدف بسته به اینکه پدینگ معتبر است یا خیر تغییر می‌کند 291 00:25:16,450 --> 00:25:17,900 می‌توانید ببینید که چرا این تغییر رفتار رخ می‌دهد 292 00:25:19,900 --> 00:25:26,400 اگر تلاش کنید پیام را با پدینگ غیرمعتبر نگه دارید یک اِکسپشن می‌گیرید که مبتنی بر قیود زبان‌ برنامه‌نویسی رخ می‌دهد 293 00:25:26,650 --> 00:25:30,150 برای این که تصور کنید یک پیام با پدینگ غیرمعتبر دارید که منجر به خطا شده است، می‌توانید یک برنامه‌ی وب را تصور کنید 294 00:25:31,400 --> 00:25:35,900 بسته به اینکه پدینگ معتبر است یا خبر ممکن است خروجی متفاوتی در وب مشاهده کنید 295 00:25:36,150 --> 00:25:40,650 کاری که می‌خواهیم انجام دهیم این است که فقط همین سیگنال را بررسی کنیم یعنی بررسی کنیم که پدینگ معتبر است یا خیر. 296 00:25:40,900 --> 00:25:45,400 می‌توانید تصور کنید که برای یک نرم‌افزار خیلی راحت است که این خطا را تشخیص دهد 297 00:25:45,650 --> 00:25:53,150 با توضیحات قبلی در پدینگ مورد استفاده در RSA در ابتدا باید بررسی کنیم که پیام با ۲ شروع شده است یا خیر. 298 00:25:55,400 --> 00:26:00,100 این واقعیت برای همه‌ی نرم‌افزار‌هایی که با این نوع پدینگ کار می‌کنند یکسان است 299 00:26:02,350 --> 00:26:04,850 [من نمی‌دونم که چیزی از این اسلاید باقی مانده یا نه] 300 00:26:05,100 --> 00:26:16,600 تنها چیزی که باقی مانده این است که بدانیم پیام بین 20000... تا 2fffff... است 301 00:26:16,850 --> 00:26:22,350 بنابراین ثابت‌ها را به صورت 2B : 3B-1 در نظر می‌گیریم 302 00:26:22,600 --> 00:26:35,100 در رمزنگاری RSA هر پیام به صورت واضح یک عدد صحیح است که در اینجا محدوده‌ی مشخص دارد این صحبت در مورد همه‌ی رمزنگاری‌ها درست نیست ولی در این‌جا واقعاً عدد صحیح است 303 00:26:35,350 --> 00:26:55,850 برای اینکه پدینگ این پیام معتبر باشد، باید با دو شروع شود عدد دوم عدد بسیار بزرگی است و اینکه هر پیام رمزشده باید بین همین دو عدد باشد و امنیت رمزنگاری به خاطر همین بازه تحت تاثیر قرار می‌گیرد 304 00:26:56,100 --> 00:27:25,600 احتمالاً هیچ کس نمی‌دونه این چی هست، این یک نرم‌افزار جبر برای پایه‌ی نهم هست که بچه‌هام با اون بازی می‌کنند و با انیمیشن و غیره سعی داره جبر را آموزش دهد. ‫خب در واقع این همه‌ی ریاضی هست که ماهم بهش احتیاج داریم!!! 305 00:27:25,850 --> 00:27:30,350 [هنوز یک چیز برای گفتن داری] خب این خیلی جالبه و شما به همون نرم‌افزار ریاضی قبلی احتیاج دارید! 306 00:27:45,600 --> 00:27:52,100 [در اسلایدها می‌بینید] متن ساده‌ای به صورت عدد ۳۵۵ داریم و پس از رمزنگاری به عدد ۶۰۹ می‌رسیم 307 00:27:27,600 --> 00:27:45,100 یکی از ویژگی‌های جالب RSA این هست که می‌تونید چند تا پیام رمز‌شده را در هم ضرب کنید و پاسخی را بگیرید که پیام‌ها را قبل از اینکه رمز‌شوند در هم ضرب کرده باشید 308 00:27:52,350 --> 00:27:46,850 به همین صورت متن ساده‌ی ۲ به صورت رمز‌شده تبدیل به ۸ شده است 309 00:27:56,100 --> 00:27:59,600 فرض کنید که می‌خواهیم این اعداد را در هم ضرب کنیم ۶۰۹ * ۸ را به دست می‌آوریم و باقی‌مانده‌ی آن به n را محاسبه می‌کنیم 310 00:27:59,850 --> 00:28:04,350 این همان خروجی را می‌دهد که عدد ۲ را در ۳۵۵ ضرب و سپس آن را رمز کنیم حاصل هر دو ۵۴۸ می‌شود 311 00:28:04,600 --> 00:28:10,100 بنابراین الگوریتم RSA نسبت به ضرب یک‌ریخت (همومورفیک) است 312 00:28:10,350 --> 00:28:16,850 این به ما کمک می‌کنه که عملیات در رمزنگاری را درک کنیم در این نوع رمزنگاری عملیاتی داریم که با ضرب می‌توان چنین نتیجه‌ای گرفت و این خاصیت RSA است. 313 00:28:24,100 --> 00:28:27,600 این ریاضیات پشت RSA است که اینجا می‌خواهیم در مورد آن بحث کنیم. 314 00:28:27,850 --> 00:28:40,350 در این حمله ما یک متن رمز‌شده داریم متن‌ رمزشده ممکن است از هر جایی ضبط شده باشد، مثلاً با دست‌رسی فیزیکی مشاهده شده است 315 00:28:40,600 --> 00:28:43,400 و می‌دانیم که متن ساده پدینگ معتبر دارد 316 00:28:43,650 --> 00:28:53,150 در اینجا می‌خواهیم عدد مجهول s را بیابیم که در متن‌ساده‌ی ما ضرب شود و به عددی برسیم که باز هم پدینگ معتبر دارد. 317 00:28:53,400 --> 00:28:57,900 در این حالت مقداری اطلاعات در مورد متن ساده نشت پیدا می‌کند 318 00:28:58,150 --> 00:29:03,000 و در نهایت ما را هدایت می‌کند که متن ساده را به صورت کامل بازسازی کنیم 319 00:29:03,350 --> 00:29:08,000 چیزی که ما داریم یک پیام رمز‌شده‌ است که به نحوی ضبط شده و یک عدد s اطلاعات ما در مورد این عدد ناقص است 320 00:29:08,300 --> 00:29:13,500 این عدد را در پیام رمز‌شده ضرب می‌کنیم اعداد کوچک مثل ۲ یا ۳ یا ۴ شروع می‌کنیم، عملیات ضرب را انجام می‌دهیم 321 00:29:13,500 --> 00:29:19,500 و عملیات ضرب را تکرار می‌کنیم و پیام ناقص را به سمت کارگزار ارسال می‌کنیم 322 00:29:20,750 --> 00:29:24,250 و بررسی می‌کنیم که پدینگ معتبر شده است یا نه. به این عملیات اوراکل می‌گوییم. 323 00:29:24,500 --> 00:29:30,000 اوراکل می‌گوید اگر در یک پیام رمز‌شده که خودش پدینگ معتبر داشته یک عبارت دیگر را ضرب کنیم باید پدینگ معتبر دریافت کنیم 324 00:29:30,250 --> 00:29:37,100 ریاضیاتی که برای درک این مطلب به آن احتیاج دارید همین است 325 00:29:37,350 --> 00:29:44,850 خط اولی که می‌بینید باقی‌مانده‌ی ضرب دو عدد است که نشان می‌دهد عملیات چقدر ساده است 326 00:29:45,100 --> 00:29:55,600 سمت راست معادله‌ی اول همین روشی است که همیشه استفاده می‌کنیم یعنی هر تعداد از n که موجود است را کم می‌کنیم و باقی مانده را محاسبه می کنیم 327 00:29:55,850 --> 00:30:14,350 سمت چپ معادله همان روش همیشگی است سمت راست معادله دقیقاً همان عملیات ریاضی مشابه است فقط برای توضیح بیش‌تر اینطوری نوشته شده و مطلب جدید نیست 328 00:30:14,600 --> 00:30:25,100 در واقع چون عدد حاصل‌ضرب خیلی بزرگ است به جای اینکه مستقیم باقی‌مانده را حساب کنیم می‌شماریم که چند بار می‌توانیم خود عدد را از آن کم کنیم 329 00:30:25,350 --> 00:30:35,850 تنها مسئله‌ی مهم این است که بدانیم دو طرف این معادله دقیقاً یک چیز است 330 00:30:36,100 --> 00:30:42,600 در بخش پایین هم دوباره همان شیوه تکرار شده و بخش آخر طرف چپ و راست معادله عوض شده است 331 00:30:42,850 --> 00:31:00,350 در اینجا X پیام ناقص رمزشده‌ای است که به ترتیب به ازای اعداد ۲ ۳ ۴ و غیره از کارگزار دریافت می‌کنیم، فقط می‌دانیم که پدینگ آن معتبر است 332 00:31:00,600 --> 00:31:01,800 این مسئله از اینکه می‌دانیم RSA چگونه کار می‌کند برداشت کرده‌ایم. 333 00:31:02,050 --> 00:31:12,550 بنابراین می‌دانیم که با توجه به عدد انتخابی مقدار X باید باقی‌مانده حاصلضرب عدد متن ساده در عدد انتخابی نسبت به ماژول است 334 00:31:12,800 --> 00:31:27,300 در نتیجه خروجی ما به صورت معادله‌ای است که از آن متن ساده و همچنین عدد r را نمی‌دانیم 335 00:31:27,550 --> 00:31:29,050 جبر خطی پایه‌ای 336 00:31:29,550 --> 00:31:37,050 این معادلات را استخراج می‌کنیم و برای پیدا کردن متن ساده آن‌ها را حل می‌کنیم توجه داریم که مقدار r را نداریم 337 00:31:37,300 --> 00:31:57,800 باز هم از جبر خطی ساده به یک معادله برای متن ساده می‌رسیم 338 00:31:58,050 --> 00:32:04,000 به نظر می‌رسد که با این فرمول متن ساده قابل پیدا شدن است البته باز هم مجهولات دیگری داریم 339 00:32:04,250 --> 00:32:06,750 همین کار را برای مجهول r انجام می‌دهیم 340 00:32:07,000 --> 00:32:21,500 می‌خواهیم بداینم ماژول چند بار در حاصلضرب وجود دارد درست مثل معادله‌ی متن ساده از جبر خطی معادله‌ی جدید می‌نویسیم 341 00:32:21,750 --> 00:32:35,250 البته نگاه کردن به فرمول زمان‌گیر است ولی با درک اینکه از کجا به آن رسیدیم می‌توان فهمید چطور کار می‌کند 342 00:32:35,500 --> 00:32:45,000 چیز جالبی که میشه از این مباحث گفت این هست که ما نمی‌دانیم دقیقا متن ساده چه چیزی هست اما اطلاعاتی در مورد محدوده آن داریم چون پدینگ معتبر است پس همان بازه‌ها برای متن ساده وجود دارد 343 00:32:45,250 --> 00:32:50,750 حالا با این اطلاعات می‌توانیم محدوده‌ی مجهولات را کم کنیم 344 00:33:00,000 --> 00:33:09,000 خب همانطور که قابل مشاهده است محدوده‌ی r به عددی بستگی دارد که در مرحله‌ی اول انتخاب می‌کنیم 345 00:33:09,250 --> 00:33:21,000 برای ما مدت زیادی طول کشید که اولین عدد که با موفقیت در این نامعادله جای می‌گیرد را پیدا کنیم 346 00:33:21,250 --> 00:33:25,500 ولی الان می‌تونیم با سرعت خیلی خوبی یک عدد با خروجی موفق پیدا کینم 347 00:33:25,500 --> 00:33:30,500 قبلا ده‌ها هزار یا صدها هزار تلاش برای پیدا کردن اولین عدد لازم داشتیم ولی الان ممکن هست با ده تا تلاش هم به نتیجه برسیم 348 00:33:30,750 --> 00:33:34,250 ولی الآن نزدیک به ۱۰ تلاش لازم است 349 00:33:34,500 --> 00:33:40,300 و هر عدد موفقی که پیدا کنیم می‌توانیم محدوده‌ی پیام خود را کوچک‌تر کنیم 350 00:33:40,550 --> 00:33:45,050 تقریباً در هر مرحله این بازه نصف می‌شود. 351 00:33:49,000 --> 00:33:59,800 دوست دارم روی نکته‌ای تاکید کنم در رمزنگاری مورد بحث ما با اعداد خیلی بزرگی سروکار داریم که تصور بوروت فورس هم نمی‌کنیم درسته؟ 352 00:34:00,050 --> 00:34:13,550 همون‌طور که دیدین بازه‌ی این اعداد هم خیلی بزرگ است و مدت خیلی زیادی طول می‌کشد تا همه‌ی‌ آن‌ها بررسی کنیم 353 00:34:13,800 --> 00:34:33,300 ولی با عملیاتی که ما نشان دادیم در عمل این فضا را با سرعت خیلی زیادی به سمت جلو حرکت می‌دهیم و در هر مرحله پرش داریم و لازم نیست همه‌ی اعداد را بررسی کنیم 354 00:34:33,550 --> 00:34:45,050 شبیه به حرکت به زمان آینده هست و ما چندین میلیون سال جلو می‌افتیم من هم البته مدت دقیقش رو حساب نکردم که هر بار چقدر جلو می‌افتیم 355 00:34:45,300 --> 00:34:53,800 ولی هر بار که این عملیات را انجام می‌دهیم به طور محسوسی فضا کوچک می‌شود 356 00:34:54,050 --> 00:35:12,550 یک دموی کوچک با جست‌و‌جوی خطی با زبان برنامه‌نویسی روبی نمایش داده می‌شود که مشخص شود حمله امکان‌پذیر و کم‌هزینه است این خروجی مربوط به اعدادی بوده است که خروجی موفق داشته‌اند 357 00:35:14,900 --> 00:35:21,050 اگر بایت‌های قرمز را دنبال کنید متوجه می‌شوید که چه مقداری هر بار ضرب می‌شود به صورت بایت به بایت 358 00:35:21,300 --> 00:35:28,800 همین‌طور بایت دو که در ابتدا مشخص می‌شود با رنگ سبز مشخص شده همان بایت پیشتاز است که قبلاً در مورد آن صحبت کردیم 359 00:35:29,050 --> 00:35:40,550 و این صفرهای سبز دوم که پایان پدینگ تصادفی است که توضیح داده شد و بعد از آن پیام ساده‌ی اصلی است 360 00:35:40,800 --> 00:35:50,300 این البته یک روش خطی ساده است و به صورت همزمان کاری انجام نشده اما همان‌طور که می‌بینید به سرع در حال اجرا است 361 00:35:50,550 --> 00:36:00,050 این برای یک کلید ۱۰۲۴ بیتی است و به نظر می‌رسد یک روش قابل اجرا برای استخراج متن ساده از سطح نرم‌افزار باشد 362 00:36:00,300 --> 00:36:09,800 برای مدتی این حمله به حمله‌ی یک میلیونی پیام معروف بود که عبارت میلیون نشان می‌داد که این حمله خیلی قابلیت اجرا ندارد 363 00:36:10,050 --> 00:36:40,550 آسیب‌پذیری در TLS در پدینگ باعث می‌شود رفتار هدف تغییر کند و در کتابخانه‌ی مدرن این آسیب‌پذیری وجود داشته و موفق شده‌اند جندین پیام را رمزگشایی کنند 364 00:36:40,800 --> 00:36:52,300 به هر حال با اینکه اسمش حمله‌ی یک میلیونی هست ما این حمله را در یک آزمون نفوذ وب انجام دادیم 365 00:36:52,550 --> 00:37:00,050 هر بار که بایت‌های قرمز تغییر می‌کنند الگوریتم یک بار انجام و بخشی از پیام رمزگشایی می‌شود و در نهایت می‌توان پیام ساده از کارگزار گرفت 366 00:37:10,300 --> 00:37:20,800 مجموعه سوالات هفتم را تقریباً از یک سال پیش حاضر کردیم که برخی چالش‌های جذاب دارد 367 00:37:21,050 --> 00:37:37,550 [فهرست چالش‌ها در این دسته از اسلاید قابل مشاهده است] 368 00:37:37,400 --> 00:37:40,300 همه‌ی این چالش‌ها احتمالاً در پایان امروز به صورت برخط منتشر می‌شود البته تا قبل از فردا قطعاً منتشر می‌شود 369 00:37:40,550 --> 00:37:45,050 به همراه پاسخ‌ها و در همه‌ی زبان‌های برنامه‌سازی که ما پاسخی از آن دریافت کردیم 370 00:37:45,300 --> 00:37:48,800 در وب‌گاه http://cryptopals.com/ 371 00:37:49,050 --> 00:37:59,550 همه‌ی چالش‌ها و پاسخ‌ها در دسترس است برای حل آن‌ها و یادگیری رمزنگاری اقدام کنید ...از اینجا به بعد کمی سریع‌تر می‌گویم 372 00:37:59,800 --> 00:38:01,300 373 00:38:04,550 --> 00:38:26,050 مجموعه‌ی هشتم آخرین مجموعه‌ای هست که می‌خواهیم آن را انجام دهیم در مجموعه‌هیا قبلی مباحث پایه‌ای را پوشش دادیم در این مجموعه قصد داریم مباحث مربوط به رمزنگاری بیضوی را پوشش دهیم 374 00:38:26,300 --> 00:38:50,800 من خیلی نمي‌خوام دیفی‌هلمن را تشریح کنم ولی این الگوریتم ساده‌ترین روش رمزنگاری کلید عمومی هست می‌توانید با دریافت کدش مثال‌های موجود از این الگوریتم را برررسی کنید 375 00:38:51,050 --> 00:38:58,550 در این رمزنگاری دو طرف ارتباط روی یک عدد اول بزرگ و یک عدد پایه توافق می‌کنند طرفین هر یک عدد مختص خودشان را تولید می‌کنند که کلید خصوصی است 376 00:38:58,800 --> 00:39:13,300 دو طرف عدد پایه را به توان کلید خودشان می‌رسانند و نسبت به اول باقی‌مانده می‌گیرند به این ترتیب کلید عمومی می‌سازند و آن را برای هم ارسال می‌کنند 377 00:39:13,550 --> 00:39:22,050 دو طرف می‌توانند کلیدها را به توان دیگری برسانند و به این ترتیب هر دو روی عدد دیگری توافق کنند این همان روشی که در عمل هم کار می‌کند و برای ما امنیت را می‌آورد 378 00:39:22,300 --> 00:39:29,800 همان روشی که اگر NSA ترافیک ما را کپچر کند می‌تواند کلید را به دست آورد و پیام‌های ما را رمزگشایی کند 379 00:39:30,050 --> 00:39:40,550 برای اینکه یک حسی در مورد خود الگوریتم داشته باشم یک کد سی‌ شارپ رو می‌بینید که نسبتاً کوتاه است 380 00:39:40,800 --> 00:39:48,700 این هم کد گلنگ هست که باز هم کوتاه است و چون نویسنده یک ثابت را در خود کد قرار داده بلند به نظر می‌رسد 381 00:39:48,950 --> 00:39:52,450 Haskell هم که یک زبان تزیینی و جالبیه 382 00:39:52,700 --> 00:40:07,500 زبان برنامه‌نویسی روبی، تقلب نکنید تا کدها رو منتشر کنیم ولی این واقعا پیاده‌سازی دیفی‌هلمن در زبان‌های مورد استفاده است این کد رسمی ما نیست و از کدهای دریافتی هست 383 00:40:07,750 --> 00:40:13,250 مسئله‌ی کمی سخت‌تر پیاده‌سازی دیفی‌هلمن بر پایه‌ی منحنی‌های بیضوی است یعنی الگوریتم همان است ولی کلیدهای خصوصی و عمومی به این صورت تولید شده‌اند 384 00:40:13,500 --> 00:40:18,000 می خواهیم نشان دهیم که چگونه پیاده‌سازی‌های معروفِ دیفی هلمن با منحنی‌های بیضوی قابل شکستن است 385 00:40:18,250 --> 00:40:31,750 حمله‌ی معروف برای این کار حمله به نقاط منحنی است که دو مرحله‌ای می‌باشد مرحله‌ی اول شبیه حملات قبلی است و می‌خواهیم کارگزار را به نحوی وادار کنیم بخش‌هایی از کلید را برای ما منتشر کند 386 00:40:31,000 --> 00:40:34,500 و بعد نشان مي‌دهیم که چگونه تکه‌های کلید را مجدد به هم بچسبانیم 387 00:40:34,750 --> 00:40:49,250 در ابتدا منحنی بیضوی و گروه نقاط مرتبط را توضیح می‌دهم اینکه ساعت چطوری کار می‌کند، اساسا فقط به عمل جمع نیاز داریم 388 00:40:49,500 --> 00:40:56,000 در ابتدا جمع چهار با ده محاسبه می‌شود و نسبت به سیزده باقی‌مانده گرفته می‌شود که می‌شود یک 389 00:40:56,250 --> 00:41:10,750 یک تابع درهمساز جادویی را تصور کنید که نگاشت آن باعث می‌شود بدانیم خود عدد چیست و همچنان این وضعیت ساعت (با ۱۳ عدد) کار می‌کند 390 00:41:11,000 --> 00:41:15,500 بنابراین عبارت درهم‌شده‌ی چهار و ده باز هم می‌شود عبارت درهم‌شده‌ی ده 391 00:41:15,750 --> 00:41:29,250 در نهایت خود منحنی را داریم و عدد P که عدد مولد یا پایه است و هم‌چنین ماژول اول هم داریم 392 00:41:29,500 --> 00:41:53,900 اگر قبلاً دیفی‌هلمن را پیاده‌سازی کرده باشید می‌دانید که منحنی‌های بیضوی یک دامنه‌ی متفاوت ریاضی است که اعداد را به نحو دیگری تولید می‌کند یعنی عملیات پایه‌ای ان فرق می‌کند و با دیفی‌هلمن همین‌طور که هست برخورد می‌کند ولی ناگهان سریع‌تر و قدرتمندتر می‌شود 393 00:41:54,150 --> 00:42:10,650 در واقع این تابع درهم‌سازی جادویی یک تابع ضرب نقطه‌ای است در منحنی بیضوی این ضرب به این شکل کار می‌کند 394 00:42:10,900 --> 00:42:25,400 شما دو نقطه اضافه می‌کنید می‌توانید دو نقطه اضافه کنید یا یک نقطه را دو برابر کنید بنابراین ضرب چهار در ده می‌شود یک 395 00:42:33,650 --> 00:42:40,150 اینجا می‌خواهیم به روش منحنی‌های بیضوی حمله کنیم چند تا نکته هست که باید قبلش بررسی کنیم 396 00:42:40,400 --> 00:42:57,900 اول اینکه شکل تابع منحنی و معادله‌ی ساخت آن به این شکل می‌باشد تنها اطلاعاتی که داریم مربوط به متغیرهای a,b می‌باشد 397 00:42:58,150 --> 00:43:03,650 توجه داریم که برخی از پیاده‌سازی‌ها که از یک نقطه به توان خودش استفاده کرده‌اند نیازی به b ندارند 398 00:43:03,900 --> 00:43:24,400 همان‌طور که می‌بینید دو تا منحنی داریم که مقدار b آن‌ها متفاوت است اگر نقطه‌ای را دو برابر کنم دوباره به نقطه‌ای در همان منحنی می‌رسم 399 00:43:24,650 --> 00:43:48,150 توجه کنید که منحنی بیرونی منحنی امن است و می‌خواهیم از منحنی درونی به دقت مراقبت کنیم همین را متوجه باشید که منحنی درونی ناامن است و بیرونی امن 400 00:43:48,400 --> 00:43:52,900 و حقه‌ی حمله این است که قربانی را به نحوی هدایت کنیم که در منحنی اشتباه پردازش‌های خود را انجام دهد 401 00:43:53,150 --> 00:44:04,650 در این معادله با یک سری متغیر ایکس و پارامترهای ثابت مقدار y ساخته می‌شود 402 00:44:04,900 --> 00:44:06,400 اما اگر یک فرستنده وجود داشته باشدو هردو مقدار x,y را برای پردازش نیاز داشته باشد در نتیجه مقدار b بی‌اهمیت می‌شود و از ترکیب همین دو متغیر قابل شناسایی است 403 00:44:06,650 --> 00:44:30,150 اگر مقدار y را بداین با جایگذاری در معادله می‌گوییم این نقطه درون منحنی هست یا خیر اما اگر این را ندانیم با دقت بیش‌تری بررسی می‌کنیم 404 00:45:00,400 --> 00:45:22,900 خب فرض می‌کنیم آلیس نقطه‌ای درون منحنی اول انتخاب می‌کند این نقطه به صورت تولید شده است یعنی خروجی مشخص نیست 405 00:45:23,150 --> 00:45:40,650 با ارسال یک نقطه از یک منحنی ناامن طرف دیگر ارتباط را وادار می‌کنیم که عملیات را روی منحنی ما انجام دهد بنابراین عملیات طرف دیگر فقط می‌تواند مقادیر محدودی روی منحنی بگیرد و از همین جا نشت اطلاعات کلید طرف مقابل شروع می‌شود 406 00:45:40,900 --> 00:45:50,400 اگر این کار را چند بار انجام دهیم در نهایت چند تکه از کلید خصوصی را داریم که نسبت به عددی از آن باقی‌مانده گرفته‌ایم 407 00:45:50,650 --> 00:46:03,150 چون وقت کم هست از جزییات می‌گذریم فقط این کار را بارها و بارها انجام می‌دهیم و چندین نقطه‌ی ناامن در این منحنی به دست می‌آوریم 408 00:46:03,400 --> 00:46:09,800 که البته به کمک پیاده‌سازی‌های معروف منحنی‌های بیضوی هم قابل انجام است یعنی این پیاده‌سازی‌ها به شما این امکان را می‌دهد که کلید خصوصی هدف را استخراج کنید 409 00:46:10,050 --> 00:46:11,550 مجموعه‌ مقادیر در این فرمول‌ها صدق کند 410 00:46:11,800 --> 00:46:17,300 ما نمی‌خواهیم جزییات قضیه‌ی باقی‌مانده‌ی چینی را توضیح دهیم 411 00:46:17,550 --> 00:46:30,050 لازم نیست تئوری دقیق ریاضی رو بلد باشیم چند تا ابزار رو بشناسیم و اینکه خود قضیه‌ مربوط میشه اینکه در یک میدا ن جنگ به سریع‌ترین شکل ممکن تعداد کشته‌ها و زخمی‌ها را بشماریم 412 00:46:30,300 --> 00:46:39,800 اگر بخواهید به صورت بصری آن‌ها را بشمارید زمان زیادی می‌بره 413 00:46:40,050 --> 00:46:47,550 اگر به صورت ستونی مرتب کنیم نیازی به شمردن نیست فقط یادمان باشد که پنچ ستون داریم و یک نفر باقی‌مانده 414 00:46:47,800 --> 00:46:51,300 یک تعدادشون هست؟ طبیعتاً اینطور نیست 415 00:46:51,550 --> 00:46:57,050 اینبار در هفت ستون مرتب می‌کنیم تعداد یک هست بعد از اینکه در هفت ستون قرار گرفتند 416 00:46:57,300 --> 00:47:04,800 و در آخر در یازده ستون مرتب می‌کنیم این بار باقی مانده سه هست ... یک یک سه 417 00:47:05,050 --> 00:47:12,550 و حالا معادلاتی داریم به پیمانه‌ی پنچ و هفت و یازده که باقی‌مانده‌ی آن‌ها یک یک سه است می‌توانیم از معادلات به جواب اصلی برگردیم 418 00:47:12,800 --> 00:47:30,300 همه‌ی ریاضیاتی که لازم هست در این صفحه نوشته شده نکته‌ی اصلی این است که با دانستن هر زبان برنامه‌نویسی می‌توانید در چند دقیقه آن را پیاده‌سازی کنید 419 00:47:30,550 --> 00:47:45,050 این قضیه‌ی باقی‌مانده‌ی چینی است و می‌توانید کلید را به کمک آن به دست بیاورید بیش از این وقت نیست و می‌خواهیم دمو را نمایش دهیم 420 00:47:58,300 --> 00:48:05,800 الکس به کمک ابزار Sage این حمله را با زبان برنامه‌نویسی پایتون پیاده‌سازی کرده است 421 00:48:06,050 --> 00:48:14,550 جعبه‌ی اول برای دو برابر کردن و جمع زدن نقاط منحنی است 422 00:48:14,800 --> 00:48:24,300 دومین جعبه نقطه‌های منحنی‌ جعلی را مقداردهی می‌کند 423 00:48:24,550 --> 00:48:29,050 می‌بینیم که آلیس کلید مخفی را مقداردهی کرده است با ۱۲۳۴ 424 00:48:29,300 --> 00:48:34,800 بعدش یک سری از نقاط منحنی نامعتبر را از پیش ساخته‌ام 425 00:48:35,050 --> 00:48:42,550 سپس ارسال نقاط به آلیس را شبیه‌سازی می‌کنم 426 00:48:42,800 --> 00:48:44,300 اینجا جایی است حمله‌ی اصلی را انجام می‌دهیم 427 00:48:44,550 --> 00:49:03,050 ما این ایده را از واتسون گرفته‌ایم این حمله را در یک روز پیاده‌سازی کرده که خیلی فوق‌العاده‌ هست 428 00:49:03,300 --> 00:49:16,800 اینجا پاسخ‌ها را از آلیس گرفته‌ایم و می‌خواهیم مقدار اصلی را پیدا کنیم 429 00:49:17,050 --> 00:49:25,550 جعبه‌ی بعدی الگوریتم Extended GCD را پیاده‌سازی می‌کند 430 00:49:25,800 --> 00:49:31,300 بخش مهمی از قضیه‌ی باقی‌مانده‌ی چینی است ولی همان‌طور که می‌بینید در چند خط پیاده‌سازی شده است 431 00:49:31,550 --> 00:49:50,050 این توابع ساده هستند و ریاضیات پیچیده‌ای ندارند و توابع GCD & EGCD در حد ریاضیات دبیرستان هستند 432 00:49:50,300 --> 00:49:52,300 سخت‌ترین چیزی که می‌خواهیم پیاده‌سازی کنیم همین EGCD است 433 00:49:52,550 --> 00:49:57,050 این کد ساده‌اس و لازم نیست به طور کامل متوجه آن بشید من خودمم کامل متوجه نمی‌شم 434 00:49:57,300 --> 00:50:06,800 این بخش هم پیاده‌سازی قضیه‌ی باقی‌مانده‌ی چینی هست 435 00:50:07,050 --> 00:50:33,550 همه‌ی کدها و توضیحات و راه‌حل‌ها به صورت برخط و رایگان در دست‌رس است 436 00:50:33,800 --> 00:50:50,300 [تشکر و خداحافظی]