باسمه‌ تعالی
شاخه‌ی دانشجویی انجمن رمز دانشگاه صنعتی شریف تقدیم می‌کند
‫این سخن‌رانی توسط توماس پیچک، شاین دِولین، اَلکس بادوچی و استیو توماس از ماتاسونو ‫در کنفرانس بلک‌هت سال ۲۰۱۴ ارائه شده است.
‫۶۴ حقه‌ی کوچک که رمزنگاران دوست ندارند شما از آن‌ها مطلع شوید!
‫با تشکر از حضور شما ...
ارائه را شروع می‌کنیم
در اینجا یک مسئله‌ی سبک را مطرح می‌کنیم
‫اگر RSA را نمی‌دانید، در اینجا خیلی سریع آن را شرح می‌دهم
در این مسئله هر یک از طرفین یک کلید عمومی و یک کلید خصوصی دارند
‫کلیدِ عمومی ترکیب یک عدد صحیح یا ماژول n و یک توان عمومیِ e است؛ ‫و کلید خصوصی ترکیب ماژول n و عدد مخفیِ d می‌باشد.
بنابراین رمزگذاری و رمزگشایی به سادگی انجام می‌شود
‫وقتی که می‌خواهیم یک عبارت را رمزگذاری کنیم، ‫متن ساده که همان عدد p است را به توان عمومی می‌رسانیم، ‫سپس از آن نسبت به n باقی‌مانده می‌گیریم.
‫‫برای رمزگشایی پیام، عبارت رمزشده به توان عدد صحیحِ مخفیِ d می‌رسد ‫و سپس از آن نسبت به n باقی‌مانده گرفته می‌شود.
‫باید انتخاب کنیم که از چه عددی برای توانِ e استفاده می‌کنیم.
‫و از آن‌جایی که عبارت به توان رساندن را انجام می‌دهیم، ‫ترجیح می‌دهیم عدد کوچک‌تری باشد که سریع‌تر انجام شود،
‫کمی بهینه‌تر باشد؛
‫اما مشکلاتی در انتخاب اعداد کوچکِ e وجود دارد؛
‫به طور مثال با انتخاب عدد ۳ برای e؛ ‫حملات همه‌پخشی یا حملات ریشه‌ی اعداد مکعب (توانِ ۳) محتمل است.
‫خب نگاهی به پروژه‌ی SaltStack ‫(پروژه‌ی متن‌باز مبتنی بر زبان پایتون برای مدیریت کارگزارها از راه دور) می‌اندازیم؛
‫این پروژه جایگزین پروژه‌های Puppet و Ansible است ‫که به ما اجازه می‌دهد از راه دور در کارگزارهای خود فرمان اجرا کنیم.
‫و به جای استفاده از SSH در این پروژه از RSA استفاده شده است.
‫کسی می‌تواند مشکل اصلی آن‌ها در پیاده‌سازیِ RSA این پروژه را ببیند؟
‫[مشکل خیلی بدیهی است] ‫اگر متوجه مشکل می‌شوید لطفاً دست خودتان را بالا بگیرید!
این پروژه از تاثیرگذارترین توان عمومی RSA (عدد e) ‫استفاده می‌کند!
‫که عدد ۱ است!
‫جالب است که پاسخ توسعه‌دهندگان این پروژه در مورد گزارش این مشکل این بود:
‫«نگران نباشید، ‫کلید عمومی ما یک نیست، ما فقط از توان عمومیِ یک استفاده کرده‌ایم!»
‫خب همان‌طور که می‌بینید در فرمول RSA پیام به توان عدد e می‌رسد؛ ‫اگر این توان یک باشد، RSA بسیار سریع است!!!
‫خیلی کارآمد!!!
‫بهتر است بگوییم که استفاده از توان صفر ‫‫در عمل بسیار کارآمدتر از توان یک خواهد بود!!!
بنابراین انگیزه‌ی اصلی این سخنرانی این است که به این نتیجه برسیم
‫هیچ‌ فردی نیست که رمزنگاری را پیاده‌سازی کند ‫و آن را به صورت صحیح متوجه شده باشد
آسیب‌پذیری‌های خیلی خیلی زیادی در این حوزه وجود دارد
اگر فرصت داشتید و مباحث این سخن‌رانی را از بین تمام سخن‌رانی‌ها به خاطر سپردید
به مباحث مربوط به این آسیب‌پذیری‌ها در فروم‌ها سری بزنید
می‌بیند که منابع زیادی در مورد هر یک از این آسیب‌پذیری‌ها وجود دارد
خیلی مباحث فوق‌العاده‌ای که در این فوروم‌ها وجود دارد
ما قصد داریم برخی از این مباحث را مرور کنیم
جزییات زیادی در این سخن‌رانی وجود دارد و به همین دلیل خیلی سریع صحبت می‌کنیم
چون فقط پنجاه دقیقه فرصت داریم
با همین سرعت تا انتهای سخن‌رانی صحبت می‌کنم
‫شما قرار نیست بعد از این سخن‌رانی ‫یاد بگیرید چگونه از آسیب‌پذیری پدینگ اوراکلِ RSA سوء‌استفاده کنید ولی من می‌توانم به شما نشان دهم که حملات چقدر سرراست هستند
و به شما این انگیزه را بدهم که خودتان از این پس دنبال این مسائل باشید
و به شما می‌گوییم که چگونه حتی این کار را برای شما ساده‌تر کرده‌ایم
اجازه دهید ریاضیات شما را درگیر خودش کند؛ مثل شعری در دنیای ناامنی
‫بنابراین به ما اعتماد کنید که این مسائل ساده‌تر از چیزی هست که به نظر می‌رسد!!
‫قبل از این‌که شروع کنیم چون در این سخن‌رانی جزییات زیادی از حملات ‫و چالش‌های رمزنگاری را بیان می‌کنیم؛ شما به یک پیش‌زمینه‌هایی نیاز دارید.
‫عملیات ویژه‌ی رمزنگاری مثل فیلد، گروه و رینگ‌ها و جبر خطی و سایر موارد.
خب اینجا در عمل می‌گم که به چه چیزهایی احتیاج داریم
‫خب فعلاً قید این موارد را می‌زنیم!
هیچ‌کدام
این مشکلی است که مردم خجالت می‌کشند رمزنگاری را فرا بگیرند
آن‌ها درگیر جزییات می‌شوند
ما در این جا تقریباً همه‌ی حملاتی که در چالش‌های ماتاسانو کشف کرده‌ایم را بیان می‌کنیم
هیچ یک از آن‌ها نیازی به این مباحث تئوری ندارند
‫حتی در واقع می‌گوییم که راه صحیح یادگیری تئوری‌ها این است که ‫ابتدا کد حملات را پیاده‌سازی کنید.
تا مباحث تئوری برای شما معنی پیدا کند
داستان ما این است که ما متوجه شدیم در کشفِ ‫آسیب‌پذیری‌های رمزنگاری خیلی توانمند شده‌ایم.
‫همان‌طور که قبلاً هم گفتم اگر به دنبال آسیب‌پذیری‌های رمزنگاری در ‫پروژه‌ها نباشید، آسیب‌پذیری‌های خیلی خیلی جالبی را از دست می‌دهید.
به همین دلیل یکی از هم‌تیمی‌های من این پرونده‌ی متنی را نوشت
که شامل یک سری تمرین‌های رمزنگاری بود
‫به همین دلیل در نهایت ما یک مجموعه‌ی خیلی خوب ‫از آسیب‌پذیری‌های رمزنگاری داشتیم
و فکر کردیم که یک پست وبلاگ خیلی خوب می‌شود
به همین دلیل تصمیم گرفتیم راهی برای به اشتراک‌گذاری آن‌ها پیدا کنیم
من یک مشکلی داشتم که متن کامل را در اینتنرت منتشر کنیم
من یک خوددرگیری داشتم :)
که معتاد به این هستم که برنده‌ی بحث‌های توییتری باشم
مشکل اساسی که داشتم این هست که افرادی هستند که در صورت بحث نمی‌توانم از ادبیات خودم استفاده کنم
ترجیح می‌دادم که اگر قرار هست آن‌ها به راحتی مباحث را یاد بگیرند باید بدانند که معنی آ‌ن‌ها چیست
‫در واقع اگر افراد می‌خواهند این تمرینات را درک کنند ‫بهتر است خودشان درک کنند تا اینکه به آن‌ها توضیح دهم
خب ما یک راه حل داشتیم
ر‫اه‌حلی که ما از استفاده کردیم این بود که ‫بدون درگیری با افراد آن‌ها را درگیر کنیم
‫ما این چالش‌ها را در ۸ مجموعه مرتب کردیم
و اگر فردی به ما ایمیل ارسال می‌کرد ما مجموعه‌ی اول را به او ارسال می‌کردیم
ولی برای اینکه مجموعه‌ی بعدی چالش‌ها را بگیرید
باید برای ما کدهایی که برای سوء‌استفاده از آسیب‌پذیری چالش‌ها استفاده ‫کرده بودید را ارسال می‌کردید
بعد از دریافت پاسخ‌ها چالش‌ها را بازنگری می‌کردیم
اغلب به جذابیت آن‌ها می‌افزودیم
و اینکه درک کردیم بهترین راه یادگیری رمزنگاری این است که درگیر کد آسیب‌پذیری شوید
و اینکه بیش‌تر افراد این روش را پسندیدند
اغلب همه‌‌ی کد را خودشان می‌نوشتند
‫‫اتفاقی افتاد این بود که یک بلاگر (اگر نمی‌شناسید Pinboard) ‫‫که یک بلاگر خیلی خوب و یک برنامه‌نویس عالی است، در مورد حل ‫این چالش‌ها یک پست نوشت.
‫البته این بهترین اسکرین‌شات نیست،
ولی یک اسکرین‌شات قدیمی از سایت هکر نیوز است
که خیلی افراد از آن بازدید کردند
و در نهایت تعداد زیادی شرکت‌کننده در این چالش‌ها شرکت کردند
خیلی بیش‌تر از انتظارمان
قبل از پست وبلاگ این فرد مشهور، ما همه چیز رو به صورت دستی انجام می‌دادیم مردم برای ما ایمیل ارسال می‌کردند و سایر مراحل طی می‌شد
و ناگهان بیش از ده هزار شرکت‌کننده به حل چالش‌ها مشغول بودند
افرادی که این چالش‌ها را حل می‌کردند بسیار متنوع بودند
و از زبان‌های برنامه‌نویسی متنوعی استفاده می‌کردند
همان‌طور که می‌بینید یک فهرست بالا به پایین از زبان‌های برنامه‌نویسی مورد استفاده وجود دارد
پایتون در ابتدای فهرست است با نزدیک به پنجاه درصد
و سپس گلنگ و روبی در رده‌ی دوم و سوم هستند
عده‌ی کم‌تری از زبان‌های سنتی و شی‌گرا استفاده کرده‌اند
البته بسیاری از افراد با یک زبان جدید چالش‌ها را حل کردند
بنابراین اگر می‌خواهید زبان جدیدی فرا بگیرید این چالش‌ها یک راه خوب است
اطلاعات خوبی هست که چه کسانی زبان جدید را شروع کردند
چه کسانی خسته شدند
چه کسانی تا انتها ادامه دادند
از چه زبان‌های عجیبی استفاده شده بود
خیلی از افراد چالش‌ها را تمام نکردند
حدس می‌زنم چون به اندازه‌ی کافی با محیط آشنا نبودند
می‌خواهم سراغ مطالب عجیب‌تری بروم
کمی خواندنش سخت است فهرست این زبان‌های برنامه‌نویسی خیلی خیلی طولانی هست
خب ما یک مجموعه‌ی کامل از پاسخ‌ها به ازای هر زبان برنامه‌نویسی داریم
هر زبانی که در این فهرست هست یعنی یک نفر با این زبان چالش‌ها را تمام کرده است
که واقعا تاثیرگذار است که بتوانیم آن‌ها را منتشر کنیم
خب بهتر است اکسل را هم فراموش نکنیم که یک پاسخ از آن داشتیم
‫یک پاسخ مربوط به آسیب‌پذیری AES
‫وقتی می‌گوییم اکسل منظورمان اسکریپت VB نیست
‫منظورمان جداول و سلول‌ها است که یک نفر چالش AES را با آن حل کرده است
این عالیه، جالب‌ترین بخش است
یک پرونده‌ی پست‌اسکریپت به نوعی نقاشی هست که همه‌ی جداول در آن تعبیه شده است
خب زبان‌های عجیبی بودند اما جاوااسکریپت برای رمزنگاری خیلی عجیب است
کریپتوکت برنامه‌ای که از ابزار رمزنگاری کاربردی استفاده می‌کند
و اینکه گربه هم وجود دارد
‫گربه در این نرم‌افزار خیلی مهم است!!
‫خب کریپتوکت یک نرم‌افزار پیام‌رسانی مدرن است که روشی جدید‌تر از رمزنگاری PGP ارائه می‌کند در عمل برنامه‌ای است که از رمزنگاری استفاده‌ی کاربردی می‌کند
‫‫خب چیزی که این‌جا می‌خواهیم بحث کنیم این است که این نرم‌افزار ‫از رمزنگاری منحنی‌های بیضوی و دیفی‌هلمن برای اشتراک کلید استفاده می‌کند.
حالا می‌خواهیم توضیح دهیم که چه چیزی را اشتباه انجام داده‌اند
در حال حاضر شما می‌توانید کلیدعمومی را بشکنید
و گفت‌و‌گوی رمز‌شده را رمزگشایی کنید
کمی توضیح بدهیم که چگونه
خب جالب است که نگاهی به دوره‌های زمانی اینجا داشته باشیم
‫ماه مه سال ۲۰۱۲ تا ژوئن ۲۰۱۳
‫البته در این بازه اتفاقات زیادی افتاده است؛ آلبومی از یک خواننده منتشر شده، مسائل زیادی در دنیای سیاست رخ داد
یکی از اتفاقاتی که در این دوره در حال رخ دادن بود
تصویر رمزنگاری از اسنودن است اگر می‌توانید ببینید البته نمی‌دانم رزولشن آن چطوری است
خب داستان اسنودن در حال اتفاق افتادن بود
‫شاید براتون سوال شده که اسنودن که به این گربه‌ها برای امنیت ارتباطاتش اعتماد نکرده بود (برای ارسال داده‌هایی در مورد اینکه چه چیزهایی در حال رخ دادن بود)
زمانش دقیقاً مشخص نیست
اما از ابتدای ژوئن و شاید کمی قبل‌تر این رمزنگاری شکسته شده بود
‫در این زمان رمزنگاری OTR به دلایلی در دست‌رس نبود و به همین دلیل ‫از کریپتوکت برای کارایی بهتر استفاده شده بود
بنابراین از لحاظ زمان‌بندی واقعاً موقعیت خوبی بوده است
البته ابتدای ژوئن زمان عرضه‌ی وصله برای رفع مشکل است
بنابراین مدتی قبل از آن
سوم ژوئن زمان عرضه‌ی وصله بوده است
مدتی قبل ازاینکه فایرفاکس وصله دهد، مدتی قبل از اینکه اثبات شود
نزدیک به دو هفته بعد از سوم ژوئن که وصله اعمال شد
‫و اینکه آیا NSA در این بازه کریپتوکت را شنود کرده است یا خیر ... آن‌ها می‌توانستند این گفت‌و‌گوها را رمزگشایی کنند
یک مشکلی وجود داشت
این در واقع دیفی‌هلمن قدیمی است و برای قبل از مهاجرت به منحنی‌های بیضوی است
این کد مربوط به قبل از تغییر به دیفی‌هلمن منحنی‌های بیضوی بوده است
آن‌ها مشغول تغییر اندازه‌ی کلید خصوصی بودند
‫اول عدد را از ۶۴ تغییر دادند
‫سپس آن را مجددا به ۳۲ کاهش داده‌اند
که در واقع قبل شکستن است استفاده از ۳۲ باعث شکست‌پذیری بوده است
البته در بخش‌‌های بعدی می‌بینیم که علت چیست و می‌توانیم آن را تا ۱۶ کاهش دهیم
و بعد تغییر ۳۲ به ۲۶ را داریم
‫ولی در توضیحات کد آن‌ها گفته بودند که این تغییرات مربوط به کارایی است.
‫ما کلید را کوچک می‌کنیم تا ببینیم این کارایی تا کجا بهتر می‌شود
‫تغییر ۲۶ به ۲۴!!
خب برای این روشن‌تر شود بهتر است اضافه کنیم
وقتی می‌گوییم قابل شکستن است یعنی چه کاری می‌توان برای شکستن کرد؟
خب دقیقاً برای این را نمی‌دانم
این بخش جالبی است
اینجا مشخص هست که آن‌ها به جای استفاده از اعداد صحیح ۱۵ بیتی از نوع ده‌دهی استفاده کرده‌اند
بنابراین در عمل فضای کلید را کوچک کرده‌اند
خب این نمودار قدرت کلید در طول زمان است
چه زمانی گزارش تو در آن اعمال شده؟
زمانی که نمودار در بالاترین نقطه است
خب مشخص است که در این دوره گاهی کمی بهتر شده
اما در یک دوره‌ی طولانی که همین خط افقی قرمز است
کریپتوکت ناامن بوده و دیفی‌هلمن مورد استفاده قابل شکستن می‌باشد
‫البته یک پرشی اینجا قابل مشاهده است که در آن بازه کریپتو‌کت ‫گفته بود این مشکل از ما نیست؛ در واقع پس از گزارش آسیب‌پذیری
خب حمله‌ی مورد نظر برای سوء‌استفاده از این آسیب‌پذیری
‫حمله‌ی گام بزرگ- گام کوچک است
البته این فقط شبه کد حمله است
در عمل شما نصف بیت‌ها را با صفر مقداردهی می‌کنید
و باقی آن‌ها را با یک عددگذاری می‌کنید
همه‌ی کلیدها را می‌سازید و آن‌ها را در دیسک ذخیره می‌کنید
وقتی می‌خواهید کلید را بشکنید
از نصف باقی بیت‌ها که از آن‌ها استفاده نمی‌کردید
کلید عمومی را می‌گیرید
از کلید خصوصی که ساخته‌اید کم می‌کنید
خب واضح است که این حمله‌ی کلاسیک برای شکستن دیفی‌هلمن در اینجا کافی است
مهم‌تر از اینکه بفهمید کد چطوری کار می‌کند این است که بدانید کد خیلی کوتاه است
خیلی خیلی ساده و خیلی کلاسیک برای شکستن این رمزنگاری
خب از همین‌جا برای یک چالش رمزنگاری ایده آمده است که
این حمله در آن استفاده می‌شود
اساساً استفاده از یک هارد SSD و هشت فیلتر بلوم بزرگ و ...
البته کد دمویی وجود دارد
در این حالت به جای اینکه حمله چند صد ثانیه طول بکشد فقط ۲۵۰ ثانیه زمان برده است
در واقع مشکل کریپتوکت مشکل ساده‌ای بود
و یک دقیقه طول می‌کشید که پیام‌های کریپتوکت شکسته شود
چند ثانیه، من معذرت می‌خواهم که کدت رو زیر سوال بردم
چند ثانیه طول می‌کشد که پیام‌های کریپتوکت رمزگشایی شود به دلیلِ
آسیب‌پذیری‌های کریپتوکت
و البته این تنها آسیب‌پذیری این نرم‌افزار نیست
خب چیزی که در چالش‌ها از آن استفاده می‌کنیم این است که
درگیر کد این نرم‌افزار که تعداد زیادی کاربر از آن استفاده می‌کنند شوید
و تلاش کنید آسیب‌پذیری‌های آن را پیدا کنید
[فهرست آسیب‌پذیری‌ها در اسلاید مشخص است]
ساده‌ترین آن‌ها فقط نیازمند تغییر چند بیت است
و در نهایت اینکه چالش‌های جذابی از آن‌ها درمی‌آید
خب الان از الکس می‌خواهم در مورد چالش‌های خودمان صحبت کند
مجموعه‌ی اولی که برای چالش‌های رمزنگاری مورد استفاده قرار گرفته است
چند تابع پایه‌ای که در اسلاید مشخص است
XOR
‫تکرار XOR
و سایر توابع که از آن‌ها برای حل چالش‌ها بهره خواهید برد
ای مجموعه بیش‌تر برای این است که ثابت کنید می‌توانید برنامه‌نویسی کنید
و اینکه ببنید می‌توانید با زبان چالش‌ها کنار بیایید و ادامه دهید
مجموعه‌ی اول برای خود من سخت‌ترین بود که تکرار کلید دو هفته طول کشید
خب اینجا چند نفر چالش‌ها را به پایان رسانده‌اند؟ چند نفر آن‌ها را شروع کرده‌اند؟
در مجموعه‌ی اول فقط یک چالش نیازمندِ دقت بیش‌تر مورد نیاز است
که کمی به دانش آکادمیک نیاز دارد و مربوط به تکرار کلید است
هم‌چنین برای حل چالش‌های بعدی مورد نیاز است
در دسته‌ی دوم چالش‌ها کمی سخت‌تر می‌شود در مورد حملات علیه رمزنگاری‌های قطعه‌ای
حملات خوبی در این مجموعه موجود است
‫این مجموعه‌ی ۲ چند چالش ECB دارد
به هر حال در همین مجموعه با حملات واقعی براساس رمزنگاری قطعه‌ای
علیه نرم‌افزار‌های موجود آشنا می‌شوید
مجموعه‌ی سوم باز هم چالش‌های بیش‌تر رمزنگاری قطعه‌ای است
‫به همراه حملات معروف علیه پدینگ CBC
[فهرست سایر حملات هم در اسلاید می‌باشد]
خب اینجا به حملات رمزنگاری جریانی رسیده‌ایم
در خط آخر هم می‌بیند که در هر دسته چه تعداد شرکت‌کننده چالش‌ها را تمام کرده‌اند
تقریبا هزار نفر مجموعه‌ی اول را تمام کرده‌اند
احتمالاً نزدیک به پانصد نفر مجموعه‌ی دوم را تمام کرده‌اند
‫در مجموعه‌ی چهارم چالش‌های بیش‌تری در مودِ CTR ‫ و معرفی توابع درهم‌سازی، حملات علیه طول رشته‌ی درهم‌سازی و …
‫در مورد حملات CTR در کنفرانس چند سال پیش هم صحبت شده است به همین دلیل اینجا صحبت نمی‌کنیم
‫چون مود CTR مهم‌ترین مود در رمزنگاری قطعه‌ای است
و اینکه CTR راهی برای تبدیل رمزنگاری قطعه‌ای به جریانی هست
در مجموعه‌ی پنجم رمزنگاری کلید عمومی
دیفی‌هلمن
‫[سایر موارد که در اسلاید موجود است]
و چند چالش جالب RSA
گردآوری شده است
‫‫در مجموعه‌ی ششم چالش‌های مربوط به کلید عمومی را ادامه داده‌ایم؛
‫تعدادی چالش مربوط به رمزنگاری DSA داریم
‫و در نهایت پدینگ اوراکل RSA را داریم
‫یکی از حملات معروف Daniel Bleichenbacher در سال ۱۹۹۸ روی SSL
این یکی حمله‌ی خیلی جذاب است
و هنوز هم حملاتی مشابه آن کشف می‌شود
که شما می‌توانید در رمزنگاری سطح اپلیکیشن آن را شناسایی کنید
برای کسانی که با پدینگ اوراکل آشنا هستند این شبیه به یک حمله‌ی بازیابی متن ساده است
مهاجم قطعه کدی رمزشده دارد
و می‌تواند ارتباطی با کارگزاری که قادر به رمزگشایی است داشته باشد
اگر مهاجم بتواند رمزگشایی را شناسایی کند
مهاجم به اندازه‌ی کافی اطلاعات دارد تا با کنار هم قرار دادن آن‌ها، متن اصلی را بازیابی کند
خب می‌بینید که این حمله در دنیای واقعی هم وجود دارد
و یکی از گام‌های تست نفوذ هم می‌تواند باشد
مثال واضح آن یک شرکت پرداخت است که به مشتریان خود نرم‌فزار داده است
‫تصور کنید که ‫مشتریان می‌توانند شماره‌ی کارت‌های اعتباری خود را با RSA رمز کنند
و فرآیند رمز RSA سمت مشتری اتفاق می‌افتد
و سپس متن رمز‌شده به سمت کارگزار پردازش پرداخت ارسال می‌شود
خب تصور کنید مهاجم موفق به ضبط این شماره‌های اعتباری رمزشده شود
خب چیزی که به ذهن می‌رسد این است که شماره‌های کارت اعتباری کوچک هستند
‫در عمل ترکیبی از RSA و رمزنگاری قطعه‌ای استفاده می‌شود
همین کوچک بودن و طول ثابت داشتن باعث می‌شود عملیات رمزنگاری مستقیم صورت بگیرد
که در نهایت رمزنگاری به این شکل آن‌ها را دچار آسیب‌پذیری می‌کند
‫برای اینکه کمی با پدینگ RSA با جزییات بیش‌تری آشنا شویم
پدینگ RSA در واقع برای امنیت ضروری است
وقتی پدینگ را در مودهای دیگر رمزنگاری استفاده می‌کنیم به طور خاص در رمزنگاری متقارن
به نظر می‌رسد اغلب از این پدینگ اجتناب می‌شود
طوری که به نظر می‌رسد برای رمزنگاری جریانی اصلاً پدینگ لازم نیست
‫اما برای RSA در واقع ضروری است
‫در عمل رمزنگاری RSA برای یک متن خام به راحتی بدون پدینگ قابل شکستن است
‫‪تمرینی در مجموعه‌ی ۶ وجود دارد که پیام‌های پد نشده‌ی RSA باید شکسته شود
همان‌طور که در اول بحث هم نشان دادیم روش RSA بسیار ساده است و در عمل به توان رساندن است که پیام را رمز می‌کند
به نحوی این روش فریبنده است یعنی هر فردی مثل برنامه‌نویس جاوااسکریپت فکر می‌کند با کمی عملیات ریاضی یک پیام رمزشده دارد در همین جا متوقف می‌شوند
و تصور می‌کنند که فناوری لازم برای کار با RSA را دارند
شما خواهید دید که پیاده‌سازی‌های RSA پد نشده در دنیای واقعی وجود دارد
و می‌بینید که آسیب‌پذیری پیچیده‌تر می‌شود و در اینجا حتی RSA پد شده را هم خواهیم شکست
یکی از دوستان ما به نام Nate Lawson که سه چهارم از چالش‌های ما را حل کرده است و رمزنگار قابلی است
می‌گوید که نباید پدینگ در RSA را اصلا پدینگ بگوییم
در رمزنگاری قطعه‌ای تلاش می‌کنیم تا حد ممکن از پدینگ اجتناب کنیم
رمزنگاران در واقع این را ترجیح می‌دهند که از مود CTR به جای CBC استفاده کنند
چون در مورد CBC به پدینگ احتیاج داریم ولی در CTR احتیاج نداریم
در رمزنگاری قطعه‌ای می‌خواهیم از پدینگ (مجزا) اجتناب کنیم
در رمزنگاری RSA اینطور نیست در RSA باید پدینگ را روش زره‌پوشی این الگوریتم گوییم
چون اگر این پدینگ یا زره را از RSA بگیریم دیگر امنیتی برایش باقی نمی‌ماند
چیزی که در اینجا می‌بینیم نحوه‌ی پدینگ پیش‌فرضی است که در اغلب پیاده‌سازی‌ها به کار گرفته می‌شود
البته بهترین پدینگ نیست ولی اگر یک پیاده‌سازی جدید از این رمزنگاری ببینید، این پدینگ احتمالاً به کار گرفته شده است
... بهتر است توضیح بدهی چگونه این پدینگ کار می کند
روشی که این پدینگ بر اساس آن کار می‌کند این است که تا اندازه‌ی سایز ماژول، ماژول کلید عمومی پدینگ صورت بگیرد
برای این کار با یک بایت پیشتاز شروع می‌کنیم یک بایت به مقدار دو (هر پیام معتبر با ۲ شروع می‌شود)
سپس یک رشته‌ی پدینگ تصادفی داریم
سپس یک بایت دیگر داریم و در انتها پیام اصلی قرار دارد
روش سوء‌استفاده به این صورت است که بایت پیشتاز همیشه مقدار ثابت دو دارد
این مقدار به ما می‌گوید که بازه‌ی پیامی که آن را رمز می‌کنیم به چه چیزی محدود شده است
یادآوری می‌کنم که در اینجا می‌خواهیم یک پدینگ اوراکل را بشکنیم
لطفاً نشان دهید که چه کسانی قبلاً پدینگ CBC که نسبتاً معروف هست را شکسته‌اند؟
ایده پدینگ اوراکل این هست که یک نرم‌افزاری که پیام‌های رمزشده را می‌گیرد به محض رمزگشایی پیام، پدینگ را بررسی می‌کند
بررسی پدینگ برای این است که مطمئن شود یک پیام معتبر دارد
پدینگ اوراکل زمانی اتفاق می‌افتد که رفتار هدف بسته به اینکه پدینگ معتبر است یا خیر تغییر می‌کند
می‌توانید ببینید که چرا این تغییر رفتار رخ می‌دهد
اگر تلاش کنید پیام را با پدینگ غیرمعتبر نگه دارید یک اِکسپشن می‌گیرید که مبتنی بر قیود زبان‌ برنامه‌نویسی رخ می‌دهد
برای این که تصور کنید یک پیام با پدینگ غیرمعتبر دارید که منجر به خطا شده است، می‌توانید یک برنامه‌ی وب را تصور کنید
بسته به اینکه پدینگ معتبر است یا خبر ممکن است خروجی متفاوتی در وب مشاهده کنید
کاری که می‌خواهیم انجام دهیم این است که فقط همین سیگنال را بررسی کنیم یعنی بررسی کنیم که پدینگ معتبر است یا خیر.
می‌توانید تصور کنید که برای یک نرم‌افزار خیلی راحت است که این خطا را تشخیص دهد
با توضیحات قبلی در پدینگ مورد استفاده در RSA در ابتدا باید بررسی کنیم که پیام با ۲ شروع شده است یا خیر.
این واقعیت برای همه‌ی نرم‌افزار‌هایی که با این نوع پدینگ کار می‌کنند یکسان است
[من نمی‌دونم که چیزی از این اسلاید باقی مانده یا نه]
تنها چیزی که باقی مانده این است که بدانیم پیام بین 20000... تا 2fffff... است
بنابراین ثابت‌ها را به صورت 2B : 3B-1 در نظر می‌گیریم
در رمزنگاری RSA هر پیام به صورت واضح یک عدد صحیح است که در اینجا محدوده‌ی مشخص دارد این صحبت در مورد همه‌ی رمزنگاری‌ها درست نیست ولی در این‌جا واقعاً عدد صحیح است
برای اینکه پدینگ این پیام معتبر باشد، باید با دو شروع شود عدد دوم عدد بسیار بزرگی است و اینکه هر پیام رمزشده باید بین همین دو عدد باشد و امنیت رمزنگاری به خاطر همین بازه تحت تاثیر قرار می‌گیرد
احتمالاً هیچ کس نمی‌دونه این چی هست، این یک نرم‌افزار جبر برای پایه‌ی نهم هست که بچه‌هام با اون بازی می‌کنند و با انیمیشن و غیره سعی داره جبر را آموزش دهد. ‫خب در واقع این همه‌ی ریاضی هست که ماهم بهش احتیاج داریم!!!
[هنوز یک چیز برای گفتن داری] خب این خیلی جالبه و شما به همون نرم‌افزار ریاضی قبلی احتیاج دارید!
[در اسلایدها می‌بینید] متن ساده‌ای به صورت عدد ۳۵۵ داریم و پس از رمزنگاری به عدد ۶۰۹ می‌رسیم
یکی از ویژگی‌های جالب RSA این هست که می‌تونید چند تا پیام رمز‌شده را در هم ضرب کنید و پاسخی را بگیرید که پیام‌ها را قبل از اینکه رمز‌شوند در هم ضرب کرده باشید
به همین صورت متن ساده‌ی ۲ به صورت رمز‌شده تبدیل به ۸ شده است
فرض کنید که می‌خواهیم این اعداد را در هم ضرب کنیم ۶۰۹ * ۸ را به دست می‌آوریم و باقی‌مانده‌ی آن به n را محاسبه می‌کنیم
این همان خروجی را می‌دهد که عدد ۲ را در ۳۵۵ ضرب و سپس آن را رمز کنیم حاصل هر دو ۵۴۸ می‌شود
بنابراین الگوریتم RSA نسبت به ضرب یک‌ریخت (همومورفیک) است
این به ما کمک می‌کنه که عملیات در رمزنگاری را درک کنیم در این نوع رمزنگاری عملیاتی داریم که با ضرب می‌توان چنین نتیجه‌ای گرفت و این خاصیت RSA است.
این ریاضیات پشت RSA است که اینجا می‌خواهیم در مورد آن بحث کنیم.
در این حمله ما یک متن رمز‌شده داریم متن‌ رمزشده ممکن است از هر جایی ضبط شده باشد، مثلاً با دست‌رسی فیزیکی مشاهده شده است
و می‌دانیم که متن ساده پدینگ معتبر دارد
در اینجا می‌خواهیم عدد مجهول s را بیابیم که در متن‌ساده‌ی ما ضرب شود و به عددی برسیم که باز هم پدینگ معتبر دارد.
در این حالت مقداری اطلاعات در مورد متن ساده نشت پیدا می‌کند
و در نهایت ما را هدایت می‌کند که متن ساده را به صورت کامل بازسازی کنیم
چیزی که ما داریم یک پیام رمز‌شده‌ است که به نحوی ضبط شده و یک عدد s اطلاعات ما در مورد این عدد ناقص است
این عدد را در پیام رمز‌شده ضرب می‌کنیم اعداد کوچک مثل ۲ یا ۳ یا ۴ شروع می‌کنیم، عملیات ضرب را انجام می‌دهیم
و عملیات ضرب را تکرار می‌کنیم و پیام ناقص را به سمت کارگزار ارسال می‌کنیم
و بررسی می‌کنیم که پدینگ معتبر شده است یا نه. به این عملیات اوراکل می‌گوییم.
اوراکل می‌گوید اگر در یک پیام رمز‌شده که خودش پدینگ معتبر داشته یک عبارت دیگر را ضرب کنیم باید پدینگ معتبر دریافت کنیم
ریاضیاتی که برای درک این مطلب به آن احتیاج دارید همین است
خط اولی که می‌بینید باقی‌مانده‌ی ضرب دو عدد است که نشان می‌دهد عملیات چقدر ساده است
سمت راست معادله‌ی اول همین روشی است که همیشه استفاده می‌کنیم یعنی هر تعداد از n که موجود است را کم می‌کنیم و باقی مانده را محاسبه می کنیم
سمت چپ معادله همان روش همیشگی است سمت راست معادله دقیقاً همان عملیات ریاضی مشابه است فقط برای توضیح بیش‌تر اینطوری نوشته شده و مطلب جدید نیست
در واقع چون عدد حاصل‌ضرب خیلی بزرگ است به جای اینکه مستقیم باقی‌مانده را حساب کنیم می‌شماریم که چند بار می‌توانیم خود عدد را از آن کم کنیم
تنها مسئله‌ی مهم این است که بدانیم دو طرف این معادله دقیقاً یک چیز است
در بخش پایین هم دوباره همان شیوه تکرار شده و بخش آخر طرف چپ و راست معادله عوض شده است
در اینجا X پیام ناقص رمزشده‌ای است که به ترتیب به ازای اعداد ۲ ۳ ۴ و غیره از کارگزار دریافت می‌کنیم، فقط می‌دانیم که پدینگ آن معتبر است
این مسئله از اینکه می‌دانیم RSA چگونه کار می‌کند برداشت کرده‌ایم.
بنابراین می‌دانیم که با توجه به عدد انتخابی مقدار X باید باقی‌مانده حاصلضرب عدد متن ساده در عدد انتخابی نسبت به ماژول است
در نتیجه خروجی ما به صورت معادله‌ای است که از آن متن ساده و همچنین عدد r را نمی‌دانیم
جبر خطی پایه‌ای
این معادلات را استخراج می‌کنیم و برای پیدا کردن متن ساده آن‌ها را حل می‌کنیم توجه داریم که مقدار r را نداریم
باز هم از جبر خطی ساده به یک معادله برای متن ساده می‌رسیم
به نظر می‌رسد که با این فرمول متن ساده قابل پیدا شدن است البته باز هم مجهولات دیگری داریم
همین کار را برای مجهول r انجام می‌دهیم
می‌خواهیم بداینم ماژول چند بار در حاصلضرب وجود دارد درست مثل معادله‌ی متن ساده از جبر خطی معادله‌ی جدید می‌نویسیم
البته نگاه کردن به فرمول زمان‌گیر است ولی با درک اینکه از کجا به آن رسیدیم می‌توان فهمید چطور کار می‌کند
چیز جالبی که میشه از این مباحث گفت این هست که ما نمی‌دانیم دقیقا متن ساده چه چیزی هست اما اطلاعاتی در مورد محدوده آن داریم چون پدینگ معتبر است پس همان بازه‌ها برای متن ساده وجود دارد
حالا با این اطلاعات می‌توانیم محدوده‌ی مجهولات را کم کنیم
خب همانطور که قابل مشاهده است محدوده‌ی r به عددی بستگی دارد که در مرحله‌ی اول انتخاب می‌کنیم
برای ما مدت زیادی طول کشید که اولین عدد که با موفقیت در این نامعادله جای می‌گیرد را پیدا کنیم
ولی الان می‌تونیم با سرعت خیلی خوبی یک عدد با خروجی موفق پیدا کینم
قبلا ده‌ها هزار یا صدها هزار تلاش برای پیدا کردن اولین عدد لازم داشتیم ولی الان ممکن هست با ده تا تلاش هم به نتیجه برسیم
ولی الآن نزدیک به ۱۰ تلاش لازم است
و هر عدد موفقی که پیدا کنیم می‌توانیم محدوده‌ی پیام خود را کوچک‌تر کنیم
تقریباً در هر مرحله این بازه نصف می‌شود.
دوست دارم روی نکته‌ای تاکید کنم در رمزنگاری مورد بحث ما با اعداد خیلی بزرگی سروکار داریم که تصور بوروت فورس هم نمی‌کنیم درسته؟
همون‌طور که دیدین بازه‌ی این اعداد هم خیلی بزرگ است و مدت خیلی زیادی طول می‌کشد تا همه‌ی‌ آن‌ها بررسی کنیم
ولی با عملیاتی که ما نشان دادیم در عمل این فضا را با سرعت خیلی زیادی به سمت جلو حرکت می‌دهیم و در هر مرحله پرش داریم و لازم نیست همه‌ی اعداد را بررسی کنیم
شبیه به حرکت به زمان آینده هست و ما چندین میلیون سال جلو می‌افتیم من هم البته مدت دقیقش رو حساب نکردم که هر بار چقدر جلو می‌افتیم
ولی هر بار که این عملیات را انجام می‌دهیم به طور محسوسی فضا کوچک می‌شود
یک دموی کوچک با جست‌و‌جوی خطی با زبان برنامه‌نویسی روبی نمایش داده می‌شود که مشخص شود حمله امکان‌پذیر و کم‌هزینه است این خروجی مربوط به اعدادی بوده است که خروجی موفق داشته‌اند
اگر بایت‌های قرمز را دنبال کنید متوجه می‌شوید که چه مقداری هر بار ضرب می‌شود به صورت بایت به بایت
همین‌طور بایت دو که در ابتدا مشخص می‌شود با رنگ سبز مشخص شده همان بایت پیشتاز است که قبلاً در مورد آن صحبت کردیم
و این صفرهای سبز دوم که پایان پدینگ تصادفی است که توضیح داده شد و بعد از آن پیام ساده‌ی اصلی است
این البته یک روش خطی ساده است و به صورت همزمان کاری انجام نشده اما همان‌طور که می‌بینید به سرع در حال اجرا است
این برای یک کلید ۱۰۲۴ بیتی است و به نظر می‌رسد یک روش قابل اجرا برای استخراج متن ساده از سطح نرم‌افزار باشد
برای مدتی این حمله به حمله‌ی یک میلیونی پیام معروف بود که عبارت میلیون نشان می‌داد که این حمله خیلی قابلیت اجرا ندارد
آسیب‌پذیری در TLS در پدینگ باعث می‌شود رفتار هدف تغییر کند و در کتابخانه‌ی مدرن این آسیب‌پذیری وجود داشته و موفق شده‌اند جندین پیام را رمزگشایی کنند
به هر حال با اینکه اسمش حمله‌ی یک میلیونی هست ما این حمله را در یک آزمون نفوذ وب انجام دادیم
هر بار که بایت‌های قرمز تغییر می‌کنند الگوریتم یک بار انجام و بخشی از پیام رمزگشایی می‌شود و در نهایت می‌توان پیام ساده از کارگزار گرفت
مجموعه سوالات هفتم را تقریباً از یک سال پیش حاضر کردیم که برخی چالش‌های جذاب دارد
[فهرست چالش‌ها در این دسته از اسلاید قابل مشاهده است]
همه‌ی این چالش‌ها احتمالاً در پایان امروز به صورت برخط منتشر می‌شود البته تا قبل از فردا قطعاً منتشر می‌شود
به همراه پاسخ‌ها و در همه‌ی زبان‌های برنامه‌سازی که ما پاسخی از آن دریافت کردیم
در وب‌گاه http://cryptopals.com/
همه‌ی چالش‌ها و پاسخ‌ها در دسترس است برای حل آن‌ها و یادگیری رمزنگاری اقدام کنید ...از اینجا به بعد کمی سریع‌تر می‌گویم
مجموعه‌ی هشتم آخرین مجموعه‌ای هست که می‌خواهیم آن را انجام دهیم در مجموعه‌هیا قبلی مباحث پایه‌ای را پوشش دادیم در این مجموعه قصد داریم مباحث مربوط به رمزنگاری بیضوی را پوشش دهیم
من خیلی نمي‌خوام دیفی‌هلمن را تشریح کنم ولی این الگوریتم ساده‌ترین روش رمزنگاری کلید عمومی هست می‌توانید با دریافت کدش مثال‌های موجود از این الگوریتم را برررسی کنید
در این رمزنگاری دو طرف ارتباط روی یک عدد اول بزرگ و یک عدد پایه توافق می‌کنند طرفین هر یک عدد مختص خودشان را تولید می‌کنند که کلید خصوصی است
دو طرف عدد پایه را به توان کلید خودشان می‌رسانند و نسبت به اول باقی‌مانده می‌گیرند به این ترتیب کلید عمومی می‌سازند و آن را برای هم ارسال می‌کنند
دو طرف می‌توانند کلیدها را به توان دیگری برسانند و به این ترتیب هر دو روی عدد دیگری توافق کنند این همان روشی که در عمل هم کار می‌کند و برای ما امنیت را می‌آورد
همان روشی که اگر NSA ترافیک ما را کپچر کند می‌تواند کلید را به دست آورد و پیام‌های ما را رمزگشایی کند
برای اینکه یک حسی در مورد خود الگوریتم داشته باشم یک کد سی‌ شارپ رو می‌بینید که نسبتاً کوتاه است
این هم کد گلنگ هست که باز هم کوتاه است و چون نویسنده یک ثابت را در خود کد قرار داده بلند به نظر می‌رسد
Haskell هم که یک زبان تزیینی و جالبیه
زبان برنامه‌نویسی روبی، تقلب نکنید تا کدها رو منتشر کنیم ولی این واقعا پیاده‌سازی دیفی‌هلمن در زبان‌های مورد استفاده است این کد رسمی ما نیست و از کدهای دریافتی هست
مسئله‌ی کمی سخت‌تر پیاده‌سازی دیفی‌هلمن بر پایه‌ی منحنی‌های بیضوی است یعنی الگوریتم همان است ولی کلیدهای خصوصی و عمومی به این صورت تولید شده‌اند
می خواهیم نشان دهیم که چگونه پیاده‌سازی‌های معروفِ دیفی هلمن با منحنی‌های بیضوی قابل شکستن است
حمله‌ی معروف برای این کار حمله به نقاط منحنی است که دو مرحله‌ای می‌باشد مرحله‌ی اول شبیه حملات قبلی است و می‌خواهیم کارگزار را به نحوی وادار کنیم بخش‌هایی از کلید را برای ما منتشر کند
و بعد نشان مي‌دهیم که چگونه تکه‌های کلید را مجدد به هم بچسبانیم
در ابتدا منحنی بیضوی و گروه نقاط مرتبط را توضیح می‌دهم اینکه ساعت چطوری کار می‌کند، اساسا فقط به عمل جمع نیاز داریم
در ابتدا جمع چهار با ده محاسبه می‌شود و نسبت به سیزده باقی‌مانده گرفته می‌شود که می‌شود یک
یک تابع درهمساز جادویی را تصور کنید که نگاشت آن باعث می‌شود بدانیم خود عدد چیست و همچنان این وضعیت ساعت (با ۱۳ عدد) کار می‌کند
بنابراین عبارت درهم‌شده‌ی چهار و ده باز هم می‌شود عبارت درهم‌شده‌ی ده
در نهایت خود منحنی را داریم و عدد P که عدد مولد یا پایه است و هم‌چنین ماژول اول هم داریم
اگر قبلاً دیفی‌هلمن را پیاده‌سازی کرده باشید می‌دانید که منحنی‌های بیضوی یک دامنه‌ی متفاوت ریاضی است که اعداد را به نحو دیگری تولید می‌کند یعنی عملیات پایه‌ای ان فرق می‌کند و با دیفی‌هلمن همین‌طور که هست برخورد می‌کند ولی ناگهان سریع‌تر و قدرتمندتر می‌شود
در واقع این تابع درهم‌سازی جادویی یک تابع ضرب نقطه‌ای است در منحنی بیضوی این ضرب به این شکل کار می‌کند
شما دو نقطه اضافه می‌کنید می‌توانید دو نقطه اضافه کنید یا یک نقطه را دو برابر کنید بنابراین ضرب چهار در ده می‌شود یک
اینجا می‌خواهیم به روش منحنی‌های بیضوی حمله کنیم چند تا نکته هست که باید قبلش بررسی کنیم
اول اینکه شکل تابع منحنی و معادله‌ی ساخت آن به این شکل می‌باشد تنها اطلاعاتی که داریم مربوط به متغیرهای a,b می‌باشد
توجه داریم که برخی از پیاده‌سازی‌ها که از یک نقطه به توان خودش استفاده کرده‌اند نیازی به b ندارند
همان‌طور که می‌بینید دو تا منحنی داریم که مقدار b آن‌ها متفاوت است اگر نقطه‌ای را دو برابر کنم دوباره به نقطه‌ای در همان منحنی می‌رسم
توجه کنید که منحنی بیرونی منحنی امن است و می‌خواهیم از منحنی درونی به دقت مراقبت کنیم همین را متوجه باشید که منحنی درونی ناامن است و بیرونی امن
و حقه‌ی حمله این است که قربانی را به نحوی هدایت کنیم که در منحنی اشتباه پردازش‌های خود را انجام دهد
در این معادله با یک سری متغیر ایکس و پارامترهای ثابت مقدار y ساخته می‌شود
اما اگر یک فرستنده وجود داشته باشدو هردو مقدار x,y را برای پردازش نیاز داشته باشد در نتیجه مقدار b بی‌اهمیت می‌شود و از ترکیب همین دو متغیر قابل شناسایی است
اگر مقدار y را بداین با جایگذاری در معادله می‌گوییم این نقطه درون منحنی هست یا خیر اما اگر این را ندانیم با دقت بیش‌تری بررسی می‌کنیم
خب فرض می‌کنیم آلیس نقطه‌ای درون منحنی اول انتخاب می‌کند این نقطه به صورت تولید شده است یعنی خروجی مشخص نیست
با ارسال یک نقطه از یک منحنی ناامن طرف دیگر ارتباط را وادار می‌کنیم که عملیات را روی منحنی ما انجام دهد بنابراین عملیات طرف دیگر فقط می‌تواند مقادیر محدودی روی منحنی بگیرد و از همین جا نشت اطلاعات کلید طرف مقابل شروع می‌شود
اگر این کار را چند بار انجام دهیم در نهایت چند تکه از کلید خصوصی را داریم که نسبت به عددی از آن باقی‌مانده گرفته‌ایم
چون وقت کم هست از جزییات می‌گذریم فقط این کار را بارها و بارها انجام می‌دهیم و چندین نقطه‌ی ناامن در این منحنی به دست می‌آوریم
که البته به کمک پیاده‌سازی‌های معروف منحنی‌های بیضوی هم قابل انجام است یعنی این پیاده‌سازی‌ها به شما این امکان را می‌دهد که کلید خصوصی هدف را استخراج کنید
مجموعه‌ مقادیر در این فرمول‌ها صدق کند
ما نمی‌خواهیم جزییات قضیه‌ی باقی‌مانده‌ی چینی را توضیح دهیم
لازم نیست تئوری دقیق ریاضی رو بلد باشیم چند تا ابزار رو بشناسیم و اینکه خود قضیه‌ مربوط میشه اینکه در یک میدا ن جنگ به سریع‌ترین شکل ممکن تعداد کشته‌ها و زخمی‌ها را بشماریم
اگر بخواهید به صورت بصری آن‌ها را بشمارید زمان زیادی می‌بره
اگر به صورت ستونی مرتب کنیم نیازی به شمردن نیست فقط یادمان باشد که پنچ ستون داریم و یک نفر باقی‌مانده
یک تعدادشون هست؟ طبیعتاً اینطور نیست
اینبار در هفت ستون مرتب می‌کنیم تعداد یک هست بعد از اینکه در هفت ستون قرار گرفتند
و در آخر در یازده ستون مرتب می‌کنیم این بار باقی مانده سه هست ... یک یک سه
و حالا معادلاتی داریم به پیمانه‌ی پنچ و هفت و یازده که باقی‌مانده‌ی آن‌ها یک یک سه است می‌توانیم از معادلات به جواب اصلی برگردیم
همه‌ی ریاضیاتی که لازم هست در این صفحه نوشته شده نکته‌ی اصلی این است که با دانستن هر زبان برنامه‌نویسی می‌توانید در چند دقیقه آن را پیاده‌سازی کنید
این قضیه‌ی باقی‌مانده‌ی چینی است و می‌توانید کلید را به کمک آن به دست بیاورید بیش از این وقت نیست و می‌خواهیم دمو را نمایش دهیم
الکس به کمک ابزار Sage این حمله را با زبان برنامه‌نویسی پایتون پیاده‌سازی کرده است
جعبه‌ی اول برای دو برابر کردن و جمع زدن نقاط منحنی است
دومین جعبه نقطه‌های منحنی‌ جعلی را مقداردهی می‌کند
می‌بینیم که آلیس کلید مخفی را مقداردهی کرده است با ۱۲۳۴
بعدش یک سری از نقاط منحنی نامعتبر را از پیش ساخته‌ام
سپس ارسال نقاط به آلیس را شبیه‌سازی می‌کنم
اینجا جایی است حمله‌ی اصلی را انجام می‌دهیم
ما این ایده را از واتسون گرفته‌ایم این حمله را در یک روز پیاده‌سازی کرده که خیلی فوق‌العاده‌ هست
اینجا پاسخ‌ها را از آلیس گرفته‌ایم و می‌خواهیم مقدار اصلی را پیدا کنیم
جعبه‌ی بعدی الگوریتم Extended GCD را پیاده‌سازی می‌کند
بخش مهمی از قضیه‌ی باقی‌مانده‌ی چینی است ولی همان‌طور که می‌بینید در چند خط پیاده‌سازی شده است
این توابع ساده هستند و ریاضیات پیچیده‌ای ندارند و توابع GCD & EGCD در حد ریاضیات دبیرستان هستند
سخت‌ترین چیزی که می‌خواهیم پیاده‌سازی کنیم همین EGCD است
این کد ساده‌اس و لازم نیست به طور کامل متوجه آن بشید من خودمم کامل متوجه نمی‌شم
این بخش هم پیاده‌سازی قضیه‌ی باقی‌مانده‌ی چینی هست
همه‌ی کدها و توضیحات و راه‌حل‌ها به صورت برخط و رایگان در دست‌رس است
[تشکر و خداحافظی]