تقييم الموضوع :
  • 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
الرد }}}
#2
الأسلوب الرابع :

تحويل البيانات الي Base64String و العكس

وهنا التشفيير يتم بواسطة تحويل المدخلات الي مصفوفة بايت ياستخدام System.Text.Encoding ثم و باستخدام Convert Class يتم تحويل البيانات الي Base64String

ثم و لكي تفك التشفيير يتم تحويل Base64String الي مصفوفة بايت ثم و تأخذ مصفوفة البايت و تقوم بتحويلها الي اصلها باستخدم Encoding

الكلاس التالي يوضح الفكرة


PHP كود :
Public Interface IEncoder
        Function EncodeString
() As String
    End 
Interface

Public Interface 
IDecoder
    Function DecodeString
() As String
End 
Interface

Public 
NotInheritable Class EncodeDecodeString

    Public Shared 
Function Encode(As String) As IEncoder
        Return 
New EncoderDecoder(s)
 
   End Function

 
   Public Shared Function Decode(As String) As IDecoder
        Return 
New EncoderDecoder(s)
 
   End Function

 
   Private Class EncoderDecoder
        Implements IDecoder
IEncoder

        Private _source 
As String
        Private _length 
As Integer

        Public Sub 
New(source As String)
 
           Me._source source
            Me
._length = If(source IsNot Nothing10)
 
       End Sub

        Public 
Function DecodeString() As String Implements IDecoder.DecodeString
            Dim result 
As String ""
 
           If _length 0 Then
                Dim bytes 
As Byte() = System.Convert.FromBase64String(_source)
 
               result += System.Text.Encoding.Unicode.GetString(bytes)
 
           End If
 
           Return result
        End 
Function

 
       Public Function EncodeString() As String Implements IEncoder.EncodeString
            Dim result 
As String ""
 
           If _length 0 Then
                Dim bytes 
As Byte() = System.Text.Encoding.Unicode.GetBytes(_source)
 
               result += System.Convert.ToBase64String(bytes)
 
           End If
 
           Return result
        End 
Function
 
   End Class

End Class 

طبعا كل الاكواد موجودة علي النت فقط لقد قمت بكتابة الكود علي هيئة كلاس
لكن وعلي المبرمج إن أراد استخدام أكواد يستخدمها الجميع تقريبا
هنا علي المبرمج ن يكون مخادعا قليلا و يكتب الكود بأسلوب لا يفهمه إلا القليل من المبرمجين
مثلا الكلاس به خدعة بسيطة جدا
وهي أن Constructor الخاص بالكلاس يقبل String سواء كانت المدخلات تم تشفيرها أو لم يتم تشفييرها

الإستخدام

PHP كود :
       Dim encoder As IEncoder EncodeDecodeString.Encode("visual Basic")
 
       If encoder IsNot Nothing Then
            Me
.Label1.Text encoder.EncodeString
        End 
If

 
       Dim decoder As IDecoder EncodeDecodeString.Decode(Label1.Text)
 
       If decoder IsNot Nothing Then
            Me
.Label2.Text decoder.DecodeString
        End 
If 


التحويل من و الي Base64String ممكن كتابة الكود الخاص به بأساليب كثيرة و الأمر متروك للمبرمج
الكلاس التالي يوضح احدي هذه الأساليب و هنا يتم التشفيير وفك التشفيير باستخدام كلمة سر
وبالرغم ان الكلاس مكتوب بشكل يبدو صعبا للبعض منكم لكن فعليا هو بسيط جدا و يمكن تلخيصه في دالتان


PHP كود :
Public Interface IEncryptionAccessor

    Function EncryptString
() As String

    Function DecryptedString
() As String

End 
Interface

Public Class 
EncryptionAccessor
    Implements IEncryptionAccessor

    Private _key 
As String
    Private _source 
As String
    Private DefaultAccess 
As AccessorCallback
    Private DefaultEncrptiontAccess 
As AccessorEncryptionCallback

    Public Sub 
New(key As Stringsource As String)
 
       Me._key key
        Me
._source source
        DefaultAccess 
= New AccessorCallback(AddressOf ProvideAccess)
 
       DefaultEncrptiontAccess = New AccessorEncryptionCallback(AddressOf ProvideAccess)
 
   End Sub

    Public 
Function DecryptedString() As String Implements IEncryptionAccessor.DecryptedString
        Dim encoder 
As UTF8Encoding = New UTF8Encoding()
 
       Dim provider As TripleDESCryptoServiceProvider Nothing
        Dim service 
