الأربعاء، 27 مارس 2013

تشفير بخوارزميات MD5,SHA بلغة VB.net


في بيئة VB.NET جميع خوارزميات التشفير تقع ضمن هذه المكتبة . لذالك بكل سهولة نكون كائن جديد من نوع خوارزمية تشفير معينة ونجد التشفير لأي بيانات نريدها
VB.NET CODE
Imports System.Security.Cryptography

هذه جزء من خوارزميات الموجودة ضمن هذه المكتبة




Hash And MAC
هي خوارزميات يتأكد المستلم ان الرسالة المرسلة إليه لم يتم التلاعب بهَ خلال فترة انتقالها إليه من المرسل  أي التأكد من مصداقية وصول البيانات .اي يرسل رسالة وعند المستلم يتأكد ان الرسالة المستلمة هي نفسها الرسالة المرسلة ! إذن هي ليست خوارزميات تشفير إنما خوارزميات تأكد سلامة وصول بيانات لذالك ليس لها طرق فك تشفير تستخدم في كلمات مرور الحواسيب وفي ملفات التورنت للتأكد من وصول الملفات كاملة لأنه مثلا عند تنزيل أي ملف من الانترنت أي خلل في تنزيل ملف لا يعمل عند المستلم لذالك يجب ان يقوم الخادم باستخراج Hash من الملف وإرساله مع الملف والشخص الذي يحمل الملف عندما يكتمل تحميله يستخرج Hash للملف ويقارنه مع المرسل من قبل الخادم فإذا كان نفسه فالملف سليم وإلا الملف تالف .



تصل الحرب عند مرحلة انه لا يريد يقطع إرسال الرسالة أو انه حتى إذا قراها وفك شفرتها  فلن يغير شيء من مسار العملية المطلوب تنفيذها  فيحاول أن يغير مسار العملية المراد تنفيذها بتوصيل الرسالة للمستلم لكن بصيغة جديدة  أو انه يعرف أن توصيل الرسالة مع إجراء بعض التغيرات عليها أفضل من قطعها فيعترض الرسالة ويغير عليها ويرسلها فلمستلم يستلم رسالة متغيرة وينفذها
فقد ينفذ العمليات التالية
1.    أما انه يعدل على الرسالة
2.    او يؤثر على ترتيب البيانات أما يحذف او يضيف او يعيد ترتيب
3.    او يؤخر او يعيد إرسال الرسالة

مثال : رسالة إلى محمد (اذهب  اقتل احمد) معترض يعرف ان محمد سوف  يقتل احمد وهو لا يستطيع ان  يوقف مسار العملية أي لا يستطيع ان يمنعه من قتله لأنه مثلا في مكان بعيد عن القاتل  لا يستطيع ان يصل إليه لذالك سوف يغير الرسالة ويجعلها  (اذهب اقتل صالح) فلن يقتل  احمد قتل  صالح ونفذ ضربة المعترض ونجا الهدف ؟

•    هذه العمليات التعديل على البيانات تحدث بسهولة في البث الجماعي Broadcast يعني سهولة شخص واحد يستلم رسالة ويعيد  يبثها للجميع بصيغة ثانية فيغير العمل عليهم



خوارزمية MD5

هي إحدى خوارزميات Hash  تكون  من الرسالة المتغيرة التي نحن نريد إرسالها  مفتاح تابت
 طوله 128 bit (16 byte  )  كما في الشكل

 خطوات العمل مع خوارزمية MD5
1.    في شكل (1) جزء رقم (1) تقسم البيانات على شكل Block كل واحد حجمه 512bit  حيث L  يمثل عدد Block  كما في الشكل بالأسفل مقسم  إلى ثلاثة مقاطع  حيث
•    الجزء الأول message يمثل بيانات الرسالة بعد تحويلها الى النظام الثنائي
•    والجزء الثاني padding وضيفته إذا لم تكفي  bitsالخاص بالرسالة لي Block   وتبقى بعض bits  ضمن 512 bit داخل احد Block   فارغة
تملئ  bits فارغة بواحد (1) ويليه أصفار بقدر bits الفارغة ؟
في Block الأخير نستخدم فقط bit   448  ويبقى bit    64   الأخير لخزن طول الرسالة أي لخزن عدد bits الخاص بالرسالة داخل اخر 64 bit .
لحساب عدد bits الواجب إضافتها الى الرسالة نستخدم المعادلة التالية
A       = عدد bits رسالة حقيقية / 512
     B =الجزء ألكسري (A)*512
     bits مضافة=448-  B
