یک عدد جونیور علاقه مند به حوزه امنیت :)
رمزنگاری کاربردی - قسمت اول : مقدمات
سری مقالات رمزنگاری پیشرفته شروع شد :))
باتوجه به قولی که دادم برای نوشتن مقالات رمزنگاری سری پیشرفته، تصمیم گرفتم طبق یک رفرنسی برم جلو، در بین کتاب ها گشتم و یه کتاب چشممو گرفت :
کتاب رمزنگاری کاربردی نوشته دوید ونگ رو دیدم، چند صفحشو ورق زدم و دیدم واقعا معرکس، و تصمیم گرفتم از روی همین پیش بریم، و اما دلیل های اصلیم :
1- همیشه کتابی که میخواید بخونید رو به ریش نویسندش بخرید، نه از روی تایتل و نه از روی جلد و نه از روی سیلابس و نه از روی قیمت و نه از روی حجم کتاب تصمیم به خرید نکنید، فقط نویسنده ! نویسنده این کتاب جزو کساییه که کتابخونه های امنی طراحی کرده و حملات رمزنگاری متعددی رو کشف کرده و تو ریاضیات دستی بر آتش داره و رمزنگاری رو فقط تئوری کار نکرده و خیلی از کمپانی ها باهاش پروژه در حیطه رمزنگاری داشتن
2- این کتاب امده هم به سادگی مفاهیم رو توضیح داده، هم قسمت ریاضی و تئوری رمزنگاری رو به اندازه و کافی باز کرده و هم مثال کاربردی ازشون زده ، سایر کتاب هایی که تو بازار هستن در زمینه رمزنگاری یا میان کلا توی تئوری عمیق میشن و ریاضیات خسته کننده و نامفهوم میگن یا میان کلا مباحث ابتدایی میگن وفقط مثال میزنن و دانش عمیقی ندارن
3- سرفصل های کتاب بسیار گسترده و کافیه !! و تاریخ انتشار کتاب هم 2021 هست که تقریبا جدید ترین کتابیه که منتشر شده (چرا تقریبا؟ چون Jean-Philippe Aumasson نسخه دوم کتاب serious cryptography شو تو 2024 داده و آدم بسیار قدریه تو این حوزه ولی بیشتر دانششو تو دوره های گرون منتشر میکنه نه کتابش)
قرار بود این کتاب رو ترجمه کنم که باتوجه به نرخ بالای کتاب خوانی در کشور و ضایع شدن متن ترجمش و گیر وگور های چاپ قرار شد همینجا مقالش کنم :)
من فصل به فصل این کتابو تو اینجا با توضیحات تکمیلی خودم براتون مینویسم و در انتها طبق قولی که داده بودم به صورت اضافه مباحث حملات رمزنگاری رو جدا و عمیق بررسی میکنیم و کاربرد رمزنگاری رو در مباحث رد تیم و بلو تیم بررسی میکنیم
پیشنهاد میکنم اگر سری مقدماتی رو نخوندید حتما بخونید، درسته این کتاب هم مباحث مقدماتیو توضیح میده هم پیشرفته ولی خوندن سری پیشرفته به شما دید کلی نسبت به رمزنگاری رو میده، و وقتی کتاب اقای وونگ رو میخونیم در هر فصلش روی یک مبحث قراره عمیق بشیم و اینطوری تو مطالب گم نمیشید !!
این مطالب که اینجا بیان میشه فراتر از دانشیه که شما برای دنیای امنیت لازم دارید، ما در این سری روی الگریتم های رمزنگاری دیپ میشیم و واقعا مباحث رو عمیق پیش میبریم و ممکنه نه تنها براتون مفید نباشه بلکه خسته کننده هم باشه ، سعی میکنم به ساده ترین روش توضیح بدم و اگر جاییشو نفهمیدید حتما بپرسید، ولی خوندن سری ای که پیش رو داریم فقط برای یک سری افراد کاربرد داره !
در اول کتاب آقای دیوید ونگ به رمزنگاری متقارن اشاره میشه و سعی میکنه با بیان ساده یک داستان بین یک پرنسس و شاه در دو قلعه و ارسال نامه ، رمزنگاری متقارن رو توضیح بده که شما از سری مقدماتی اینو بلدید :)
1.2 مفهوم Primitive :
کلمه Primitive به معنای اولیس ولی این معنی هیچ ربطی به چیزی که توی رمزنگاری انجام میده نداره، درواقع به نوع الگریتم رمزنگاری میگن primitive ، مثلا الگریتم های هشینگ (Hashing) یه Primitive هستن، الگریتم های امضای دیجیتال یه نوع Primitive هستن، الگریتم های رمزنگاری همینطور و... ، و معمولا Primitive ها باهم استفاده میشن برای یه هدفی تا اینکه جدا جدا استفاده بشن (مثلا HMAC از Hash با MAC استفاده میکنه، یعنی از دوتا Primitive) دقت کنید که این اصطلاح رسمیه و شاید زیاد نشنویدش ولی باید بدونید چیه !
من تاکید جدی میکنم که حتما سری مقدماتی رو قبل ادامه بخونید، مثلا الان دانشی از مطالب قسمت 8 سری مقدماتی برای درک این اصل نیازه و من اون هارو مجدد تکرار نمیکنم، این آخرین باری هست که تاکید میکنم !! من مفاهیم پایه رو که توی سری مقدماتی توضیح دادم رو ازش رد میشم و فقط مطالبی از کتاب گفته میشه که اونجاها نیامده !!!
1.3 اصل کرکهوف :
Kerckhoff’s principle: Only the key is kept secret
فقط کلید باید مخفی یا پنهان بمونه !
این اصل به زبون ساده میگه که الگریتم رمزنگاری نباید مخفی باشه و الگریتم باید برای عموم قابل مشاهده و ازمایش باشه ، اینطوری امنیتش بیشتره تا اینکه الگریتم مخفی باشه ! و بعد در کتاب اشاره میشه که الگریتم هایی که ما داریم ازشون استفاده میکنیم (توی کتاب میگه Primitive) هر روزه تعدادی CVE ازشون در میاد و بروز و امن تر میشن، و اینطوری ما دنیای امن تری داریم، فقط و فقط باید کلیدی که ازش برای رمز استفاده میکنیم مخفی بمونه و ازش محافظت کنیم، نه الگریتم و کلید
توی عکس بالا نوشته شده که اگر بخوایم از امنیت یک الگریتم رمزنگاری مطمئن بشیم باید توسط متخصصان به صورت عمومی مورد آزمون قرار بگیره و اگر بخوایم به روش security through obsecurity بسنده کنیم نمیتونیم به امنیتشون مطمئن بشیم چون طی تاریخ ثابت شده که روش خوبی نیست
روش security through obsecurity به این اشاره داره که ما با مبهم نگه داشتن امنیت یک چیزی رو تضمین کنیم، مثلا سازمان من n تا فایروال از برند x داره، در این استراتژی چون شما تعداد فایروال و نوعشو نمیدونی پس نمیتونی اکسپلویت پیدا کنی یا مطمئن حمله کنی .... این استراتژی زیاد جواب گو نیست حقیقتا !
دوتا اصطلاحم میبینیم:
Cryptographers به کسایی میگن که الگریتم رمزنگاری رو میسازن
Cryptoanalyst به کسایی میگن که الگریتم رمزنگاری رو آنالیز میکنن و ازش مشکل و باگ پیدا میکنن
یک نفر میتونه هر دو این ها هم باشه، و این نکته هم شایان ذکره که برای هر دو این موارد به دانش فوق العاده بالایی در زمینه ریاضیات نیازه !
در ادامه از الگریتم AES به عنوان مثال نام برده شده که این الگریم چندین سال آزموده شده و کلی cryptographer/analyst روش کار کردن تا مطمئن بشن ازش مشکلی میتونن دربیارن یا نه و بعد اینکه مطمئن شدن امنه ازش استفاده کردن ! (این ازمون توسط NIST که یه مرکز استاندارد جهانیه برگزار شده) و این درواقع همون اصل کرکهوفه ! (الگریتم های نظامی ولی از این قاعده مستثنا هستن، پس الان میتونید حدس بزنید که خیلی امن نیستن ;) )
1.4.1 در ادامه کتاب درمورد Key Exchange یا تبادل کلید صحبت میکنه و DH رو معرفی میکنه ، به صورت خلاصه ( خیلی ساده توضیح داده) :
1 - دو فرد ابتدا کلید های عمومیشونو بهم میدن
2 - هر کدوم با کلید خصوصی خودشون و کلید عمومی دیگری یه مقدار مشترک رو محاسبه میکنن
3 - اگر کسی این وسط شنود یا استراق سمع کنه نمیتونه به اون مقدار مشترک برسه چون کلید خصوصی هیچ کدومو نداره !
اینجا چالشی که پیش میاد اینه که اگر این دوتا هر کلید عمومی ای رو قبول کنن ، خب ما این وسط کلید عمومی خودمونو میزاریم دیگه :) ایده MITM هست و اینجا لزوم حضور یه Primitive دیگه هست برای اعتبار سنجی طرف مقابل ، قبل شروع تبادل کلید
1.5 طبقه بندی انواع الگریتم های رمزنگاری:
ما دونوع ساختار در رمزنگاری داریم (ساده ترش اینه که به دو روش کلا الگریتم های رمزنگاری رو میسازیم)
اولین روش مبتنی بر ریاضی هست که بهش Math-based میگن که بر اساس مسائل حل نشدنی ریاضی ما جلو میریم که دربارش تو سری مقدماتی صحبت کردیم، این دسته از الگریتم ها کند هستن ولی خب امنیتشون تضمین شدس ، مثلا RSA (این روش کنده)
دومین روش مبتنی بر اکتشافه، بر اساس مشاهدات تجربی و تجزیه و تحلیل های اماری هست (نشستن انقد نمونه ازش ساختن و ازمایش کردن که دیدن عه جواب داد و الان امنه !) و نمونشم AES هست (این روش خیلی سریعه)
درکل ساختار های متقارن (الگریتم های متقارن) بیشتر تجربی هستن (روش دوم) و الگریتم های نامتقارن اکثرا به روش اول هستن
1.6 رمزنگاری تئوری در مقابل رمزنگاری کاربردی(رمزنگاری دنیای واقعی):
آقای وونگ در کتاب به اینکه رمزنگاری تئوری چقد از دور قشنگه و چقد تحقیق و مقاله دربارش هست میپردازه و در آخر میگه که این ها به درد نمیخورن چون هیچوقت توی دنیای واقعی ازشون استفاده نشده ! درواقع خیلی از مباحث رمزنگاری که با روی کاغذ با فرمول های ریاضی قابل اثباتن، توی دنیای واقعی جایی ندارن و از همین رو این کتاب فقط به مباحث و تئوری های مورد نیاز میپردازه و نه چیز های غیر کاربردی
آقای وونگ اشاره میکنه که برای اجرای الگریتم های اون ها هنوز کامپیوتری ساخته نشده که قدرتمند باشه 😂 در ادامه چالش های دنیای واقعی رو مطرح میکنه که شامل کم بودن مقدار خروجی رمز شده نسبت به ورودیه ، بحث امنیت الگریتمه ، سرعت اجرای الگریتمه و...
1.7 پروسه ساخت یک الگریتم :
در اینجا آقای وونگ به نحوه ساخت یک الگریتم میپردازه و میگه و یه طور داستان واری این مسئله رو خیلی قشنگ بیان میکند (طبق کتاب Choose Your Own Adventure بیان میکند)
فرد شماره 1 : یک رمزنگار (Cryptographer)
فرد شماره 2 : یک فردی که در یک صنعتی کار میکند و نیاز به یک راه حل برای مشکل خودش دارد
فرد شماره 3 : در یک جای دولتی کار میکنید و مشغول رمزنگاری هستید
🔶 اگر فرد 1 هستید برید قدم اول
🔶 اگر فرد 2 هستید برید قدم دوم
🔶 اگر فرد 3 هستید برید قدم سوم
🟧 قدم اول : شما محققی هستید که در یک شرکت یا دانشگاه یا یک سازمان دولتی مثل NIST یا NSA هستید و بودجه میگیرید که روی موارد مختلف رمزنگاری و امنیت آن کار کنید
🔶 شما یک Primitive جدید ابداع میکنید، برید قدم چهارم
🔶 شما یک ساختار جدید ابداع میکنید، برید قدم پنجم
🔶 شما یک مسابقه برگزار میکنید ، برید قدم ششم
🟧 قدم دوم : صنعت نیازی دارد ، به مشکلاتی میخورد و نیاز به یک استاندارد جدید و خوب دارد، مثلا Wi-Fi Alliance یک سازمان غیر انتفاعی است که توسط شرکت های علاقه مند تامین مالی میشود تا مجموعه ای از استاندارد هارا برای پروتوکول Wi-Fi تولید کند
یا مثلا بانک ها برای تولید یک استاندارد های پرداخت های خود دست به ساخت (PCI-DSS) یا Payment Card Industry Data Security Standard زدند که وقتی شما میخواهید با کارتتان مبلغی پرداخت کنید با استفاده از این استاندارد ها اون کار رو به صورت امن انجام میدن
🔶 شما تصمیم گرفتید برای تحقیقات زیادی که مورد نیاز هست، بودجه بپردازید، به قدم اول بروید
🔶 شما تصمیم میگیرید یک پروتوکل اولیه یا new primitive را استاندارد سازی کنید، به قدم پنجم بروید
🔶شما یک مسابقه عمومی برگزار میکنید برای سنجش امنیت پروتوکل معرفی شده، به قدم ششم بروید
🟧 قدم سوم : شما برای دولت کشورتان کار میکنید و نیاز دارید مثلا از یک الگریتم برای امن سازی یک شبکه خاص استفاده کنید یا ارز دیجیتال خودتان را بیرون بدهید؛ مثلا NIST که بالاتر درموردش گفتیم اجبار میکند که شرکت های داخل ایالات متحده از چه الگریتم های رمزنگاری ای استفاده کنند (مثل افتا ما) و این اجبار ها گاهاا موفقیت آمیز بوده و گاها باعث شده که کلی از دیتاها از دست برود !!!
به دنبال افشا های اسنودن در 2013 مشخص شد که NSA به طور هدفمند در الگریتمی که معرفی کرده درب پشتی یا Backdoor گذاشته که فقط خودش بتواند به دیتاهای شما دسترسی داشته باشد ( برای اطلاعات بیشتر این مقاله مطالعه شود : Dual EC: A Standardized Back Door” by Bernstein et al ) و به دنبال این افشا گری جامعه رمزنگاری اعتماد خودش را به NIST و سازمان های مشابه دولتی از دست داده، و نه فقط در آمریکا بلکه در روسیه هم مشخص شده که استاندارد روسی GOST هم قربانی همین رفتار شده !!
در اینجا متنی میبینیم از NewYork Times که مجله معروفیه تو امریکا و نوشته رمزنگار ها کلی سعی کردن این backdoor هارو کشف کنن و از 2006 و 2007 ما سند داریم که حتی متخصص های رمزنگاری ماکروسافت هم تایید کردن که به عمد توی یک سری الگریتم ها حفره گذاشته شده و NSA نامه زده بهشون که ساکت شید دیگه، عه :)
🔶 شما برای برخی تحقیقتا هزینه میکنید، برید قدم اول
🔶 شما یک مسابقه عمومی برگزار میکنید برای سنجش امنیت پروتوکل معرفی شده، به قدم ششم بروید
🔶 شما میخواهید پروتوکل اولیه یا new primitive مدنظرتون رو استاندارد سازی کنید، به قدم هفتم بروید
🟧 قدم چهارم : به عنوان محقق شما یک چیز جدید کشف میکنید :) ، شاید قبل شما هم کشف کرده باشند یا شاید شما خیلی خوش شانس باشید و یه چیز خوب کشف کنید (یه Primitive جدید و متنوع)، و به مسابقه ببریدش و در مقابل حملات پیروز بشه و احتمال زیاد هم شکست بخوره !!
🔶 شما موفق میشوید و Primitive شما پیاده سازی میشود، به قدم پنجم بروید
🔶شما شکست میخورید و امکان پیاده سازی Primitive شما نیست، به قدم اول برگردید
🟧 قدم پنجم : یک پروتوکل یا ساختار جدید پیشنهاد میشود، یک فرد یا تیم از رمزنگاران یک الگریتم جدیدی را پیشنهاد میکند؛ برای مثال AES که الان استاندارد شده در واقع دو نفر با اسامی Vincent Rijmen و Joan Daemen پیشنهادش دادن که اسم اصلی الگریتم شده Rijndael
(فرق قدم 4 و 5 اینه که شما تو قدم 4 یک کانسپت یا ایده اولیه دارید، ولی توی قدم 5 امدید عملیش کردید و پروتوکلش کردید و قابل تست و ارزیابی و استفادس)
(اینجا منظور از ساختار یا construction درواقع یه نقشه یا BluePrint هست که شما با اون میفهمی کدوم Primitive هارو باهم استفاده کنی که به هدفی که میخوای برسی، درواقع نقشه راهنماس بیشتر )
🔶 شخصی میخواهد از پروتوکل شما استفاده کند یا روی ساختار شما پروتکل یا سیستمی بنا کند، به قدم 5 بروید
🔶 شما در یک مسابقه عمومی شرکت میکنید و برنده میشوید، به قدم ششم بروید
🔶 شما میخواهید استاندارد بگیرید و باید مراحل اداری و تبلیغاتشو انجام بدید، به قدم هفتم بروید
🔶 شما تصمیم گرفتید تا ساختار خودتونو ثبت کنید، به قدم هشتم بروید (ثبت /اختراع یا patent کلمه ایه که شما وقتی چیزی منحصر به فرد خودتونو دارید و میخواید بقیه ازش استفاده نکنن یا ازتون اجازه بگیرن اونو patent میکنید)
🔶 شما یا شخص دیگه ای تصمیم میگیرید که از ساختار یا پروتکل خودتون استفاده کنید و اونو پیاده سازی کنید، به قدم نهم بروید
(منظور از پیاده سازی اینه که مثلا کتابخونشو برای زبان های برنامه نویسی بنویسید)
🟧 قدم ششم : شما در مسابقه پیرو میشوید، برای مثال AES الگریتمی بود که 10 سال تستش در مسابقات عمومی طول کشید و در طی اون 10 سال الگریتم هایی که امن بودن فقط دووم اوردن (فقط Rijndael دوم اورد که شد AES)
🔶 شما شانس اوردید و پس از سال ها تست الگریتم شما موفقیت آمیز مقاومت کرده و شما برنده شدید، به قدم هفتم بروید
🔶 متاسفانه باختید، به قدم اول بروید
🟧 قدم هفتم : یک الگریتم یا پروتکل استاندارد سازی شده، یک استاندارد معمولا توسط دولت یا یک سازمان استاندارد منتشر میشود ،مثلا NIST به طور مداوم استاندارد های رمزنگاری را منتشر میکند، یا مثلا یک نهاد دیگر که در حوزه رمزنگاری استاندارد هارا منتشر میکند (که دولتی نیست) Internet Engineering Task Force (IETF) هست که پشت بسیاری از استاندارد هاست، مثل TCP، UDP، TLS و.. استاندارد های IETF همشون تحت عنوان RFC یا called Request For Comment شناخته میشن و طبقه بندی میشن و با کد خاص خودشون قابل پیدا شدن هستند
بعضی اوقات یک شرکت یک استاندارد رو به طور مستقیم و بدون واسطه منتشر میکند، مثلا شرکت RSA Security LLC با بودجه خودشون 15 تا سند مربوط به استاندارد های رمزنگاری کلید عمومی (PKCS) رو برای مشروعیت بخشیدن به الگریتم ها و تکنیک هایی ک شرکت در اون زمان استفاده میکرد منتشر کرد، این امر امروزه خیلی نادر است و اکثرا از طریق IETF جلو میروند
🔶 الگریتم یا پروتوکل شما پیاده سازی میشود، به قدم نهم بروید
🔶 هیچکس به استاندارد شما محل نمیگذارد، به قدم اول بروید
🟧 قدم هشتم : یک patent منقضی میشود، ثبت اختراع یا patent یعنی هیچکس از الگریتم شما استفاده نخواهد کرد، و پس از انقضای این paetnt میبینید که چقد علاقه برای استفاده پیدا خواهد شد، برای مثال الگریتمSchnorr که در سال 1989 میتوانست بهترین و معروف ترین الگریتم امضای دیجیتال شود چون ثبت اختراع شده بود ، DSA یا Digital Signature Algorithm امد و جای اون رو گرفت که ازش ضعیف تر هم بود، بعدها که در سال 2008 این ثبت اختراع از بین رفت کمی از شهرت خودشو بدست آورد
🔶 خیلی زمان گذشته و الگریتم شما فراموش شده، به قدم اول برگردید
🔶 ساختار شما برای بسیاری از سخت و ساز ها الهام بخش بوده، به قدم پنجم بروید
🔶 مردم میخواهند از ساختار شما استفاده کنند ولی نه قبل استاندارد سازی، به قدم 7 بروید
🔶 برخی از توسعه دهنده ها و برنامه نویس ها درحال استفاده از الگریتم و ساختار شما هستند، به قدم نهم بروید
🟧 قدم نهم : یک ساختار یا پروتوکل پیاده سازی میشود، دولپر یا توسعه دهنده یا همون برنامه نویس در اینجا باید این استاندارد رو بخونن و بفهمن و پیادش کنن (چه کد چه هرجا) به شیوه سریع و امن، یعنی اینجا هم امنیت مهمه و اگر درست پیادش نکنن فایده ای نداشته اون همه مرحله که پشت سر گذاشتیم (درواقع اینجا دولپر های معمولی اینکارو نمیکنن و یه سری Implementor که متخصصن و سنیور هستن دست به این کارا میزنن که مورد تایید هم باشن)
🔶کسی تصمیم میگیرد که این پیاده سازی ها توسط یک استاندارد پشتیبانی شود، به قدم هفتم برگردید
🔶 از کتابخانه شما بسیار استفاده میشود و مورد استقبال قرار گرفته، به قدم دهم بروید
🟧 قدم دهم : یک توسعه دهنده از پروتکل یا کتابخانه شما در محصولش استفاده میکند ، درواقع اینجا اون نیاز امنیت را شما حل کرده اید
🔶 درواقع Primtive شما اینجا مشکلی را حل کرده و نیازی را برطرف کرده اما استاندارد ندارد، بروید قدم هفتم
🔶 ایکاش به این زبان برنامه نویسی نوشته میشد، بروید قدم نهم
🔶 من از کتاب خانه سوء استفاده کردم یا ساختار شما خراب است،بازی تمام شد !!
نیاز نیست کامل بفهمید مراحل بالارو ، کلی درکش کرده باشید کافیه !
عکس بالا کل حرفاییه ک زدیم به صورت خلاصه و ساده
آقای وونگ در ادامه یه هشدار هم میده که کار ساخت الگریتم رمزنگاری بسیار حرفه ای و پیچیدس و علاوه بر دانش بالا ، نیازمند استمرار هم هست و اینکه الگریتم شما در طی چندین سال شکست نخوره ! و میگه که در انتهای این کتاب نباید از خودتون توقع داشته باشید که بتونید الگریتم بسازید، بلکه بدونید چطوری ساخته میشه و از هر کدوم کجا و چطور استفاده کنید و در بهترین حالت میتونید تا حدی دانش cryptoanalyse بدست بیارید
همچنین با تاکید اشاره میکنه که رمزنگاری فرایندیه که پیاده سازی و استفاده ازش بسیار حساسه ! یعنی فقط ساخت الگریتم و کلید و امن نگه داشتنتش مهم نیست، باید پیاده سازی و استفاده ازشم به صورت امن باشه وگر نه کار رو خراب میکنه (اگر برنامه نویسی نا ایمن از کتابخونه استفاده کنه یا سوتی بده به نحوی که کل کار خراب بشه)
فصل مقدمات تموم شد، فصل بعدی سراغ مبحث Hashing میریم، امید وارم براتون مفید بوده باشه
منتظر سوالات، انتقاد و پیشنهاداتتون هستم
یاعلی ;)
مطلبی دیگر از این انتشارات
رمزنگاری کاربردی - قسمت چهارم : Authenticated encryption
مطلبی دیگر از این انتشارات
رمزنگاری کاربردی - قسمت سوم : Message authentication codes
مطلبی دیگر از این انتشارات
رمزنگاری کاربردی - قسمت پنجم : Key exchanges