As MD5CryptoServiceProvider DefaultEncrptiontAccess.Invoke(encoder_keyprovider)
 
       Dim buffer As Byte() = Convert.FromBase64String(Me._source)
 
       Dim bytes As Byte() = Nothing
        Try
            Dim transform 
As ICryptoTransform provider.CreateDecryptor()
 
           bytes transform.TransformFinalBlock(buffer0buffer.Length)

 
       Catch ex As Exception
        Finally
            service
.Clear()
 
           provider.Clear()
 
       End Try
 
       Return encoder.GetString(bytes)
 
   End Function

 
   Public Function EncryptString() As String Implements IEncryptionAccessor.EncryptString

        Dim encoder 
As UTF8Encoding = New UTF8Encoding()
 
       Dim provider As TripleDESCryptoServiceProvider Nothing
        Dim service 
As MD5CryptoServiceProvider DefaultEncrptiontAccess.Invoke(encoder_keyprovider)
 
       Dim buffer As Byte() = encoder.GetBytes(_source)
 
       Dim bytes As Byte() = Nothing
        Try
            Dim transform 
As ICryptoTransform provider.CreateEncryptor()
 
           bytes transform.TransformFinalBlock(buffer0buffer.Length)
 
       Catch ex As Exception
        Finally
            service
.Clear()
 
           provider.Clear()
 
       End Try
 
       Return Convert.ToBase64String(bytes)
 
   End Function

 
   Private Function ProvideAccess(encoder As Encodingkey As String,
 
                                       ByRef service As MD5CryptoServiceProviderByRef provider As TripleDESCryptoServiceProvider) As Integer
        Dim result 
As Integer 0
        service 
Nothing
        provider 
Nothing
        If Not String
.IsNullOrEmpty(keyThen
            service 
= New MD5CryptoServiceProvider()
 
           Dim bytes As Byte() = service.ComputeHash(encoder.GetBytes(key))
 
           provider = New TripleDESCryptoServiceProvider() With {.Key bytes, .Mode CipherMode.ECB, .Padding PaddingMode.PKCS7}
 
           result result 1
        End 
If
 
       Return result
    End 
Function

 
   Private Function ProvideAccess(encoder As Encodingkey As String,
 
                                   ByRef provider As TripleDESCryptoServiceProvider) As MD5CryptoServiceProvider
        Dim service 
As MD5CryptoServiceProvider Nothing
        If DefaultAccess
.Invoke(encoderkeyserviceprovider) > 0 Then
            Return service
        End 
If
 
       Return Nothing
    End 
Function

 
   Friend Delegate Function AccessorCallback(encoder As Encodingkey As StringByRef service As MD5CryptoServiceProviderByRef provider As TripleDESCryptoServiceProvider) As Integer
    Friend Delegate 
Function AccessorEncryptionCallback(encoder As Encodingkey As StringByRef provider As TripleDESCryptoServiceProvider) As MD5CryptoServiceProvider


End 
Class 

الإستخدام

PHP كود :
       Dim key As String "123456"
 
       Dim cryptor As IEncryptionAccessor = New EncryptionAccessor(key"Visual Basic")
 
       Dim encrypted As String cryptor.EncryptString

        Dim decryptor 
As IEncryptionAccessor = New EncryptionAccessor(keyencrypted)
 
       Me.Text decryptor.DecryptedString 
Retired
الرد }}}
#3
هذا المقال استحق التقييم و تم التثبيت للاستفادة .
شكرا جزيلا
الرد }}}
تم الشكر بواسطة: silverlight , ابو خالد , ابو خالد
#4
الأسلوب الخامس :
إستخدام ReverseString

هذا الأسلوب ربما يكون أحد الأساليب البسيطة التي لا تحتاج الي مهارة برمجية كبيرة
الفكرة تنحصر أنك تأخذ التكست المراد تشفييرة ثم تقوم بعمل Reverse له او تعكسه
ثم تقوم بتحويل كل حرف في هذا التكست الي بايت أو بمعني أدق تقوم بتحويل االحروف الي مصفوفة بايت
ولكي تفك التشفير فقط تقوم بتحويل مصفوفة البايت الي String ثم تعكس المدخلات الي اصلها

الدالة التالية تقوم بتحويل اي String إلي String معكوسه حروفه

PHP كود :
   Private Function ReversString(As String) As String
        Dim result 
As String ""
 
       Dim count As Integer = If(Not String.IsNullOrEmpty(s), 10)
 
       If count 0 Then
            For i 
0 To s.Length 1
                result 
+= s(s.Length 1)
 
           Next
        End 
If
 
       Return result
    End 
Function 

مثال:
التشفيير

