رمزنگاری چیست، که بود و چه کرد؟

مباحث امنیت و رمزنگاری از جمله مباحثی هستن که اگر توسعه دهنده باشید حتما باهاشون درگیر میشین، ولی ممکنه زمان کافی برای جستجو دربارش نداشته باشین. هدفم اینه که سعی کنم توی یک سری پست ابتدا مفاهیم اولیه اش رو باهم بررسی کنیم و بدون اینکه درگیر ریاضیات خیلی پیچیده بشیم، کم کم با مسائل، حملات و کاربردهاش دست و پنجه نرم کنیم.این مطالب به درد کیا میخوره؟برای توسعه دهنده ها، مخصوصا Backend کاراافرادی که به رمزنگاری علاقه دارنافرادی که میخوان توی مسابقات CTF شرکت کننبچه ها Pentesterتعاریف (در تعاریف برای سادگی فرض میکنیم داده ها متن هستن):رمزنگاری | Cryptography:تبدیل متن از حالت خوانا به حالت رمزشده با استفاده از کلید بطوری که بدون کلید به راحتی نتونیم به حالت خوانا دسترسی پیدا کنیم.متن آشکار | حالت خوانا |‌ PlainText:حالت عادی و خوانای اصلی متن. یعنی متنی که هیچ گونه عملیات رمزنگاری ای روش انجام نشدهمتن رمز شده | حالت ناخوانا |‌ CipherText:حالت رمزشده و ناخوانای متن بعد از رمزنگاری. یعنی متنی اصلی ای که با استفاده از کلید، عملیات رمزنگاری ای روش انجام شده.کلید |‌ Key | Secret:رمزی که برای تبدیل متن خوانا به متن ناخوانا و یا برعکس استفاده میشه. معمولا کلید باید تنها بخش نامعلوم الگوریتم باشه.کدگزاری‌ |‌ Encoding:مشابه رمزنگاری، اما بدون استفاده از کلید‌ (در ادامه بیشتر صحبت میکنیم).کدگشایی |‌ Decoding:مشابه رمزگشایی، اما بدون استفاده از کلید‌ (در ادامه بیشتر صحبت میکنیم).درهم سازی |‌ Hashing:یک نوع روش رمزنگاریه یک طرفه، که میتونه برای اهداف مختلف بدون کلید هم استفاده بشه.پنهان نگاری |‌ Steganography:بر خلاف رمزنگاری که هدف ناخوانا کردن متن هست، در پنهان نگاری هدف مخفی کردن متن توی یه چیزه دیگه هست،‌ به شکلی که اگر یکی اون چیز رو ببینه متوجه وجود (یا متن اصلی) متن مخفی شده نشه!مطالعات رمز |‌Cryptoanalysis:به علم رسیدن به متن خوانا، بدون تست کردن تمام حالت های کلید مطالعات رمز میگن. معمولا اینکار بر اساس پیدا کردن نقطه ضعف در روش الگوریتم رمزنگاری انجام میشه.کرک |‌ شکستن رمز | Crack | Brute force:به روش رسیدن به متن خوانا، با تلاش برای تست کردن تمام حالت های کلید کرک کردن میگن. بعضی وقت ها توی این روش سعی میشه از یک سری کلماتی که احتمال استفادشون بیشتر هست استفاده بشه.مبهم سازی |‌ Obfuscation:در مبهم سازی معمولا هدف اینه که نحوه انجام یک کاری رو، به قدری پیچیده کنیم که مشخص نشه هدف و نحوه انجامش چطوری بوده. البته در رمزنگاری، مبهم سازی الگوریتم حرام است که بعدا بیشتر توضیح میدیم.فرق بین رمزنگاری و کدگزاری چیه ؟!کدگزاری معمولا با رمزنگاری اشتباه گرفته میشه که کاملا متفاوت هست. توی رمزنگاری معمولا هدف، ناخوانا کردن متن با کلید هست بطوری که دیگران بدون دونستن کلید نتونن به متن اصلی برسن. اما توی کدگزاری از هیچ کلیدی استفاده نمیشه چون معمولا هدف، کد کردن متن به روش دیگه ای هست که برای فضای دیگه ای قابل فهم باشه. مثلا اگر یک متن رو از فارسی به انگلیسی ترجمه کنیم، یک کدگزاری انجام شده. چون هدف مخفی کردن کلید نبوده و میخواستیم برای کسایی که انگلیسی متوجه میشن متن رو بنویسیم،‌ هرچند ممکنه بقیه که انگلیسی بلد نیستن فکر کنن متن رمز شده هست!تاریخچه‌:رمزنگاری معمولا برای مخفی کردن پیام های سری بود، یعنی تغییر ظاهر پیام جوری که هیچکس بدون داشتن کلید مورد نظر نتونه به متن اصلی برسه. بخاطر طولانی نشدن مطلب خیلی در مورد تاریخ صحبت نمیکنم و یک مثال ساده رو بررسی میکنیم.معمولا اولین مثالی که توی رمزنگاری های قدیمی مطرح میشه، مثال رمزنگاری سزار هست. سزار برای اینکه پیام های مهمش رو ارسال کنه، همیشه اونها رو با روش ابداعی خودش رمز میکرد. اینکار باعث میشد که اگر پیامش به دشمناش برسه و اونها فکر کنن پیام به یک زبان خارجی نوشته شده که اونها بلد نیستن.رمزنگاری سزار خیلی خیلی ساده هست. برای رمزنگاری کافیه که شماره هر حرف در زبان انگلیسی رو ۳ حرف شیفت بدین. مثلا هروقت حرف A رو دیدید، بجاش حرف D بزارید. هر وقت B دیدید، E بزارید و .... اینجا کلید در توی عملیات ما ۳ هست. که میتونه عوض بشه. برای ۳ حرف آخر هم بر میگردیم از اول حرف رو انتخاب میکنیم. یعنی رمز کردن حرف X با کلید ۳ میشه حرف A.tutorialspoint.comس از رمزگشایی هم که بدیهیه، کافیه معکوس عملیات انجام بشه. یعنی بجای D، حرف A رو قرار بدید و ...در ادامه سعی میکنیم هر مبحثی که گفته شد رو با مثال و سوال های رمزنگاری بر اساس مسابقات Ctf و مباحث مورد نیاز توی توسعه نرم افزار بررسی کنیم.این نوشته اولین در بلاگ شخصی من منتشر شد.