21-09-17, 01:59 PM
تشفير البيانات موضوع مهم جدا لكل مبرمج كمبيوتر
و في مرحلة معينة قد يحتاج المبرمج إلي تشفير المعلومات من أجل إخفاء معلومات معينة مهمة عين عيون المتطفلين
وغالبا كل مبرمج يجتهد في أن يخترع لنفسه نظام تشفير لا يعرفه غيره
وفي هذا الموضوع سنناقش بعضا من أساليب التشفيير البسيطة
قبل أن نسطرد في الحديث لنسأل أنفسنا سؤالا بسيطا
لماذا اي كلاس جديد يتم بناؤه تجد به أتوماتيكا ثلاثة من الدوال وهي كالأتي
1- الدالة GetHashCode
2- الدالة ToString
3- الدالة Equal
التفسير البسيط للسؤال
هو أن أبسط أنواع التشفير و أقواها أحيانا هي إستخدام HashCode من أجل الحصول علي رقم معين يعبر عن جزء من مكونات الكلاس او يعبر عن محتويات الكلاس كلها وهذا الرقم يمكن استخدامه لاحقا في المقارنة بين كلاسان من نفس النوع
أيضا جميع البيانات مهما كان شكلها فهي في الأصل عبارة عن حروف و أرقام لذلك ستجد الدالة ToString في أي كلاس و الأمر متروك للمبرمج في كيفية استرجاع البيانات من هذه الدالة
أخيرا الدالة Equal و الهدف منها عقد المقارنات بين كلاس و كلاس أخر من نفس النوع و تأتي أهمية هذا المقارنة تحديدا عندما تبني مصفوفة لهذا الكلاس
الأن نعود الي موضوعنا الأصلي و هو التشفير
التشفير نوعان
تشفير في إتجاه واحد :
و هو أنك تأخذ البيانات و تقوم بتشفيرها و لكنك هنا لا تستطيع أن تفك التشفير من أجل الحصول علي البيانات الأصلية
و السبب في ذلك أن عملية التشفير تتم بشكل عشوائي للبيانات
لكن هذا الأسلوب له حسناته و هي إنك تستطيع أن تستخدم ناتج التتشفير في المقارنة بين البيانات فقط
تشفير في إتجاهين :
حيث تقوم بتشفيير البيانات ثم تحفظها علي هيئتها المشفرة ثم بعد ذلك حين تحتاج البيانات تقوم بفك التشفير و تستعيد الصورة الأصلية للبيانات
أساليب التشفير
الأسلوب الأول :
ربما أسهل أساليب التشفير للبيانات أنك تأخذ جرف أو رقم و تقوم بتحويله الي ما يقابله في جدول Ascii الخاصة بالحروف و الأرقام ثم لفك التشفير تقوم بتحويل ناتج التشفير الي هيئته الأصلية مرة اخري
تشفيير أي حرف أبجدي
مثلا الحرف الأبجدي A ناتج التشفيير له سيكون 65 وهذا الناتج يمثل قيمة الحرف في جدول الأسكي
فك التشفيير
الأسلوب الثاني :
هو نفس الأسلوب الأول ولكن هنا نقوم بعمل Hashing للبيانات
و المقصود أننا نقوم بتحويل الحرف الي ما يقابله في جدول الأسكي ثم نأخذ هذا الرقم و نجري عليه بعض العمليات الحسابية البسيطة
ثم و لفك التشفيير نقوم بإجراء نفس العمليات الحسابية علي الرقم الذي تم تشفييره و لكن بشكل عكسي
مثلا الحرف الأبجدي A ناتج التشفيير له سيكون 65 وهذا الناتج يمثل قيمة الحرف في جدول الأسكي
ثم نأخذ الرقم و نضربه مثلا في 200 ثم نجمع عليهأي رقم و ليكن 120 لنحصل في النهاية علي رقم هو ناتج التشفيير
فك التشفيير
نأخذ الناتج من التشفيير و نجري عليه نفس العمليات الحسابية و لكن بشكل عكسي
الأسلوب الثالث :
تحويل البيانات الي Hex Sting و المقصد أن أي حرف أبجدي و عند تشفيره سيكون خليط من حروف و أرقام أو خليط من رقم ورقم
بشكل عام ناتج التشفيير سيكون خليطا من الحروف و الأرقام "0123456789ABCDEF"
هو إمتداد للأسلوب الأول حيث نأخذ الحرف الأبجدي المراد تشفييره و نقوم بتحويله الير رقم ثم بعد ذلك نقوم بتحويله الي هيئته الجديدة علي شكل Hex
وذلك باستخدام الدالة Convert الموجودة في الدوت نت
مثلا ناتج التشفيير بهذا الأسلوب للحرف A هو القيمة 41
فك التشفيير
ملحوظة علي الأسلوب الثالث
عندما تبحث علي النت في محاولة البحث عن دالة لتحويل البيانات من و إلي HexString أرجو أن تكون حذرا لأن بعض الدوال التي قد تجدها قد تكون غير دقيقة خاصة مع الحروف الأبجدية العربية
مثال علي ذلك :
ملحوظة أخري
في بعض الأحيان قد تريد أن تتخق من أن String عبارة عن HexString و هنا تستطيع أن تستخدم دالة مثل الدالة التالية
طبعا هذا الأسلوب من الممكن كتابته علي هيئة دوال أو تكتب الكود علي هيئة كلاسات
و الكود التالي عبارة عن كلاس يقوم بتحوبل المدخلات من String الي HexString
و الكود التالي عبارة عن كلاس يقوم بتحويل المدخلات من HexString الي String
و في مرحلة معينة قد يحتاج المبرمج إلي تشفير المعلومات من أجل إخفاء معلومات معينة مهمة عين عيون المتطفلين
وغالبا كل مبرمج يجتهد في أن يخترع لنفسه نظام تشفير لا يعرفه غيره
وفي هذا الموضوع سنناقش بعضا من أساليب التشفيير البسيطة
قبل أن نسطرد في الحديث لنسأل أنفسنا سؤالا بسيطا
لماذا اي كلاس جديد يتم بناؤه تجد به أتوماتيكا ثلاثة من الدوال وهي كالأتي
1- الدالة GetHashCode
2- الدالة ToString
3- الدالة Equal
التفسير البسيط للسؤال
هو أن أبسط أنواع التشفير و أقواها أحيانا هي إستخدام HashCode من أجل الحصول علي رقم معين يعبر عن جزء من مكونات الكلاس او يعبر عن محتويات الكلاس كلها وهذا الرقم يمكن استخدامه لاحقا في المقارنة بين كلاسان من نفس النوع
أيضا جميع البيانات مهما كان شكلها فهي في الأصل عبارة عن حروف و أرقام لذلك ستجد الدالة ToString في أي كلاس و الأمر متروك للمبرمج في كيفية استرجاع البيانات من هذه الدالة
أخيرا الدالة Equal و الهدف منها عقد المقارنات بين كلاس و كلاس أخر من نفس النوع و تأتي أهمية هذا المقارنة تحديدا عندما تبني مصفوفة لهذا الكلاس
الأن نعود الي موضوعنا الأصلي و هو التشفير
التشفير نوعان
تشفير في إتجاه واحد :
و هو أنك تأخذ البيانات و تقوم بتشفيرها و لكنك هنا لا تستطيع أن تفك التشفير من أجل الحصول علي البيانات الأصلية
و السبب في ذلك أن عملية التشفير تتم بشكل عشوائي للبيانات
لكن هذا الأسلوب له حسناته و هي إنك تستطيع أن تستخدم ناتج التتشفير في المقارنة بين البيانات فقط
تشفير في إتجاهين :
حيث تقوم بتشفيير البيانات ثم تحفظها علي هيئتها المشفرة ثم بعد ذلك حين تحتاج البيانات تقوم بفك التشفير و تستعيد الصورة الأصلية للبيانات
أساليب التشفير
الأسلوب الأول :
ربما أسهل أساليب التشفير للبيانات أنك تأخذ جرف أو رقم و تقوم بتحويله الي ما يقابله في جدول Ascii الخاصة بالحروف و الأرقام ثم لفك التشفير تقوم بتحويل ناتج التشفير الي هيئته الأصلية مرة اخري
تشفيير أي حرف أبجدي
مثلا الحرف الأبجدي A ناتج التشفيير له سيكون 65 وهذا الناتج يمثل قيمة الحرف في جدول الأسكي
PHP كود :
' تشفيير حرف
Dim chr As Char = "A"c
' ناتج التشفيير عبارة عن رقم
Dim AsciiValue As Integer = AscW(chr.ToString)
فك التشفيير
PHP كود :
Dim value As Integer = 65
Dim result As Char = ChrW(value)
الأسلوب الثاني :
هو نفس الأسلوب الأول ولكن هنا نقوم بعمل Hashing للبيانات
و المقصود أننا نقوم بتحويل الحرف الي ما يقابله في جدول الأسكي ثم نأخذ هذا الرقم و نجري عليه بعض العمليات الحسابية البسيطة
ثم و لفك التشفيير نقوم بإجراء نفس العمليات الحسابية علي الرقم الذي تم تشفييره و لكن بشكل عكسي
مثلا الحرف الأبجدي A ناتج التشفيير له سيكون 65 وهذا الناتج يمثل قيمة الحرف في جدول الأسكي
ثم نأخذ الرقم و نضربه مثلا في 200 ثم نجمع عليهأي رقم و ليكن 120 لنحصل في النهاية علي رقم هو ناتج التشفيير
PHP كود :
' تشفيير حرف
Dim chr As Char = "A"c
' ناتج التشفيير عبارة عن رقم
Dim AsciiValue As Integer = AscW(chr.ToString)
' نقوم بإجراء عمليات حسابية بسيطة
Dim i As Integer = AsciiValue * 200
i = i + 120
فك التشفيير
نأخذ الناتج من التشفيير و نجري عليه نفس العمليات الحسابية و لكن بشكل عكسي
PHP كود :
Dim value As Integer = 13120
value = value - 120
value = value / 200
Dim result As Char = ChrW(value)
الأسلوب الثالث :
تحويل البيانات الي Hex Sting و المقصد أن أي حرف أبجدي و عند تشفيره سيكون خليط من حروف و أرقام أو خليط من رقم ورقم
بشكل عام ناتج التشفيير سيكون خليطا من الحروف و الأرقام "0123456789ABCDEF"
هو إمتداد للأسلوب الأول حيث نأخذ الحرف الأبجدي المراد تشفييره و نقوم بتحويله الير رقم ثم بعد ذلك نقوم بتحويله الي هيئته الجديدة علي شكل Hex
وذلك باستخدام الدالة Convert الموجودة في الدوت نت
مثلا ناتج التشفيير بهذا الأسلوب للحرف A هو القيمة 41
PHP كود :
' تشفيير حرف
Dim chr As Char = "A"c
' ناتج التشفيير عبارة عن رقم
Dim AsciiValue As Integer = AscW(chr.ToString)
Dim hexChar As String = Convert.ToString(AsciiValue, 16)
فك التشفيير
PHP كود :
Dim value As String = "41"
Dim code As Integer = Integer.Parse(value, System.Globalization.NumberStyles.HexNumber)
Dim result As Char = ChrW(code)
ملحوظة علي الأسلوب الثالث
عندما تبحث علي النت في محاولة البحث عن دالة لتحويل البيانات من و إلي HexString أرجو أن تكون حذرا لأن بعض الدوال التي قد تجدها قد تكون غير دقيقة خاصة مع الحروف الأبجدية العربية
مثال علي ذلك :
PHP كود :
Private Function ToHex(code As Integer) As String
'Dim hex As String = "0123456789ABCDEF"
' التحويل بهذا الاسلوب غير ناجح مع الحروف العربية و الانجليزية
' UNSAFE : for both english and arabic char
'Return hex((code And (Byte.MaxValue - hex.Length - 1)) >> 4) + hex(code And hex.Length - 1)
' التحويل بهذا الاسلوب غير ناجح مع الحروف العربية
' UNSAFE: for arabic char
'Return hex(code >> 4) + hex(code And &HF)
' ألأكثر دقة و ينجح مع جميع الحروف الأبجدية هو استخدام الاسلوب التالي
Return Convert.ToString(code, 16)
End Function
ملحوظة أخري
في بعض الأحيان قد تريد أن تتخق من أن String عبارة عن HexString و هنا تستطيع أن تستخدم دالة مثل الدالة التالية
PHP كود :
Private Function IsHexString(hexString As String) As Boolean
Dim hex As String = "0123456789ABCDEF"
Return hexString.IndexOfAny(hex) <> -1
End Function
طبعا هذا الأسلوب من الممكن كتابته علي هيئة دوال أو تكتب الكود علي هيئة كلاسات
و الكود التالي عبارة عن كلاس يقوم بتحوبل المدخلات من String الي HexString
PHP كود :
'------------------------------------------------------------------------------
'
' File Name : HexEncoder.vb
' Copyright (c) : RiverNile.Net 2017 All rights reserved.
' Date : 21/09/2017
' Revision : 0.0.0.0
'
'------------------------------------------------------------------------------
Public Class HexEncoder
Private Const sep As Char = " "c
Private source As String
Private length As Integer
Private current As Integer
Private chr As Char
Private destination As String
Private code As Integer
Public Sub New(source As String)
Me.source = source
Me.length = If((source IsNot Nothing), source.Length, 0)
Me.current = 0
Me.chr = If((Me.current < Me.length), Me.source(Me.current), Nothing)
Me.code = If((Me.chr <> Nothing), AscW(Me.chr), Nothing)
Me.destination = ""
End Sub
Public ReadOnly Property ToHex As String
Get
Me.ProvideHex()
Return Me.destination
End Get
End Property
Private Sub ProvideHex()
If Not String.IsNullOrEmpty(Me.source) Then
Dim i As Integer = 0
While i < Me.length
Dim c As Integer = i + Me.current
If c < Me.length Then
Me.chr = Me.source(c)
Me.code = AscW(Me.chr)
End If
Me.destination += Convert.ToString(Me.code, 16)
Me.destination += sep
i = i + 1
End While
End If
Me.destination = Me.destination.TrimEnd(sep)
End Sub
End Class
و الكود التالي عبارة عن كلاس يقوم بتحويل المدخلات من HexString الي String
PHP كود :
'------------------------------------------------------------------------------
'
' File Name : HexDecoder.vb
' Copyright (c) : RiverNile.Net 2017 All rights reserved.
' Date : 21/09/2017
' Revision : 0.0.0.0
'
'------------------------------------------------------------------------------
Public Class HexDecoder
Private Const sep As Char = " "c
Private source As String
Private destination As String = ""
Private current As Integer = 0
Private strings As String()
Private length As Integer
Private currentHex As String
Private code As Integer
Private currentChar As Char
Public Sub New(source As String)
Me.source = source
Me.current = 0
Me.strings = If((source <> Nothing), source.Split(sep), Nothing)
Me.length = If((strings IsNot Nothing), strings.Length, Nothing)
Me.currentHex = If((current < length), strings(current), Nothing)
Me.code = If((currentHex <> Nothing), Integer.Parse(currentHex, System.Globalization.NumberStyles.HexNumber), Nothing)
Me.currentChar = If((code <> Nothing), ChrW(code), Nothing)
Dim destination As String = ""
End Sub
Public ReadOnly Property FromHex As String
Get
Me.ProvideString()
Return Me.destination
End Get
End Property
Private Sub ProvideString()
If Not String.IsNullOrEmpty(Me.source) Then
Me.strings = Me.source.Split(sep)
While Me.current < Me.length
Me.currentHex = Me.strings(Me.current)
If Not String.IsNullOrEmpty(Me.currentHex) Then
Me.code = Integer.Parse(Me.currentHex, System.Globalization.NumberStyles.HexNumber)
Me.currentChar = ChrW(Me.code)
Me.destination += Me.currentChar
End If
Me.current = Me.current + 1
End While
End If
End Sub
End Class