PHP كود :
       Dim s As String ReversString("Visual Basic")
 
       Dim bytes As Byte() = System.Text.Encoding.Unicode.GetBytes(s

فك التشفيير

PHP كود :
       Dim decrypted As String ReversString(System.Text.Encoding.Unicode.GetString(bytes))
 
       Me.Text decrypted 

طبعا هنا عندما قمت بالتشفيير استخدمت System.Text.Encoding لتحويل string الي مصفوفة بايت
ثم و عند فك التشفيير قمت بتحويل مصفوفة البايت الي String مرة أخري بنفس الأسلوب

طريقة أخري :
أحيانا بعض المبرمجين لا يرغبون في الإعتماد علي الدوال الموجودة في الدوت نت
و هنا علي المبرمج أن يكتب الدوال الخاصة بالتشفيير و فك التشفيير بنفسه
و الأكواد التالية توضح كيف تكتب الكود كاملا بنفسك

ملحوظة :
دالة التشفيير هنا تقوم بتحويل كل حرف الي رقم
وبالتأكيد يمكن للقارئ تحويل الارقام الي بايت
باستخدام الكود الموجود في اللينك التالي
Convert structure to byteArray & viceversa

أيضا علي المبرمج أن لاينسي انه يتعامل مع Char وبالتالي فإن التحويل الي مصفوفة بايت من الحروف الانجليزية يختلف كليا عن تحويل الحروف العربية الي مصفوفة بايت


PHP كود :
   Private Function EncryptReversedString(As String) As String
        Dim reversed 
As String ReversString(s)
 
       Dim result As String ""
 
       Dim count As Integer = If(Not String.IsNullOrEmpty(reversed), 10)
 
       If count 0 Then
            Dim i 
As Integer 0
            While i 
reversed.Length
                Dim chr 
As Char reversed(i)
 
               result += AscW(chr.ToString).ToString
                result 
+= " "c
                i 
+= 1
            End 
While

 
       End If
 
       Return result.TrimEnd(" "c)
 
   End Function

 
   Private Function DecryptReversedString(As String) As String
        Dim result 
As String ""
 
       Dim count As Integer = If(Not String.IsNullOrEmpty(s), 10)
 
       If count 0 Then
            Dim values 
As String() = s.Split(" "c)
 
           Dim i As Integer 0
            While i 
values.Length
                Dim current 
As String values(i)
 
               Dim chr As Char ChrW(CInt(current))
 
               result += chr.ToString
                i 
+= 1
            End 
While
 
       End If

 
       Return Me.ReversString(result)
 
   End Function 

الإستخدام
التشفيير و فك التشفيير

PHP كود :
       Dim s As String ReversString("فيجوال بيسك")
 
       Dim encrypted As String EncryptReversedString(s)


 
       Dim decrypted As String Me.DecryptReversedString(encrypted)
 
       Me.Text ReversString(decrypted

طريقة أخري :

حيث هنا نقوم بتحويل String الي مصفوفة بايت باستخدام System.Text.Encoding
PHP كود :
 Dim s As String "visual basic"
 
       Dim bytes As Byte() = System.Text.Encoding.Unicode.GetBytes(s


ثم نقوم بعكس مصفوفة البايت باستخدام الدالة التالية

PHP كود :
 Private Function Revert(values As Byte()) As Byte()
 
       Dim result As Byte() = New Byte(values.Length 1) {}
 
       For i 0 To values.Length 1
            result
(i) = values(values.Length 1)
 
       Next
        Return result
    End 
Function 

PHP كود :
Dim reversed As Byte() = Revert(bytes

وحين نريد فك التشفيير
نقوم بعكس مصفوفة البايت
PHP كود :
       Dim reReversed As Byte() = Revert(reversed


ثم نستخدم System.Text.Encoding في إعادة المصفوفة الي String

PHP كود :
Dim result As String System.Text.Encoding.Unicode.GetString(reReversed)
 
       Me.Text result 
Retired
الرد }}}
تم الشكر بواسطة: Fantastico , ابو خالد , ابو خالد
#5
الأسلوب السادس
سمك لبن تمر هندي : وهي كلمات تشير الي مثل مصري شعبي يستخدم للتعبير عن شئ فيه لخبطة أو خليط من اشياء قد تفيد او لا تفيد

و الفكرة هنا ببساطة هي أن كل شئ يمكن تحويله الي مصفوفة بايت أو مصفوفة رقمية
و هنا يمكن للمبرمج أن يخلط و يمزج بين بعض الأفكار لكي يخرج بفكرة جديدة للتشفيير و فك التشفيير
و المهم في الفكرة هي أن يضع المبرمج في اعتباره أن يكون للتشفيير أساس أو نقطة بداية يستخدمها المبرمج لاحقا لكي يستطيع فك التشفيير مرة أخري


مثال توضيحي:
التاريخ يمكن تحويله الي مصفوفة بايت أو يمكن تحويله الي رقم


PHP كود :
       ' تحويل التااريخ الي مصفوفة بايت
        Dim dt As DateTime = DateTime.Now
        Dim k As ULong = CULng(dt.ToFileTime)
        Dim bytes As Byte() = BitConverter.GetBytes(k)

        ' 
تحويل مصفوفة البايت الي تاريخ
        Dim m 
As Long BitConverter.ToInt64(bytes0)
 
       Dim resultDT As DateTime DateTime.FromFileTime(m

Guid يمكن تحويله الي مصفوفة بايت أو الي String
وما يهمني أن تلاخظه في الكود التالي هو السعة أو Capacity الخاصة بمصفوفة البايت حيث دائما ستجد قيمتها تساوي 16


PHP كود :
       Dim g As Guid Guid.NewGuid
        Dim bytes 
As Byte() = g.ToByteArray
        Dim s 
As String g.ToString
        Dim length 
As Integer bytes.Length 

ويمكن تحويل String  الي تاريخ أو الي GUID او الي ارقام

تحويل String الي Guid ........ 
الفكرة تنحصر في الخطوات التالية:
1 - تحويل String الي مصفوفة بايت
PHP كود :
       Dim s As String "visual basic"
 
       Dim bytes As Byte() = System.Text.Encoding.Unicode.GetBytes(s

2- ثم و باستخدام اي HashAlgorithm من الموجودة في فضاء الأسماء System.Security.Cryptography و تحسب Hash لهذه المصفوفة و هو سيكون مصفوفة بايت أيضا


PHP كود :
  Dim algorithm As System.Security.Cryptography.HashAlgorithm = New System.Security.Cryptography.SHA512CryptoServiceProvider
        Dim hash 
As Byte() = algorithm.ComputeHash(bytes

3- ثم تبني مصفوفة جديدة من مصفوفة Hash بحيث يكون Capacity الخاصة بهذه المصفوفة يساوي 16


PHP كود :
       Dim length As Integer 16
        Dim values 
As Byte() = New Byte(length 1) {}
 
       Array.Copy(hashvalueslength

4- ثم و في النهاية تقوم بتحويل تلك المصفوفة الي Guid أو تستخدمها لاحقا كما هي بدون تحويلها الي GUID


PHP كود :
       Dim g As Guid = New Guid(values)
 
       Me.Text g.ToString 

الكلاس التالي هو للتشفيير فقط
والأكواد المستخدمة في الكلاس عبارة عن خليط من الأفكار الموجودة في المثال التوضيحي أعلاه


PHP كود :
Imports System.Text
Imports System
.Security.Cryptography

Public Class TextEncoder
    Implements IDisposable

    Private 
Const Indent As String " "c
    Private _provider 
As SHA512CryptoServiceProvider
    Private _guard 
As String
    Private _source 
As String
    Private _key 
As Long
    Private _keyString 
As String ""
 
   Private _sourceString As String ""
 
   Private _guardString As String ""

 
   Public Sub New(source As String)
 
       Me.New(sourcesource)
 
   End Sub

    Public Sub 
New(source As Stringkey As Long)
 
       Me.New(sourcekeysource)
 
   End Sub

    Public Sub 
New(source As Stringguard As String)
 
       Me.New(sourcesource.Lengthguard)
 
   End Sub

    Public Sub 
New(source As Stringkey As Longguard As String)
 
       Me._source source
        Me
._guard guard
        Me
._key key
    End Sub

    Public Overridable ReadOnly Property Encoding 
As Encoding
        Get
            Return Encoding
.Unicode
        End Get
    End Property

    Public ReadOnly Property Key 
As String
        Get
            Me
.WriteKey()
 
           Return Me._keyString
        End Get
    End Property

    Public ReadOnly Property Guard 
As String
        Get
            Me
.WriteGuard()
 
           Return _guardString
        End Get
    End Property

    Public ReadOnly Property Source 
As String
        Get
            Me
.WriteSource()
 
           Return Me._sourceString
        End Get
    End Property

    Protected Overridable Sub EnsureProvider
()
 
       If Me._provider Is Nothing Then
            Me
._provider = New SHA512CryptoServiceProvider
        End 
If
 
   End Sub

    Protected Overridable ReadOnly Property Length 
As Integer
        Get
            Return 16
        End Get
    End Property

    Private Sub WriteKey
()
 
       Dim bytes As Byte() = BitConverter.GetBytes(_key)
 
       Me.WriteKey(bytes)
 
   End Sub

    Private Sub WriteKey
(key As Byte())
 
       If key IsNot Nothing Then
            Dim i 
As Integer 0
            While i 
key.Length
                Dim c 
As Byte key(i)
 
               _keyString += c.ToString
                _keyString 
+= Indent
                i 
+= 1
            End 
While
 
       End If

 
       _keyString _keyString.TrimEnd(Indent)
 
   End Sub

    Private Sub WriteGuard
()
 
       Me.EnsureProvider()
 
       Dim values As Byte() = Me._provider.ComputeHash(Me.Encoding.GetBytes(Me._guard))
 
       Dim bytes As Byte() = New Byte(Me.Length 1) {}
 
       Array.Copy(valuesbytesMe.Length)
 
       Me.WriteGuard(bytes)
 
   End Sub

    Private Sub WriteGuard
(guard As Byte())
 
       If guard IsNot Nothing Then
            Dim i 
As Integer 0
            While i 
guard.Length
                Dim c 
As Byte guard(i)
 
               _guardString += c.ToString
                _guardString 
+= Indent
                i 
+= 1
            End 
While
 
       End If
 
       _guardString _guardString.TrimEnd(Indent)
 
   End Sub

    Private Sub WriteSource
()
 
       Dim bytes As Byte() = Me.Encoding.GetBytes(Me._source)
 
       Me.WriteSource(bytes)
 
   End Sub

    Private Sub WriteSource
(source As Byte())
 
       If source IsNot Nothing Then
            Dim i 
As Integer 0
            While i 
source.Length
                Dim c 
As Byte source(i)
 
               _sourceString += c.ToString
                _sourceString 
+= Indent
                i 
+= 1
            End 
While
 
       End If
 
       _sourceString.TrimEnd(Indent)
 
   End Sub

    Public Sub Dispose
()
 
       If Me._provider IsNot Nothing Then
            Me
._provider.Dispose()
 
       End If
 
   End Sub

    Private Sub IDisposable_Dispose
() Implements IDisposable.Dispose
        Me
.Dispose()
 
   End Sub

    Public Overrides 
Function ToString() As String
        Dim s 
As String Me.Guard.Trim Indent Me.Key.Trim Indent Me.Source.Trim
        Return s
.Trim
    End 
Function

End Class 

استخدام الكلاس


PHP كود :
       Dim s As String "visual basic"
 
       Dim key As String "12345"
 
       Dim guard As String "any Text as password"

 
       Dim encrypted As String = New TextEncoder(skeyguard).ToString
        Me
.Text encrypted 

أبسط نفسيير للفكرة وراء استخدام هذا الأسلوب هو بناء نسق للبيانات بعد تخويلها الي مصفوفات بايت
وهذا النسق قد يكون خليط من مجموعة مصفوفات من البايت
كلمة نسق  في اللغة العربية معناها هو خليط من عناصر معينة مرتبه بشكل منظم و مكونات هذا النسق قد تكون عبارة عن اي نوع مم البينات
وبشكل مبدئي علي المبرمج أن يحدد شكل النسق قبل أن يفكر في تحويله الي كود
هذا الأسلوب يمكن ترجمته الي الانجليزية بإسم Data Layout

المثال الأول :
نحدد شكل النسق :
بيانات عبارة عن String فقط لا غير

PHP كود :
       ' بناء تشفيير بسيط
        Dim source As String = "visual basic"
        ' 
السطر التالي الهدف منه أن نتأكد أن البيانات تم تمريرها
        
' والهدف هنا أن نتجنب أخطاء التنفيذ
        Dim valid As Boolean = If(Not String.IsNullOrEmpty(source), True, False)

        Dim bytes As Byte() = Nothing
        If valid Then
            bytes = System.Text.Encoding.Unicode.GetBytes(source)
        End If

        ' 
فك التشفيير
        
' تأخذ مصفوفة البيات و تعيدها لأصلها

        Dim values As Byte() = bytes
        Dim s As String = String.Empty
        If values IsNot Nothing Then
            s += System.Text.Encoding.Unicode.GetString(values)
        End If
        Me.Text = s 

لو حاولت تحويل مصفوفة البايت الي String
سيكون الكود كالتالي
ملحوظة هامة حاول تغيير نوع Encoding المستخدم و تلاحظ الفارق
للمرة الثانية يجب أن لا تنسي أن تحويل الحروف الانجليزية الي مصفوفة بايت هو الأسهل علي الاطلاق
لكن و حين تتعامل مع حروف غير انجليزية و بسبب قيمة الحرف في جدول الأسكي فإن الحرف العربي يتم تحويله الي 2 بايت


PHP كود :
       ' من الممكن تحويل مصفوفة البايت الي تكست
        Dim result As String = String.Empty
        If bytes IsNot Nothing Then
            Dim i As Integer = 0
            While i < bytes.Length
                result += " "c
                result += bytes(i).ToString
                i += 1
            End While
            result = result.TrimStart(" "c)
        End If 

الكود في المثال يمكن كتابته علي شكل كلاس بسيط كالتالي
PHP كود :
Public Class SimpLayoutEncoder

    Private _source 
As String
    Private _bytes 
As Byte()
 
   Private _valid As Boolean

    Public Sub 
New(source As String)
 
       _source source
        _valid 
= If(Not String.IsNullOrEmpty(source), TrueFalse)
 
   End Sub

    Public ReadOnly Property Vaild 
As Boolean
        Get
            Return Me
._valid
        End Get
    End Property

    Public ReadOnly Property Bytes 
As Byte()
 
       Get
            Me
.EnsureDataSourceBytes()
 
           Return Me._bytes
        End Get
    End Property

    Private Sub EnsureDataSourceBytes
()
 
       If Me._valid Then
            Me
._bytes System.Text.Encoding.Unicode.GetBytes(Me._source)
 
       End If
 
   End Sub

    Public Overrides 
Function ToString() As String
        If Me
._bytes Is Nothing Then
            Return String
.Empty
 
       End If
 
       Dim result As String String.Empty
 
       If _bytes IsNot Nothing Then
            Dim i 
As Integer 0
            While i 
_bytes.Length
                result 
+= " "c
                result 
+= _bytes(i).ToString
                i 
+= 1
            End 
While
 
           result result.TrimStart(" "c)
 
       End If
 
       Return result
    End 
Function

End Class 

إستخدام الكلاس
في التشفيير
PHP كود :
       Dim anyString As String "Visual Basic"
 
       Dim layoutEncoder As SimpLayoutEncoder = New SimpLayoutEncoder(anyString)
 
       Dim resultBytes As Byte() = Nothing
        If layoutEncoder
.Vaild Then
            resultBytes 
layoutEncoder.Bytes
        End 
If

 
       Me.Text layoutEncoder.ToString 

فك التشفيير

PHP كود :
       Dim s As String String.Empty
 
       If resultBytes IsNot Nothing Then
            s 
+= System.Text.Encoding.Unicode.GetString(resultBytes)
 
       End If
 
       Me.Text 
Retired
الرد }}}
تم الشكر بواسطة: ابو خالد , أسامة السالمي
#6
المثال الثاني
نحدد شكلا أخر للنسق :
1- بيانات عبارة عن String مطاوب تشفييرها
2- نضيف رقم للنسق كمفتاح للتشفيير

التشفيير يتم بتحويل string الي مصفوفة بايت و تحويل المفتاح الي مصفوفة بايت ثم نجمع المصفوفتان معا لنحصل علي مصفوفة ثالثة تكون ناتج التشفيير
ملحوظة هامة
عندما تقوم بتحويل الأرقام الي مصفوفة بايت
Integer يعطيك مصفوفة السعة الخاصة بها 4 بايت
Long يعطيك مصفوفة السعة الخاصة بها 8 بايت

الكود التالي لتوضيح الفكرة:
التشفيير
PHP كود :
       ' تعريف البيانات المراد تشفيييها
        Dim s As String = "Visual Basic"
        Dim key As Long = CLng(123456789)

        ' 
تحويل البيانات الي مصفوفة بايت
        Dim sourceBytes 
As Byte() = System.Text.Encoding.Unicode.GetBytes(s)
 
       Dim keyBytes As Byte() = BitConverter.GetBytes(key)

 
       ' نبيني مصفوفة جديدة يكون حجمها مساويا لحجم مصفوفة التكست + مصفوفة الرقم
        Dim result As Byte() = New Byte(keyBytes.Length + sourceBytes.Length - 1) {}

        ' 
نقوم بنسخ البانات من المصفوفتان الي المصفوفة

        System
.Array.Copy(keyBytes0result0keyBytes.Length)
 
       System.Array.Copy(sourceBytes0resultkeyBytes.LengthsourceBytes.Length

فك التشفيير
بما ان المفتاح أو الرقم المستخدم من النوع Long فإن طول المصفوفة الخاصة به تساوي 8 بايت


PHP كود :
       ' نحدد طول مصوفة المفتاح او الرقم
        Dim keySize As Integer = 8
        ' 
نحذف 8 بايت من المصفوفة الخاصة بناتج التشفيير
        Dim stringBytes 
As Byte() = result.Skip(keySize).ToArray
        
' نقوم بتحويل المصفوفة الي اصلها
        Dim resultString As String = System.Text.Encoding.Unicode.GetString(stringBytes)

        ' 
ناخذ فقط أول 8 بايت من مصفوفة التشفيير
        Dim numberBytes 
As Byte() = result.Take(keySize).ToArray
        
' نقوم بتحويل المصفوفة الي رقم مرة أخري
        Dim resultNumber As Long = BitConverter.ToInt64(numberBytes, 0) 

الكود في المثال يمكن تحويله الي كلاس بسيط كالتالي

PHP كود :
Public Class KeyLayoutEncoder

    Private _source 
As String
    Private _bytes 
As Byte()
 
   Private _validSource As Boolean
    Private _validKey 
As Boolean
    Private _key 
As Long

    Public Sub 
New(source As Stringkey As Long)
 
       _source source
        _key 
key
        _validSource 
= If(Not String.IsNullOrEmpty(source), TrueFalse)
 
       _validkey = If(Not key NothingTrueFalse)
 
   End Sub

    Public ReadOnly Property Vaild 
As Boolean
        Get
            Return Me
._validSource AndAlso _validKey
        End Get
    End Property

    Public ReadOnly Property KeySize 
As Integer
        Get
            Return 8
        End Get
    End Property

    Public ReadOnly Property Bytes 
As Byte()
 
       Get
            Me
.EnsureData()
 
           Return Me._bytes
        End Get
    End Property

    Private Sub EnsureData
()
 
       If Me._validSource AndAlso _validKey Then
            Dim sourceBytes 
As Byte() = System.Text.Encoding.Unicode.GetBytes(Me._source)
 
           Dim keyBytes As Byte() = BitConverter.GetBytes(_key)
 
           _bytes = New Byte(keyBytes.Length sourceBytes.Length 1) {}
 
           System.Array.Copy(keyBytes0_bytes0keyBytes.Length)
 
           System.Array.Copy(sourceBytes0_byteskeyBytes.LengthsourceBytes.Length)
 
       End If
 
   End Sub

    Public Overrides 
Function ToString() As String
        If Me
._bytes Is Nothing Then
            Return String
.Empty
 
       End If
 
       Dim result As String String.Empty
 
       If _bytes IsNot Nothing Then
            Dim i 
As Integer 0
            While i 
_bytes.Length
                result 
+= " "c
                result 
+= _bytes(i).ToString
                i 
+= 1
            End 
While
 
           result result.TrimStart(" "c)
 
       End If
 
       Return result
    End 
Function

End Class 


استخدام الكلاس


PHP كود :
       Dim s As String "Visual Basic"
 
       Dim key As Long CLng(123456789)

 
       Dim keyLayout As KeyLayoutEncoder = New KeyLayoutEncoder(skey)
 
       Dim bytes As Byte() = keyLayout.Bytes 

طبعا من الممكن كتابة كلاس أخر لفك التشقيير أو يتم كتابة الكود الخاص بفك التشفيير علي شكل دالة بسيطة و القرار هنا يكون لمن سيكتب الكود
حاول عزيزيى القارئ أنك تكتب دالة بسيطة لكي تفك التشفيير الخاص بالكلاس
Retired
الرد }}}
تم الشكر بواسطة: ابو خالد , ابو خالد , أسامة السالمي
#7
المثال الثالث :
نحدد شكلا أخر للنسق :
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) {}
 
       ' سيتم تمرير مصفوفات البايت بالترتيب التالي
        ' 