•    الجزء الثالث message Length يمثل طول bits الرسالة الحقيقية ونحن هنا حجز لها 64 bit من اخر Block في الرسالة لنخزن فيه طول الرسالة .إذا   كانت البيانات عبارة عن Block  واحد تخزن طول البيانات في 64 bit  الأخير أما إذا كانت أكثر من Block تخزن طول البيانات في أخر 64 bit في نهاية Block الأخير(ويعتبر هذا جزء من Block bit الخاص بالرسالة( .واستخدمنا هنا 64 bit لتمثيل طول الرسالة أي إننا نستطيع ان نشفر رسالة  بخوارزمية MD5 طولها 2^64



                                                                      شكل (2)

كما مبين في الشكل (2) الرسالة اذا كانت طولها أكثر من 512 bit تقسم الى Block كل واحد حجمه 512 bit بالأسماء التالية (y0,y1,yq,yl-1) وكل Block يدخل على HMD5 واحد .

مثال : إدخال رسالة محتواها (hi) لاحظ انه حولها الى النظام الثنائي بالصيغة التالية (01101000 01101001)
 


نلاحظ ان البيانات حجمها 16bit لذالك لكي يجعلها Block يجب ان تصل عددها الى 448bit لذالك سيضيف 1bit قيمته واحد و431bit قيمته صفرالى نهاية السلسلة

 



    و 64bit البقية تمثل طول الرسالة الحقيقية بصيغة النظام الثنائي لاحظها تحتها خط (وهي طولها 16 bit)
(0000000000000000000000000000000000000000000000000000000000010000)
 .حتى يصبح طول البيانات الكلي 512bit

 

 
2.    في شكل (1) جزء رقم (2) او شكل(3)  وهي مجموعة عمليات تجري ضمن كل HMD5 هذا الجزء مقسم إلى أربع ROUND كل واحدة منها تنفذ  عملياتها   16 مرة سوف نشرح على جزء واحد و لمرة واحدة والبقية نفسها تكرر لكن على البيانات المحدثة الجديدة  حيث
Yq : يمثل 512 bit الخاص ب  Block بيانات رسالة   معينة  حيث يقسم الى 16 block كل واحد بحجم 32 bit  كلها تمرر على جميع ROUND الأربعة وهي ثابتة لا تتغير خلال 16 مرة تنفيذ داخل كل ROUND ضمن HMD5 الواحد لأنها تمثل بيانات رسالة معينة لكنها تتغير  في HMD5 التالي لأنها بيانات block أخر ضمن الرسالة والبيانات الناتجة لكل من (A,B,C,D) من هذا HMD5 تنتقل عبر CV الى CV1 التالي شاهد شكل (1)



 ناتج الجمع هنا  هو mod 2^32


(A,B,C,D) هي  أربعة  REGISTER حجمها الكلي 128 bit  كل واحد حجمه  32 bit مخزن  فيها قيم أولية   وتتحدث ضمن ROUND الواحد 16 مرة وبعدها الناتج ROUND ينتقل الى ROUND التالي وعندما ينتهي من الأربعة ينتقل الى HMD5 التالي. هذه القيم الأولية بالنظام السادس عشري

A = 67452301
B = EFCDAB89
C = 98BADCFE
D = 10325476
T : هي قيم بالرادين تستخدم لتعقيد التشفير تحضر وفق المعادلة التالية
i=1:64; x= abs(sin(i))* 2^32    
أي نكون مصفوفة T  تبدأ من 1 الى64 وفق المعادلة أعلاه . حيث تحول هذه البيانات الى نظام Hex حيث كل ROUND يأخذ جزء منها
توضيح :-

 ROUND1 الأول يأخذ من  T[1—16]
 ROUND2 الثاني يأخذ من  T[17—32]
 ROUND3 الثالث يأخذ من  T[33—48]
 ROUND4 الرابع يأخذ من  T[49—64]






 3.    شكل  (4) هي العمليات التي ستجري 16 مرة ضمن كل ROUND لاحظ شكل (1)

                                                           شكل (4)

CLS:  هي circular left shift   أي تدوير مع s bit مقدار التدوير نحن نحدده مرة واحدة او اكثر
مثال : 00110  لو أزحناها بمقدار 2 من اليسار إلى اليمين ستصبح النتيجة 11000

  g : هي معادلة الدوال (F,G,H,I)  وهي عند كل ROUND  لها معادلة مختلفة
مثال: عند ROUND1  الخاص F   تكون  


g=F(b,c,d)=(b and  c)Or(Not(b) and d).
وهي دوال Boolean تحضر وفق المعادلات التالية



g=F(b,c,d)=(b and  c)Or(Not(b) and d).
g=G(b,c,d)=(b and c)Or(b and Not(d)).
g=H(b,c,d)=(b  Xor  c  Xor  d).
g=I(b,c,d)=c Xor (b Or  Not(d))  


X[k  : هي بيانات رسالة لكل block الذي كان يحتوي على 512 bit 
قسمة الى 16 block كل     واحد بحجم 32 bit

تشفير الخوارزمية بلغة VB.NET

تنتج هذه الخوارزمية مفتاح طوله 128 bit (16 byte  )  .المثال التالي يشفر أي نص او ملف ( صورة او صوت او مقطع فيديو او أي نوع اخر من الملفات) بخوارزمية MD5

بداية نبني دالة تستقبل النص او الملف المراد تشفيره بصيغة Byte وتعيد لنا MD5 Hash الخاص بهذا النص بكل سهولة حيث نعرف داخل هذه الدالة متغير من نوع MD5  جديد ونكونه وبعده نعمل ComputeHash للبيانات المستلمة  لحساب Hash لها وبعدها نحولها اللى بينات  من Byte  الى  صيغة HEX
VB.NET CODE
Public Function GetMD5Data(ByVal data As Byte()) As String
'create new instance of md5
Dim md5a As MD5 = MD5.Create()

'convert the input text to array of bytes
Dim hashData As Byte() = md5a.ComputeHash(data)

'create new instance of StringBuilder to save hashed data
Dim returnValue As New StringBuilder()

'loop for each byte and add it to StringBuilder
For i As Integer = 0 To hashData.Length - 1
returnValue.Append(hashData(i).ToString("x2"))
Next
' return hexadecimal string
Return returnValue.ToString()

End Function
في زر (FIND MD5) نحول النص الذي نكتبه الى Byte ونرسله الى الدالة لكي تعيد لنا Hash له
لنستعرض نتيجتها بالنص الثاني ونعرض البيانات ايضاً داخل ListBox

VB.NET CODE
TextBox2.Text = GetMD5Data(Encoding.[Default].GetBytes(TextBox1.Text))
        ListBox1.Items.Clear()
        For i = 0 To Len(TextBox2.Text) - 2 Step 2
            ListBox1.Items.Add(TextBox2.Text(i) & TextBox2.Text(i + 1))
        Next

وفي زر (تشفير ملفات) نتصف ملفات من الحاسبة وبعدها نحولها الى Byte ونرسلها الى الدالة لكي تعيد Hash  لها
VB.NET CODE
   'read file and find it md5
Dim op As New OpenFileDialog
op.ShowDialog()
Dim fData As Byte() = File.ReadAllBytes(op.FileName)
TextBox2.Text = GetMD5Data(fData)

ListBox1.Items.Clear()
For i = 0 To Len(TextBox2.Text) - 2 Step 2
ListBox1.Items.Add(TextBox2.Text(i) & TextBox2.Text(i + 1))
Next

نستخدم   الدالة  التالية عند المستلم للتأكد ان النص المستلم هو نفسه المرسل وذالك بمقارنة المفتاح المرسل مع المفتاح الناتج من الرسالة المستلمة
VB.NET CODE
Function ValidateMD5Data(ByVal inputData As Byte(), ByVal storedHashData As String) As Boolean
'hash input text and save it string variable
Dim getHashInputData As String = GetMD5Data(inputData)

If String.Equals(getHashInputData, storedHashData) Then
Return True
Else
Return False
End If End Function


خوارزمية Secure Hash Algorithm(SHA

هي إحدى خوارزميات Hash تقوم بإيجاد سلسلة ثابتة من أي نص أو ملف توجد عدة أنواع منها
SHA1: تنتج هذه الخوارزمية مفتاح طوله 160 bit (20 byte  )
SHA512: تنتج هذه الخوارزمية مفتاح طوله 512 bit (64 byte  ) من أي رسالة او ملف مهما كان طوله
وعدد من الأنواع SHA الأخرى كما نرها بالشكل (4) بالأسفل وخاصية كل نوع

سوف نشرح بالتفصيل طريقة عمل  SHA512 المبينة بالشكل (5)
 

                                                                         شكل  (5)

في الشكل(5) يبين لك طريقة عمل SHA512 وقمت بتقسيمها الى أربعة اجزاء لكل يسهل فهمها وسوف اشرح كل جزء بالتفصيل

جزء رقم (1)
نعرف ان SHA512 تستقبل أي طول من البيانات وتجد له  HASH طوله 512 bit في شكل  (6)
 يقسم الرسالة الى Block كل واحد حجمه  1024 bit واخر 128 bit في اخير Block يكون محجوز  لطول البيانات الحقيقية أي تستطيع هذه الخوارزمية ان تجد HASH لبيانات أقصى حد لطولها 2^128 والبتات Bit التي تبقى فارغة بين اخر 128 bit والبيانات الحقيقية للرسالة بعد تحويلها الى binary نعمل لها padding أي ندخل رقم واحد ويتبعه عدد من الاصفار حتى نملئ bits الفارغة. وان اخر Block يتقبل فقط  896 bit لان كما قلنا اخر 128 bit في اخر Block تكون محجوزة لطول الرسالة الحقيقية بصيغة نظام ثنائي
 


                                                                                           شكل  (6)
 


حيث iv=H0 يمثل  Registers الثمانية (A,B,C,D,E,F,G,H) كل واحد حجمه 64 bit مجموعهم  هو 512 bit  الذي سيمثل في النهاية Hash الخاص بالرسالة .وهذه القيم الأولية المخزنة داخل Registers
 


                                                                

الجزء رقم (2)

الذي يمثل الجزء رقم2  في شكل (5) هو حرف (F) في الجزء رقم1 .حيث يتكرر نفس عملياته مع كل Block لذالك سوف نشرح على Block واحد والبقية نفس الشيء. يمثل شكل (7)    العمليات التي ستجري على كل Block  من الرسالة الحقيقية لينتج مفتاح طولها 512 bit مخزن في (A,B,C,D,E,F,G,H)  ويعتبر كمدخل  للعمليات على  Block   التالي   اذا كانت البيانات اكثر من Block وكما مبين في الشكل(7)  او تعتبر النتيجة النهائية اذا كانت البيانات عبارة عن Block  واحد . وان كل (F)  مقسم الى 80 Round كل واحد تنفذ العمليات في داخله مره واحد (جزء رقم4 في شكل(5) يمثل العمليات التي ستجري ضمن كل Round)
 


                                                                             شكل  (7)
 


في شكل (7) كل Round  من 80 يدخل عليه قيمة K معين  بين (K0-K79)  وهي قيم ثابتة مكون من 64 bit  تأخذ من الجدول التالي
 




الجزء رقم (3)



كما نلاحظ ان في شكل  (7) كل Round يدخل عليه قيمة من بيانات Block طولها 64 bit وان طول Block  الواحد هو  1024 bit  لذالك يقسم (1024) الى  16 Block كل واحد حجمه 64 bit ممثلا (W0-W15)  ويدخل على اول  16 Round
 

                                                                                شكل  (8)
 


وبقية Round تأخذ Wt  وفق المعادلة التالية
 






جزء رقم (4):
 جزء رقم4 في شكل(5) يمثل العمليات التي ستجري ضمن كل Round ليتم من خلا لها التحديث على قيم Registers التي ستعتبر القيم المحدثة كمدخل Round التالي وفي اخر Round تعتبر Hash الخاص بالرسالة اذا كانت الرسالة من Block  واحد وخلافه تعتبر مدخل لبيانات Registers في Block  التالي
 

                                                                     شكل  (9)

Wt: يمثل 64 bit  من بيانات Block تم شرح طريقة تحضيرها لكل Round سابقا
Kt  : وهي قيم ثابتة مكون من  64 bit  تأخذ من الجدول تم شرحها سابقا
 

 
برمجة الخوارزميات

SHA1: تنتج هذه الخوارزمية مفتاح طوله 160 bit (20 byte  )

VB.NET CODE
Function GetSHA1Data(ByVal data As Byte()) As String
'create new instance of md5
Dim sha As SHA1 = SHA1.Create()

'convert the input text to array of bytes
Dim hashData As Byte() = sha.ComputeHash(data)

'create new instance of StringBuilder to save hashed data
Dim returns As New StringBuilder()

'loop for each byte and add it to StringBuilder
For i As Integer = 0 To hashData.Length - 1
returns.Append(hashData(i).ToString("x2"))
Next
' return hexadecimal string
Return returns.ToString()
End Function


SHA512: تنتج هذه الخوارزمية مفتاح طوله 512 bit (64 byte  ) 







 بناء برنامج تشفير SHA512



VB.NET CODE
Function GetSHA512Data(ByVal data As Byte()) As String
'create new instance of md5
Dim sha As SHA512 = SHA512.Create()

'convert the input text to array of bytes
Dim hashData As Byte() = sha.ComputeHash(data)

'create new instance of StringBuilder to save hashed data
Dim returns As New StringBuilder()

'loop for each byte and add it to StringBuilder
For i As Integer = 0 To hashData.Length - 1
returns.Append(hashData(i).ToString("x2"))
Next
' return hexadecimal string
Return returns.ToString()
End Function

الشرح مفصل بالمرفقات هنا بالمقالة وضعت الشرح بشكل مختصر

تحميل شرح خوارزمية خطوة خطوة مع كود هنا  او حمل من هنا

تحميل المثال Code




إرسال تعليق