در این مقاله سعی بر این است که در مورد روش های مختلف رمزنگاری و الگوریتم های آن مانند الگوریتم MD5 و کاربرد های آن توضیح داده شود.
الگوریتم MD5 چیست و چگونه کار می کند.
یکی از عمده ترین مشکلات امروزی در فضای مجازی و امنیت داده ها این است که ما بیشتر توجه خود را به سمت امنیت اطلاعات معطوف می کنیم و همین مورد باعث می شود که ما درک درستی از امنیت و الگوریتم های امنیت نداشته باشیم. بیشتر توجه کاربران امروزه به مقوله امنیت در نهایت منجر به دانلود و استفاده از کتابخانه ها و بانک های اطلاعاتی میشود بدون اینکه درک صحیحی از نحوه عملکرد این الگوریتم ها و کتابخانه هایشان داشته باشند.
در این مقاله سعی شده است که عملکرد این الگوریتم برای افرادی که میخواهد از این الگوریتم ها استفاده کننده به صورت کامل توضیح داده شود. الگوریتم MD5 از جمله الگوریتم های پر کاربرد برای بخش های مختلف مانند ادغام پرونده ها در بانک های اطلاعاتی، تائید رمز و همچنین مدل رمزنگاری می باشد.
بررسی الگوریتم MD5 و تشابه آن با الگوریتم SHA-1
از لحاظ تکنیک های رمز نگاری الگوریتم MD5 و الگوریتم SHA-1 تقریباً مشابه به یکدیگر هستند. در این بین جزئیاتی در عملکرد این الگوریتم ها وجود دارد که آنها را از یکدیگر متمایز می کنند. این جزئیات را می توانید در توضیحات زیر مطالعه کنید:
1- اضافه کردن چند بیت
به پیام ارسال شده در الگوریتم MD5 اگر چند بیت اضافه کنیم. با این کار می توان از مقدار استاندارد 64 بیتی برای رمزنگاری اطلاعات عبور کنیم. همچنین با اضافه کردن چند بیت وارد استاندارد رمزنگاری 512 بیت نمی شویم. این اضافه شدن بیتها در واقع با اضافه کردن عدد 1 به پایان پیام ها انجام می شود. سپس بیت 0 را به پیام اضافه می کنیم.
2- اضافه کردن مابقی بیت های باقی مانده
در این مرحله ما 64 بیت باقی مانده را کم کم به پیام اضافه می کنیم تا طول پیام به مضرب دقیقی از 512 برسد. بیت هایی که در این مرحله اضافه می شود به طول پیام بستگی دارند. به عنوان مثال اگر طول پیام 8 است باید در 8 بیت اول مقدار 1 را اضافه کنیم و برای 56 بیت بعدی مقدار 0 را اضافه کنیم. اگر طول پیام 64 بود تمام 64 بیت را 1 قرار می دهیم و اگر طول پیام بیشتر از 64 بود باید تا مقدار 64 بیت اول را 1 و مابقی را 0 قرار دهیم.
3- بافر اولیه در الگوریتم MD5
این مرحله یکی از مهمترین مراحل در شکستن الگوریتم MD5 است. در این مرحله ما شاهد چهار بافر مختلف با عنوان (A,B,C&D) هستیم که هر کدام از این بافر ها 32 بیت طول دارند. مقادیر پیش فرض این بافر ها به صورت زیر است:
A = 0x67452301
B = 0xefcdab89
C = 0x98badcfe
D = 0x10325476
4- هر بلوک 512 بیتی را پردازش کنید
در این مرحله باید با توجه به مراحل قبلی که انجام داده ایم عمل کنیم. در مرحله های قبلی دیدیم که در مجموع 64 عملیات را در هر تکه 512 بیتی انجام می دهیم. در این مراحل هر دور عملیات به 4 مرحله و هر محله به 16 عملیات تقسیم می شود. تصویری زیر در واقع تصویری از کل عملکرد فشرده سازی را نشان می دهد؛ یعنی مجموع 64 عملیات انجام شده:
ویژگی خاص هر یک از این عملیات ها در این است که در هم دور عملکرد های منحصر به فردی وجود دارد که در نوشته های زیر آن ها را مشاهده می کنید:
F(B,C,D) = (B AND D) OR ((NOT B) AND D)
G(B,C,D) = (B AND D) OR (C AND (NOT D))
H(B,C,D) = B XOR C XOR D
I(B,C,D) = C XOR (B OR (NOT D))
برای دور اول از 16 عملیات مشخص شده ما از رابطه F(B,C,D) استفاده خواهیم کرد. سپس از G(B,C,D) و H(B,C,D) و برای آخرین دور از رابطه I(B,C,D) استفاده می کنیم.
همانطور که مشاهده می کنیم ما یک شناسه رمزنگاری شده 512 بیتی را به 16 قسمت تقسیم کردیم و هر یک از این بخش ها 32 بیت است که ما به آنها M(1) و M(2) و غیره اشاره می کنیم. در این رابطه ها ما یک مقدار ثابت به نام K(i) داریم که برای هر کدام از این عملیات ها به صورت مقدار منحصر به فرد وجود دارد؛ یعنی مقدار K(i) 64 مورد است. دلیل این تعداد از مقدار ثابت در زیر مشخص شده است:
K[ 0.. 3]:= { 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee }
K[ 4.. 7]:= { 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501 }
K[ 8..11]:= { 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be }
K[12..15]:= { 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821 }
K[16..19]:= { 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa }
K[20..23]:= { 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8 }
K[24..27]:= { 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed }
K[28..31]:= { 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a }
K[32..35]:= { 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c }
K[36..39]:= { 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70 }
K[40..43]:= { 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05 }
K[44..47]:= { 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665 }
K[48..51]:= { 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039 }
K[52..55]:= { 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1 }
K[56..59]:= { 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1 }
K[60..63]:= { 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 }
همچنین در هر عملیات ما باید مقداری را برای بخش آخرین بیت سمت چپ اختصاص دهیم و مقدار این بیت مشخص کننده هر عملکرد می باشد. بیت هایی که ما باید به سمت چپ بچرخانیم در نوشته های زیر مشخص شده است. مقادیر مشخص شده S برای هر عملیات در نوشته های زیر قرار داده شده است:
s[ 0..15]:= { 7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22 }
s[16..31]:= { 5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20 }
s[32..47]:= { 4,11,16,23,4,11,16,23,4,11,16,23, 4,11,16,23 }
s[48..63]:= { 6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21 }
در ادامه چگونگی انجام عملیات برای الگوریتم MD5 به شما نشان داده شده است.
تصویر به خوبی نشان می دهد که در هر عملکرد چه اتفاقی می افتد. در داخل هر عملیات مجدداً مجموعه ای از توابع وجود دارد که خروجی های کار را در اختیار ما قرار میدهد. این تابع به نوبه خود به عنوان ورودی در محله بعد استفاده می شوند.
ما در الگوریتم MD5 این کار ها را بار ها و بارها انجام می دهیم تا به آخرین قسمت از پیام 512 برسیم. در نهایت خروجی برنامه به دست آمده مانند تصویر زیر خواهد بود. در الگوریتم MD5 که دارای شناسه 128 بیتی است هر کدام از رابطه های A,B,C,D از 32 بیت تشکیل شده اند که مجموع آنها 123 بیت خواهد شد.
نتیجه گیری
با استفاده از مراحل بالا ما الگوریتم MD5 را به راحتی شکستیم. به همین دلیل است که از این روش رمزنگاری و الگوریتم MD5 نباید در بانک های اطلاعاتی و بانک های فروشگاهی در وب سایت ها استفاده شود.
یکبار دیگر مراحل بالا برای شکستن الگوریتم MD5 را بررسی می کنیم.
پیام هشدار ارسال شده در ابتدا با 448 قطعه تقسیم می شود و در آخرین قطعه ما یک 64 بیت را به آن اضافه می کنیم. با این کار تعداد کل بیت ها 512 می شود و این پیام به بلوک بعدی در پردازش ارسال می شود. این بلوک 512 بیتی به 16 قسمت و هر قسمت به 32 بیت تقسیم می شود که به عنوان ورودی عملیات به مرحله بعدی پردازش ارسال می شوند.
در اینجا ما وارد قسمت اصلی الگوریتم MD5 می شویم. در این الگوریتم در مجموع 64 عملیات وجود دارد که برای بلوک های 512 بیتی انجام می شود. این عملیات ها با استفاده از مقادیر پیش فرض A,B,C,D که در بالا به آنها اشاره کردیم انجام می شوند.
در هر عملیات مجموعه ای از توابع وجود دارند که در هر عملیات از آنها استفاده می شود و مقادیر این تابع به صورت پیش فرض تعریف شده اند؛ و اینکه در هر عملیات چه تابعی تعریف می شود قابل پیش بینی است.
64 عملیاتی که قرار است انجام شود نیز به 4 دور مختلف تقسیم می شود که در هر دور نیز از توابع مشخصی استفاده میشود. بخش های 32 بیتی که در پیام ما قرار داده ایم به عنوان ورودی در مراحل بعدی عمل می کنند و از مقادیر پیش فرض و تعریف شده K(i) استفاده می کنند. در نهایت بیت هایی که در انتها و سمت چپ هر کدام از توابع قرار دارند به صورت پیش فرض وارد عملیات گردش به چپ می شوند که این بیت ها نیز قابل شناسایی بوده و مشخص می باشند. با توجه به این موارد می توان پیام های رمز نگاری شده بر اساس الگوریتم MD5 را به راحت شکست و از آنها سوءاستفاده کرد.
منبع : https://medium.com/bugbountywriteup/breaking-down-md5-algorithm-92803c485d25