1hash bytes ------- طول المصفوفة 64 بايت
        
' 2- date bytes ------- طول المصفوفة 8 بايت
        ' 
3key 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
الرد }}}
تم الشكر بواسطة: ابو خالد , ابو خالد
#8
الأسلوب السابع:
String Indent
وهو أحد الأساليب البسيطة جدا للتشفيير
و الفكرة تكمن في انك تأخذ اي String و تضيف له أي String أخر

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


PHP كود :
   Private Function TryIndent(ByRef source As Stringfunc As Func(Of StringString)) As Boolean
        While func IsNot Nothing
            Dim src 
As String source
            Dim dest 
As String func(src)
 
           If src dest Then
                Exit 
While
 
           End If
 
           If src <> dest Then
                Return True
            End 
If
 
       End While
 
       Return False
    End 
Function

 
   Private Function TryIndent(func As Func(Of StringString)) As Boolean
        Dim source 
As String Nothing
        Return TryIndent
(sourcefunc)
 
   End Function 

كيفية استخدام الدالة أعلاه

PHP كود :
       Dim indent As String "1234"
 
       Dim func As Func(Of StringString) = Function(sindent s
        Dim toIndnet 
As String "56789"
 
       Dim indented As String String.Empty
 
       If TryIndent(funcThen
            indented 
+= func(toIndnet)
 
       End If

 
       Me.Text indented 

طبعا و لفك التشغيير عليك فقط أن تحذف الجزء الذي تم إضافته الي String الأضلي


نفس الفكرة هذه من الممكن استخدامها في تجميل أو تزيين أي  String
ومن الممكن طبعا تحويل الناتج الي مصفوفة بايت
مثال
PHP كود :
       Dim indent As String "♥´¯`*•.¸¸♥"
 
       Dim func As Func(Of StringString) = Function(sindent indent
        Dim toIndnet 
As String "visual basci"
 
       Dim indented As String String.Empty
 
       If TryIndent(funcThen
            indented 
+= func(toIndnet)
 
       End If

 
       Me.Text indented 
Retired
الرد }}}
#9
ماشأ الله تبارك الله

كفييت ووفيت

شرح رائع وجميل  ووافي وكامل


جزاك الله الف خير
الرد }}}
تم الشكر بواسطة: silverlight
#10
الأسلوب الثامن:
Hashing & Unhashing
هذا الأسلوب تم توضيحه في الموضوع الموجود في اللينك التالي
Hash & Unhash

