30-09-17, 02:22 PM
(آخر تعديل لهذه المشاركة : 01-10-17, 10:57 AM {2} بواسطة silverlight.)
المثال الثالث :
نحدد شكلا أخر للنسق :
1- بيانات عبارة عن String مطاوب تشفييرها
2- نضيف رقم للنسق كمفتاح للتشفيير
3- نضيف تاريخ
4- نضيف مفتاح للتشفيير في إتجاه واحد بحيث نستخدمه لمقارنة المدخلات الخاصة بالنسق
ما يهمني توضيحه في كيفية تحديد النسق
هو أننا تقريبا نبني مصفوفة ولنطلق عليها مصفوفة النسق
ومكونات هذه المصفوفة عبارة عن String + رقم + تاريخ + مفتاح و هذا المفتاح عبارة عن Hash
وأهم شئ في النسق هو ترتيب المدخلات الي المصفوفة بأسلوب يسمح لك بفك التشفيير مرة ثانية
وبشكل عام هذا النسق إما يتم كتابته علي شكل متغيرات يتم تمريرها بأي أسلوب أو من الممكن أن يتم كتابة النسق نفسه علي شكل كلاس
و اخيرا يتم تحويل المتغيرات الخاصة بالنسق الي مصفوفات من البايت و يتم جمع هذه المصفوفات في مصفوفة واحدة هي ناتج التشفيير
وفي مصفوفة النسق من الأفضل دائما أن يتم تمرير مصفوفة String في أخر النسق و السبب في ذلك أننا لا نعلم ماذا سيكون طول أو سعة هذه المصفوفة
الكود التالي يوضح الفكرة :
التشفيير
فك التشفيير
طبعا و كلما كانت المدخلات كثييرة من الأفضل للمبرمج كتابة التشفيير و فك التشفيير علي شكل كلاسات
ملحوظة هامة :
هذا الأسلوب يمكن استخدامه ليس فقط في تشفيير String لكن أيضا يمكن كتابته بشكل عام بحيث إنك تستطيع تشفيير ملفات أيضا
والفكرة هنا أن المدخلات يتم تحويلها من String الي مصفوفة بايت
وبما أن أي ملف يمكن تخويله الي مصفوفة بايت فابالتالي يمكن تشفيير الملفات أيضا
نحدد شكلا أخر للنسق :
1- بيانات عبارة عن String مطاوب تشفييرها
2- نضيف رقم للنسق كمفتاح للتشفيير
3- نضيف تاريخ
4- نضيف مفتاح للتشفيير في إتجاه واحد بحيث نستخدمه لمقارنة المدخلات الخاصة بالنسق
ما يهمني توضيحه في كيفية تحديد النسق
هو أننا تقريبا نبني مصفوفة ولنطلق عليها مصفوفة النسق
ومكونات هذه المصفوفة عبارة عن String + رقم + تاريخ + مفتاح و هذا المفتاح عبارة عن Hash
وأهم شئ في النسق هو ترتيب المدخلات الي المصفوفة بأسلوب يسمح لك بفك التشفيير مرة ثانية
وبشكل عام هذا النسق إما يتم كتابته علي شكل متغيرات يتم تمريرها بأي أسلوب أو من الممكن أن يتم كتابة النسق نفسه علي شكل كلاس
و اخيرا يتم تحويل المتغيرات الخاصة بالنسق الي مصفوفات من البايت و يتم جمع هذه المصفوفات في مصفوفة واحدة هي ناتج التشفيير
وفي مصفوفة النسق من الأفضل دائما أن يتم تمرير مصفوفة String في أخر النسق و السبب في ذلك أننا لا نعلم ماذا سيكون طول أو سعة هذه المصفوفة
الكود التالي يوضح الفكرة :
التشفيير
PHP كود :
Dim source As String = "Visual Basic"
Dim keyID As Long = CLng(123456789)
Dim accessDate As DateTime = DateTime.Now
Dim password As String = "vb4arab"
' تحوي المدخلات الي مصفوفات من البايت
Dim sourceBytes As Byte() = System.Text.Encoding.Unicode.GetBytes(source)
Dim keyBytes As Byte() = BitConverter.GetBytes(keyID) ' ناتج التشفيير هنا مصفوفة طولها 8
Dim dateBytes As Byte() = BitConverter.GetBytes(accessDate.ToFileTime) ' أيضا ناتج تحويل التاريخ الي مصفوفة بايت سيكون مصفوفة طولها 8 بايت
' طول مصفوفة الهاش الناتجة عن الكود في السطر التالي سيكون 64 بايت
' ويمكن للمبرمج التحكم في المصفوفة و اقتطاع اي جزء منها بأي طول يحدده هو
Dim hashBytes As Byte() = New System.Security.Cryptography.SHA512CryptoServiceProvider().ComputeHash(System.Text.Encoding.Unicode.GetBytes(password))
' لتحصل علي ناتج التشفير تجمع المصفوفات أعلاه و تحولها الي مصفوفة واحدة بأي أسلوب يناسبك
Dim result As Byte() = New Byte(hashBytes.Length + dateBytes.Length + keyBytes.Length + sourceBytes.Length - 1) {}
' سيتم تمرير مصفوفات البايت بالترتيب التالي
' 1- hash bytes ------- طول المصفوفة 64 بايت
' 2- date bytes ------- طول المصفوفة 8 بايت
' 3- key bytes ------- طول المصفوفة 8 بايت
' 4- string Bytes ------- طول المصفوفة غير معروف
System.Array.Copy(hashBytes, 0, result, 0, hashBytes.Length)
System.Array.Copy(dateBytes, 0, result, hashBytes.Length, dateBytes.Length)
System.Array.Copy(keyBytes, 0, result, hashBytes.Length + dateBytes.Length, keyBytes.Length)
System.Array.Copy(sourceBytes, 0, result, hashBytes.Length + dateBytes.Length + keyBytes.Length, sourceBytes.Length)
فك التشفيير
PHP كود :
' فك التشفيير
Dim codeSize As Integer = 80
Dim hashSize As Integer = 64
' الحصول علي مصفوفة التكست بشكل مباشر
Dim stringBytes As Byte() = result.Skip(codeSize).ToArray
' الحصول علي مصفوفة الهاش و التاريخ و المفتاح
Dim layouts As Byte() = result.Take(codeSize).ToArray
' الحصول علي مصفوفة الهاش او الباسوورد فقط
' هذه المصفوفة لا يمكن فك تشفييرها و يمكن استخدامها للمقارنات فقط
Dim ohtersHash As Byte() = layouts.Take(hashSize).ToArray
' الحصول علي مصفوفة الاتاريخ و المفتاح
Dim dateAndKeyLayouts As Byte() = layouts.Skip(hashSize).ToArray
' الحصول علي مصفوفة التاريخ فقط
Dim dateLayout As Byte() = dateAndKeyLayouts.Take(8).ToArray
' الحصول علي مصفوفة المفتاح فقط
Dim keyLayout As Byte() = dateAndKeyLayouts.Skip(8).ToArray
' إسترجاع البيانات
Dim s As String = System.Text.Encoding.Unicode.GetString(stringBytes)
Dim d As DateTime = DateTime.FromFileTime(BitConverter.ToUInt64(dateLayout, 0))
Dim k As Long = BitConverter.ToUInt64(keyLayout, 0)
طبعا و كلما كانت المدخلات كثييرة من الأفضل للمبرمج كتابة التشفيير و فك التشفيير علي شكل كلاسات
ملحوظة هامة :
هذا الأسلوب يمكن استخدامه ليس فقط في تشفيير String لكن أيضا يمكن كتابته بشكل عام بحيث إنك تستطيع تشفيير ملفات أيضا
والفكرة هنا أن المدخلات يتم تحويلها من String الي مصفوفة بايت
وبما أن أي ملف يمكن تخويله الي مصفوفة بايت فابالتالي يمكن تشفيير الملفات أيضا
Retired

