نمای کلی تابع هش MD5
**ام‌دی۵** (به انگلیسی: MD5)، یک الگوریتم رمزنگاری بر مبنای ریاضیات است که به صورت گسترده به عنوان تابع درهم‌ساز رمزنگارانه استفاده می‌شود.
این الگوریتم یک رشته با طول متفاوت را به عنوان ورودی می‌گیرد و یک **هَش** (به انگلیسی: Hash) تولید می‌کند. این هَش در واقع یک عدد یکتا بوده که در مبنای دو به صورت صفر و یک و یا به صورت کاراکتر نمایش داده می‌شود. چنانچه ورودی کوچکترین تغییری پیدا کند، هَش خروجی متفاوت خواهد بود. نکته مهم دیگر در هَش الگوریتم‌ها، برابری سایز خروجی فارغ از سایز ورودی است، به بیان دیگر چنانچه شما یک متن 100 کلمه‌ای را هَش کنید و یا یک متن 10 کلمه‌ای، سایز خروجی‌ها در هر دو حالت برابر خواهند بود. هَش الگوریتم‌ها در زمینه‌های مختلفی کاربرد دارند. ذخیره سازی کلمه عبور به صورت امن یکی از موارد کاربرد هَش الگوریتم‌ها می‌باشد. بدین مفهوم که به جای آنکه یک کلمه عبور عیناً بر روی رایانه ذخیره شود، ابتدا توسط هَش آن توسط ام‌دی5 تولید می‌شود و سپس آن هَش بر روی رایانه ذخیره می‌شود. این عمل باعث می‌شود در صورت آنکه اطلاعات رایانه به هر نحو لو برود، امکان بازیابی کلمه عبور وجود نداشته باشد. هنگامی که کاربر نیاز به ورود به سیستم را دارد، با وارد کردن کلمه عبور خود، ابتدا آن کلمه مجدداً توسط رایانه هَش می‌شود و خروجی با هَش ذخیره شده مقایسه می‌گردد، در صورت برابر بودن آن دو هَش، کاربر مجوز ورود می‌گیرد.

مقایسه با MD4
-------------

این الگوریتم حاصل تأثیر دادن نظرات تعدادی از استفاده کنندگان ام‌دی۴ به همراه مقادیری تغییر در ساختار الگوریتم برای افزایش قدرت آن می‌باشد.

  

الگوریتم ام‌دی۵ توسعه‌ای از الگوریتم ام‌دی۴ است با این تفاوت که‌ ام‌دی۵ کمی‌کندتر از ام‌دی۴ عمل می‌کند اما در طراحی آن بسیار محافظه‌کارانه عمل شده‌است.

  

ام‌دی۵ در شرایطی طراحی شد که ام‌دی۴ به علّت سرعت بالایی که دارد پذیرفته شده‌ اما از امنیت مناسبی در شرایط بحرانی برخوردار نیست، ام‌دی۵ کمی نسبت به‌ ام‌دی۴ کندتر شد ولی امنیت آن بیشتر گشت.

شرایط و نکات لازم
-----------------

در این متن منظور از «کلمه» تعداد ۳۲ بیت و «بایت» تعداد ۸ بیت داده می‌باشد. یک صف از بیت‌ها دارای خصوصیات طبیعی یک صف از بایت‌ها می‌باشند که هر گروه هشت تایی متوالی از بیت‌ها یک بایت را تشکیل می‌دهند که پرارزش‌ترین بیت در ابتدا قرار دارد. یک صف از بایت‌ها دقیقاً می‌باشد.

اجازه بدهید از x\_i به جای xi) x اندیس i) استفاده کنیم و اگر مقدار اندیس یک عبارت محاسباتی بود آن را در {} محدود می‌کنیم، مانند: {x\_{i-1. همچنین از ^ به عنوان علامت توان استفاده می‌کنیم، پس x^i یعنی x به توان i.

اجازه بدهید از علامت «+» برای اضافه کردن دو کلمه به هم استفاده کنیم. از x<<<5 به عنوان عملگر چرخش بیتی در کلمات استفاده می‌شود که x به‌اندازه ۵ بیت به چپ چرخش می‌کند.

از (not(x به عنوان عملگر نقیض بیتی، از X v Y به عنوان عملگر فصل (or) و از X xor Y به عنوان عملگر exclusive or و از XY به عنوان عملگر عطف (and) استفاده می‌کنیم.

توضیحات الگوریتم MD5
--------------------

فرض کنید ما b بیت پیام به عنوان ورودی داریم و تصمیم داریم خلاصه پیام آن را بدست آوریم. b در اینجا یک عدد نا منفی و صحیح است، b می‌تواند مقدار صفر داشته باشد و هیچ محدودیتی برای مضرب هشت بودن آن نیست و به هر اندازه می‌تواند بزرگ باشد. فرض کنید بیت‌های این پیام را بشود به صورت زیر نوشت:

m\_0 m\_1... m\_{b-1}

برای آوردن خلاصه پیام ۵ مرحله زیر را انجام می‌دهیم.

اضافه کردن بیتهای نرم‌کننده
---------------------------

طول پیام مورد نظر به ۴۴۸ به پیمانه ۵۱۲ توسعه پیدا می‌کند به این معنی که اگر به طول پیام ۶۴ بیت اضافه شود، طولش مضربی از ۵۱۲ خواهد بود. عمل توسعه دادن همیشه اجرا می‌شود مگر اینکه طول پیام به صورت ۴۴۸ به پیمانه ۵۱۲ باشد.

عمل توسعه پیام یا نرم کردن آن به صورت زیر انجام می‌شود:

یک بیت [۱] سپس تعدادی بیت [۰] به پیام اضافه می‌شود. اضافه شدن بیت‌های ۰ تا زمانی که طول رشته به ۴۴۸ بر پایه ۵۱۲ برسد، ادامه پیدا می‌کند. در این عمل حداقل یک بیت و حداکثر ۵۱۲ بیت اضافه خواهد شد.

افزایش طول
----------

یک نمایش ۶۴ بیتی از b بیت پیام اولیه به آخر نتیجه گام قبل اضافه می‌شود. در بدترین حالت، b بزرگ‌تر از ۶۴ بیت خواهد بود. در این حالت فقط ۶۴ بیت کم ارزش b استفاده خواهد شد.

هم اکنون طول پیام بدست آمده دقیقاً معادل مضربی از ۵۱۲ خواهد بود. مشابه اینکه بگوییم، این پیام طولی معادل مضربی از۱۶ کلمه دارد اجازه بدهید M[0…N-1] را نمایانگر کلمات پیام بدست آمده بدانیم. (N مضربی از ۱۶ می‌باشد.)

تعیین بافر برای MD
------------------

برای محاسبه خلاصه پیام یک بافر ۴ کلمه‌ای (A,B،C,D) استفاده می‌شود. هر کدام از A، B، Cو D یک ثبات ۳۲ بیتی می‌باشند. این ثبات‌ها مطابق جدول زیر مقدار دهی می‌شوند (بایتهای کم ارزش در ابتدا قرار دارند)

word A: 01 23 45 67

word B: 89 ab cd ef

word C: fe dc ba 98

word D: 76 54 32 10

پردازش پیام در بلاک‌های ۱۶ کلمه‌ای
----------------------------------

در ابتدا ۴ تابع کمکی تعریف می‌کنیم که هر کدام به عنوان ورودی سه کلمهٔ ۳۲ بیتی می‌گیرد و برای خروجی یک کلمهٔ ۳۲ بیتی تولید می‌کند.

F(X,Y,Z) = XY v not(X) Z

G(X,Y,Z) = XZ v Y not(Z)

H(X,Y,Z) = X xor Y xor Z

I(X,Y,Z) = Y xor (X v not(Z))

در هر موقعیت بیتی، F به عنوان شرط عمل می‌کند: اگر X آنگاه Y در غیر این صورت Z. تابع F می‌توانست طوری تعریف شود که به جای استفاده از v از + استفاده کند چون XY و (not(X هرگز یک‌هایی در موقعیت بیتی یکسان نخواهد داشت. جالب است به یاد داشته باشید که اگر بیت‌های X، Y و Z مستقل و غیر مرتبط باشند، هر بیت از (F(X, Y, Z مستقل و غیر مرتبط خواهد بود.

توابع G، H و I شبیه تابع F هستند، به‌طوری‌که آن‌ها در "توازی بیتی" کار می‌کنند تا خروجی شان را از بیت‌های X، Y و Z تولید کنند. در چنین روشی اگر بیت‌های متناظر X، Y و Z مستقل و غیر مرتبط باشند، آنگاه هر بیت از (G(X, Y, Z)، H(X, Y, Z و (I(X, Y, Z مستقل و غیر مرتبط خواهند بود.

توجه داشته باشید که تابع H، تابع XOR یا توازن بیتی از ورودی‌هایش است. این گام از یک جدول ۶۴ عنصری [T[1…64 ساخته شده از یک تابع مثلثاتی، استفاده می‌کند. اجازه دهید [T[i را که I-امین عنصر جدول را مشخص می‌کند که برابر است با قسمت صحیح حاصلضرب ۴۲۹۴۹۶۷۲۹۶ در ((abs(sin(i، به‌طوری‌که I به رادیان باشد.

کارهای زیر را انجام می‌دهید:

```
/\* Process each 16-word block. \*/
For i = 0 to N/16-1 do
	/\* Copy block i into X. \*/
	For j = 0 to 15 do
		Set X[j] to M[i*16+j].
	end /\* of loop on j \*/
	/\* Save A as AA, B as BB, C as CC, and D as DD. \*/
	AA = A
	BB = B
	CC = C
	DD = D
	/\* Round 1. \*/
	/\* Let [abcd k s i] denote the operation
 a = b + ((a + F(b,c,d) + X[k] + T[i]) <<<s). \*/
	/\* Do the following 16 operations. \*/
	[ABCD  0  7  1]  [DABC  1 12  2]  [CDAB  2 17  3]  [BCDA  3 22  4]
	[ABCD  4  7  5]  [DABC  5 12  6]  [CDAB  6 17  7]  [BCDA  7 22  8]
	[ABCD  8  7  9]  [DABC  9 12 10]  [CDAB 10 17 11]  [BCDA 11 22 12]
	[ABCD 12  7 13]  [DABC 13 12 14]  [CDAB 14 17 15]  [BCDA 15 22 16]
	/\* Round 2. \*/
	/\* Let [abcd k s i] denote the operation
 a = b + ((a + G(b,c,d) + X[k] + T[i]) <<<s). \*/
	/\* Do the following 16 operations. \*/
	[ABCD  1  5 17]  [DABC  6  9 18]  [CDAB 11 14 19]  [BCDA  0 20 20]
	[ABCD  5  5 21]  [DABC 10  9 22]  [CDAB 15 14 23]  [BCDA  4 20 24]
	[ABCD  9  5 25]  [DABC 14  9 26]  [CDAB  3 14 27]  [BCDA  8 20 28]
	[ABCD 13  5 29]  [DABC  2  9 30]  [CDAB  7 14 31]  [BCDA 12 20 32]
	/\* Round 3. \*/
	/\* Let [abcd k s t] denote the operation
 a = b + ((a + H(b,c,d) + X[k] + T[i]) <<<s). \*/
	/* Do the following 16 operations. */
	[ABCD  5  4 33]  [DABC  8 11 34]  [CDAB 11 16 35]  [BCDA 14 23 36]
	[ABCD  1  4 37]  [DABC  4 11 38]  [CDAB  7 16 39]  [BCDA 10 23 40]
	[ABCD 13  4 41]  [DABC  0 11 42]  [CDAB  3 16 43]  [BCDA  6 23 44]
	[ABCD  9  4 45]  [DABC 12 11 46]  [CDAB 15 16 47]  [BCDA  2 23 48]
	/\* Round 4. \*/
	/\* Let [abcd k s t] denote the operation
 a = b + ((a + I(b,c,d) + X[k] + T[i]) <<<s). \*/
	/\* Do the following 16 operations. \*/
	[ABCD  0  6 49]  [DABC  7 10 50]  [CDAB 14 15 51]  [BCDA  5 21 52]
	[ABCD 12  6 53]  [DABC  3 10 54]  [CDAB 10 15 55]  [BCDA  1 21 56]
	[ABCD  8  6 57]  [DABC 15 10 58]  [CDAB  6 15 59]  [BCDA 13 21 60]
	[ABCD  4  6 61]  [DABC 11 10 62]  [CDAB  2 15 63]  [BCDA  9 21 64]
	/\* Then perform the following additions. (That is increment each
 of the four registers by the value it had before this block
 was started.) \*/
	A = A + AA
	B = B + BB
	C = C + CC
	D = D + DD
end /\* of loop on i \*/
```

خروجی
-----

خلاصه پیامی که به عنوان خروجی تولید می‌شود و عبارت است از A، B، C و D، که ما با کم ارزش‌ترین بیت A شروع می‌کنیم و به با ارزش‌ترین بیت D خاتمه می‌دهیم. این تعریف MD5 را کامل می‌کند.

نتیجه
-----

الگوریتم خلاصه پیام MD5 به سادگی قابل اجرا می‌باشد و یک "اثر انگشت" یا "خلاصه پیام" از پیام با طول اختیاری تولید می‌کند. گمان برده می‌شود که امکان مواجه شدن با دو پیام که خلاصه پیام مشابهی دارند از رتبهٔ ۶۴^۲ و برای هر پیامی که به آن یک خلاصه پیام داده شده‌است از رتبهٔ ۱۲۸^۲ می‌باشد.

الگوریتم MD5 برای نقاط ضعف به دقت بررسی شده‌است. در سال 1992 berson حمله تفاضلی را به یک دورالگوریتم MD5 وارد کرد و در سال 1996 Dobbertin یک تصادم در تابع فشرده ساز برای MD5 پیدا کرد. MD5 در برابر تصادم قوی تحت حمله آزمون جامع Brute Force مقاوم نمی باشد. امروزه معمولاً از توابه درهم‌سازی دیگری مانند اس‌اچ‌ای-۱ یا (SHA-1) و خانواده اس‌اچ‌ای-۲ یا (SHA-2) استفاده می‌شود که طول خروجی این توابع بیشتر است.



1. ↑  Rivest, Ronald L. (1992-04-01). "RFC 1321: The MD5 Message-Digest Algorithm". *IETF Datatracker* (به انگلیسی). Retrieved 2022-12-10.