و هنا فقط اريد اضافة شئ بسيط لهذا الموضوع و هو كيفية استخدام كل من
Left Shift = (<<) و Right Shift = (>>)

مثال بسيط علي Left Shift = (<<)


PHP كود :
Dim chr As Char "A"c
        Dim x 
As Integer AscW(chr)
 
       x << 16 

الفكرة ببساطه هنا أننا تضرب الأسكي كود الخاص بأي حرف في القيمة 2 أس 16
أو بمعني أدق نضربها في 2 مرفوعة لأي أس و ليس 16 تحديدا
نفس الكود أعلاه يمكن كتابته كالأتي
PHP كود :
       Dim chr As Char "A"c
        Dim x 
As Integer AscW(chr)
 
       x * (16

و أيضا يمكن كتابته كالأتي

PHP كود :
       Dim chr As Char "A"c
        Dim x 
As Integer AscW(chr)
 
       x Math.Pow(216

و لفك التشفيير
يتم استخدام  Right Shift = (>>)
الفكرة ببساطه هنا أننا نقسم الرقم المشفر علي القيمة 2 أس 16
PHP كود :
       Dim y As Integer x
        y 
>> 16
        Dim result 
As Char ChrW(y

أيضا يمكن كتابة الكود بالشكل التالي


PHP كود :
       Dim y As Integer x
        y 
/ (16)
 
       Dim result As Char ChrW(y

,وأيضا يمكن كتابة الكود كالتالي
PHP كود :
       Dim y As Integer x
        y 
Math.Pow(216)
 
       Dim result As Char ChrW(y

حاول أن نقوم بتغيير الرقم 16 و هو هنا يمثل الأس
خاول تغييره الي اي رقم اخر اقل من 16 أو أكبر من 16
يجب فقط أن تضع في اعتبارك أن Integer له MaxValue و له MinValue

في الكود أعلاه قمت فقط بتوضيح كيفية تشفيير و فك التتشفيير لحرف واحد
حاول تتطبق الفكرة علي string لتري كيف يتم التشفيير و العكس

يمكن كتابة الكود أعلاه علي شكل دوال رياضية كالتالي

PHP كود :
   Private Function LeftShift(As Integerbase As Integerpower As Integer) As Integer
        Return 
(Math.Pow(basepower))
 
   End Function

 
   Private Function RightShift(As Integerbase As Integerpower As Integer) As Integer
        Return 
(Math.Pow(basepower))
 
   End Function 

استخدام احدي الدالتين في التشفيير
PHP كود :
       Dim chr As Char "A"c
        Dim x 
As Integer AscW(chr)
 
       x LeftShift(x83

وأيضا يمكن كتابة الكود علي هيئة كلاس كالتالي

PHP كود :
Public Class BitWise

    Private value 
As Integer
    Private base 
As Integer
    Private power 
As Integer

    Public Sub 
New(value As Integerbase As Integerpower As Integer)
 
       Me.value value
        Me
.base base
        Me
.power power
    End Sub

    Public ReadOnly Property Left 
As Integer
        Get
            Return 
(value Math.Pow(basepower))
 
       End Get
    End Property

    Public ReadOnly Property Right 
As Integer
        Get
            Return 
(value Math.Pow(basepower))
 
       End Get
    End Property

End 
Class 
Retired
الرد }}}
تم الشكر بواسطة: أسامة السالمي



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


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