تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
التشفير وهم أم حقيقة
#1
تشفير البيانات موضوع مهم جدا لكل مبرمج كمبيوتر
و في مرحلة معينة قد يحتاج المبرمج إلي تشفير المعلومات من أجل إخفاء معلومات معينة مهمة عين عيون المتطفلين
وغالبا كل مبرمج يجتهد في أن يخترع لنفسه نظام تشفير لا يعرفه غيره
وفي هذا الموضوع سنناقش بعضا من أساليب التشفيير البسيطة

قبل أن نسطرد في الحديث لنسأل أنفسنا سؤالا بسيطا
لماذا اي كلاس جديد يتم بناؤه تجد به أتوماتيكا ثلاثة من الدوال وهي كالأتي

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(AsciiValue16

فك التشفيير


PHP كود :
       Dim value As String "41"
 
       Dim code As Integer Integer.Parse(valueSystem.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(code16)
 
   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.Length0)
 
       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.sourceThen
            Dim i 
As Integer 0
            While i 
Me.length
                Dim c 
As Integer Me.current
                If c 
Me.length Then
                    Me
.chr Me.source(c)
 
                   Me.code AscW(Me.chr)
 
               End If
 
               Me.destination += Convert.ToString(Me.code16)
 
               Me.destination += sep
                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.LengthNothing)
 
       Me.currentHex = If((current length), strings(current), Nothing)
 
       Me.code = If((currentHex <> Nothing), Integer.Parse(currentHexSystem.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.sourceThen
            Me
.strings Me.source.Split(sep)
 
           While Me.current Me.length
                Me
.currentHex Me.strings(Me.current)
 
               If Not String.IsNullOrEmpty(Me.currentHexThen
                    Me
.code Integer.Parse(Me.currentHexSystem.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 
Retired
الرد }}}


الردود في هذا الموضوع
التشفير وهم أم حقيقة - بواسطة silverlight - 21-09-17, 01:59 PM
RE: التشفير وهم أم حقيقة - بواسطة silverlight - 26-09-17, 01:42 PM
RE: التشفير وهم أم حقيقة - بواسطة silverlight - 27-09-17, 12:15 PM
RE: التشفير وهم أم حقيقة - بواسطة silverlight - 27-09-17, 04:35 PM
RE: التشفير وهم أم حقيقة - بواسطة silverlight - 30-09-17, 11:59 AM
RE: التشفير وهم أم حقيقة - بواسطة silverlight - 30-09-17, 02:22 PM
RE: التشفير وهم أم حقيقة - بواسطة silverlight - 01-10-17, 02:12 PM
RE: التشفير وهم أم حقيقة - بواسطة sendbad100 - 02-10-17, 03:10 PM
RE: التشفير وهم أم حقيقة - بواسطة silverlight - 04-10-17, 11:12 AM
RE: التشفير وهم أم حقيقة - بواسطة silverlight - 18-10-17, 10:49 AM


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم