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

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


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


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
الرد }}}
تم الشكر بواسطة: ابو خالد , أسامة السالمي


الردود في هذا الموضوع
التشفير وهم أم حقيقة - بواسطة 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 ) ضيف كريم