اگر جدول ASCII رو تا حدودی بشناسید ، خیلی خوب میدانید که برای هر کارکتری که در دنیای حقیقی اون رو میشناسیم (مثل aB,b*&!... ) در کامپیوتر یک عدد خاص اختصاص داده ایم ، برای مثال کارکتر A برابر با عدد 65 و همچنین کارکتر b برابر با عدد66 خواهد شد) با این فرض خواهیم فهمید که هرگاه عبارتی را به کامپیوتر وارد میکنیم ، خود کامپیوتر آن را تبدیل به یکسری اعداد خواهد کرد و از این پس تمام اتفاقاتی که قرار است روی آن عبارت انجام شود ، درحقیقت با تغییر در عدد آن کارکتر انجام خواهد شد.
بدیهی است که اگر اعداد را از کامپیوتر بگیریم با یک تطابق ساده میتوانیم تک تک کارکتر ها را شناسایی کنیم ، مثلا اگر سیستم به ما عدد ۷۰را برگرداند به راحتی خواهیم فهمید که کارکتر مذکور F خواهد بود.
دقیقا مشکل از همینجا به وجود می آید !
گاهی اوقات داده هایی در کامپیوتر منتقل میشود که شامل اطلاعات محرمانه است و اگر هر یک از کارکتر ها رمزنگاری نشوند ، مثل فرایندی که در بالا انجام دادیم ، با یک تطبیق ساده ، تمامی اطلاعات با جزئیات تمام و کمال به دست خواهند آمد.
اینجاست که الگوریتم های رمزنگاری به کمکمون میان و راه حل نسبتا خوبی در اختیارمون قرار خواهند داد …
اکثر الگوریتم های رمزنگاری (تاکید میکنم “اکثر” !) با ایجاد یک تغییر در اعداد مختص به هر کارکتر باعث خواهند شد که عملیات تطبیق سخت و سخت تر شده تا جایی که تعداد حالت ممکن به حدی زیاد شود که این فرایند عملا غیر بازگشت پذیر شود!
فرض کنید به عدد هر کارکتر ۲۰ واحد اضافه شود در این صورت کارکتر A به جای ۶۵ برابر با ۸۵ که عدد مختص به کارکتر U می باشد تبدیل می شود و باعث به هم ریختگی یک عبارت خواهد شد، به نحوی که در صورت تطبیق اعداد با کارکتر ها به یک عبارت نا معلوم خواهیم رسید …
شاید با خودتون بگین که خوب این که کاری نداره ، با فرض اینکه بدونیم چه مقدار اعداد ما تغییر کرده اند، میتوانیم خلاف اون رو اجرا کنیم تا به رشته عبارت اصلی خود برسیم ، اما باید خدمتتون عرض کنم که این فرایند اینقدر ها هم به آسونی برگشت پذیر نیست ، در واقع میشه گفت MD5 به هیچ وجه برگشت پذیر نیست! گاهی عملیات های ریاضی اون به حدی پیچیده خواهند شد که انجام عملیات معکوس بسیار دشوار یا حتی غیر ممکن خواهد شد.
حالا که به مفهوم رمزنگاری ،نگاه نسبتا کوچیکی پیدا کردیم بریم سراغ اینکه یکی از این متد های رمزنگاری رو بررسی کنیم ، لازم به ذکره که امروزه انواع مختلفی از رمزنگاری وجود داره که تو این مقاله تصمیم دارم در مورد یک مدل خاص و البته معروف اون به نام MD5 صحبت کنم .
همون طور که قبل تر هم توضیح دادم MD5( مخفف MESSAGE-DIGEST ) یک متد رمزنگاریست که از طریق اعمال یکسری تغییرات در ساختار یک عبارت آن را دچار تغییر و تحول خواهد کرد…
اما هدف اصلی من از تعریف این همه داستان و مقدمه رسیدن به پاسخ این سواله که MD5 چه الگوریتم و مراحلی رو طی میکنه که انجام فرایند معکوس رو سخت تر یا عملا غیر ممکن خواهد کرد؟!
در اولین قدم رشته یا عبارتی رو که وارد میکنیم با هر طول و مقداری که باشه به قسمت های ۵۱۲ بیتی تبدیل میکنه و در ۶۴ بیت پایانی قسمت آخر (دقت کنید ! ۶۴ بیت پایانی قسمت آخر) طول رشته را قرار خواهد داد ؛ اینجا ممکنه یه سوال پیش بیاد که اگر بسته ما ضریبی از ۵۱۲ بیت نبود ، برای بیت های اضافه چه اتفاقی خواهد افتاد؟
در پاسخ پیشنهاد میکنم که به نمودار زیر یه نگاه بندازین تا سوالتون برطرف بشه
خوب بیاین با هم یک دور مرور کنیم:
عبارتی که قراره از طریق این الگوریتم رمزنگاری کنیم رو به صورت بسته های ۵۱۲ بیتی تقسیم کردیم و در ۶۴ بیت انتهایی آخرین قسمت هم طول رشته رو قرار دادیم .
قبل از اینکه وارد جزئیات بشیم ، یکبار به صورت کلی ، فرایندی که انجام میشه رو با هم مرور کنیم…
الگوریتم اصلی MD5 توسط ۴ بسته ۳۲ بیتی (معادل یک رشته ۱۲۸ بیتی) کار اصلی خودش رو انجام خواهد داد
علاوه بر این هر کدام از بسته های ۵۱۲ بیتی را به ۱۶ بسته ۳۲ تبدیل خواهیم کرد (M0,M1,…,M15)
(لطفا از این قسمت مقاله به بعد، همزمان که متن رو میخونید به شکل زیر هم توجه کنید)
مقادیر بسته D و C و B بدون هیچ تغییری به بسته A(جدید) و D(جدید) و C(جدید) منتقل خواهند شد.
اما مقدار بسته A دچار تغییراتی می گردد و در نهایت به بسته B منتقل(جدید) خواهد شد(اگر به عکس بالا دقت کنید ، میبینید که در هر بار اجرای این فرایند داده های هر کدام از بسته ها به بسته بعدی خود منتقل میشود)
برسیم به تغییرات بسته A که میشه گفت مهم ترین فرایند رمزنگاری MD5 در همین قسمت انجام خواهد شد.
در هر مرحله حاصل عبارت FUNCTION با مقدار بسته A جمع خواهد شد.
(از قبل میدانیم این فرایند ۶۴ بار تکرار خواهد شد ، هر یک از ۴ فرمول زیر ۱۶ بار انجام خواهد شد (۴*۱۶=۶۴) یعنی برای مثال در ۱۶ بار ابتدایی فرمول اول و در ۱۶بار دوم فرمول دوم … اعمال خواهد شد )
+ حاصل عبارت باینری(دودویی) به دست آمده از فرایند های بالا (که در واقع یک مجموعه از بیت ها می باشد)، سه بیت به سمت چپ شیفت پیدا خواهند کرد.
(برای مثال وقتی میخواهیم یک عبارت را سه بیت شیفت دهیم …:)
+ آخرین مرحله از تغییر و تحولات بسته A اینه که مقدار به دست آمده از فرایند های بالا با مقدار بسته B جمع خواهد شد و به بسته B(جدید) منتقل خواهد شد.
در ادامه این فرایند تا زمانی تکرار میشود که بسته هایی که داریم به اتمام برسد ، اما توجه کنید در مراحل بعدی A , B , C , D هایی که اعمال میشوند همان بسته های ایجاد شده (دچار تغییر و تحول شده) در مرحله قبل هستند.
هربار که فرایند شماره ۱ به صورت کامل انجام میگیرد ، ۴ بسته A , B , C , D خواهیم داشت که دچار تغییر و تحول هایی شده اند ( هر کدام از این بسته ها ۳۲ بیت هستند و در نتیجه در هر بار اجرای کامل فرایند شماره ۱ ، یک رشته باینری به طول ۱۲۸ بیت به دست خواهد آمد)
این بسته های ۱۲۸ بیتی را به صورت ONES’ COMPLEMENT جمع خواهیم کرد و در نهایت یک عبارت ۱۲۸ بیتی خواهیم داشت که همان MD5 نهایی ما خواهد بود !
گفتیم فرایند MD5 غیر قابل بازگشت پذیراست ، پس چرا سایت های مختلفی هستند که MD5 را DECRYPT میکنند ؟!
جواب این سوال خیلی آسونه ، الگوریتم MD5 به دلیل پیچیدگی های محاسباتی (فعلا!) بازگشت پذیر نیست ، همه این سایت ها از دیتابیس هایی استفاده میکنند که در خیلی از موارد جوابی به شما نخواهند داد.
توضیحات یکی از همین سایت ها :
MD5 IS A 128-BIT ENCRYPTION ALGORITHM, WHICH GENERATES A HEXADECIMAL HASH OF 32 CHARACTERS, REGARDLESS OF THE INPUT WORD SIZE.
THIS ALGORITHM IS NOT REVERSIBLE, IT’S NORMALLY IMPOSSIBLE TO FIND THE ORIGINAL WORD FROM THE MD5.
OUR TOOL USES A HUGE DATABASE IN ORDER TO HAVE THE BEST CHANCE OF CRACLING THE ORIGINAL WORD.
JUST ENTER THE HASH IN THE MD5 DECODER IN THE FORM ABOVE TO TRY TO DECRYPT IT!