27-09-17, 04:35 PM
(آخر تعديل لهذه المشاركة : 03-10-17, 02:52 PM {2} بواسطة silverlight.)
الأسلوب السادس
سمك لبن تمر هندي : وهي كلمات تشير الي مثل مصري شعبي يستخدم للتعبير عن شئ فيه لخبطة أو خليط من اشياء قد تفيد او لا تفيد
و الفكرة هنا ببساطة هي أن كل شئ يمكن تحويله الي مصفوفة بايت أو مصفوفة رقمية
و هنا يمكن للمبرمج أن يخلط و يمزج بين بعض الأفكار لكي يخرج بفكرة جديدة للتشفيير و فك التشفيير
و المهم في الفكرة هي أن يضع المبرمج في اعتباره أن يكون للتشفيير أساس أو نقطة بداية يستخدمها المبرمج لاحقا لكي يستطيع فك التشفيير مرة أخري
مثال توضيحي:
التاريخ يمكن تحويله الي مصفوفة بايت أو يمكن تحويله الي رقم
Guid يمكن تحويله الي مصفوفة بايت أو الي String
وما يهمني أن تلاخظه في الكود التالي هو السعة أو Capacity الخاصة بمصفوفة البايت حيث دائما ستجد قيمتها تساوي 16
ويمكن تحويل String الي تاريخ أو الي GUID او الي ارقام
تحويل String الي Guid ........
الفكرة تنحصر في الخطوات التالية:
1 - تحويل String الي مصفوفة بايت
2- ثم و باستخدام اي HashAlgorithm من الموجودة في فضاء الأسماء System.Security.Cryptography و تحسب Hash لهذه المصفوفة و هو سيكون مصفوفة بايت أيضا
3- ثم تبني مصفوفة جديدة من مصفوفة Hash بحيث يكون Capacity الخاصة بهذه المصفوفة يساوي 16
4- ثم و في النهاية تقوم بتحويل تلك المصفوفة الي Guid أو تستخدمها لاحقا كما هي بدون تحويلها الي GUID
الكلاس التالي هو للتشفيير فقط
والأكواد المستخدمة في الكلاس عبارة عن خليط من الأفكار الموجودة في المثال التوضيحي أعلاه
استخدام الكلاس
أبسط نفسيير للفكرة وراء استخدام هذا الأسلوب هو بناء نسق للبيانات بعد تخويلها الي مصفوفات بايت
وهذا النسق قد يكون خليط من مجموعة مصفوفات من البايت
كلمة نسق في اللغة العربية معناها هو خليط من عناصر معينة مرتبه بشكل منظم و مكونات هذا النسق قد تكون عبارة عن اي نوع مم البينات
وبشكل مبدئي علي المبرمج أن يحدد شكل النسق قبل أن يفكر في تحويله الي كود
هذا الأسلوب يمكن ترجمته الي الانجليزية بإسم Data Layout
المثال الأول :
نحدد شكل النسق :
بيانات عبارة عن String فقط لا غير
لو حاولت تحويل مصفوفة البايت الي String
سيكون الكود كالتالي
ملحوظة هامة حاول تغيير نوع Encoding المستخدم و تلاحظ الفارق
للمرة الثانية يجب أن لا تنسي أن تحويل الحروف الانجليزية الي مصفوفة بايت هو الأسهل علي الاطلاق
لكن و حين تتعامل مع حروف غير انجليزية و بسبب قيمة الحرف في جدول الأسكي فإن الحرف العربي يتم تحويله الي 2 بايت
الكود في المثال يمكن كتابته علي شكل كلاس بسيط كالتالي
إستخدام الكلاس
في التشفيير
فك التشفيير
سمك لبن تمر هندي : وهي كلمات تشير الي مثل مصري شعبي يستخدم للتعبير عن شئ فيه لخبطة أو خليط من اشياء قد تفيد او لا تفيد
و الفكرة هنا ببساطة هي أن كل شئ يمكن تحويله الي مصفوفة بايت أو مصفوفة رقمية
و هنا يمكن للمبرمج أن يخلط و يمزج بين بعض الأفكار لكي يخرج بفكرة جديدة للتشفيير و فك التشفيير
و المهم في الفكرة هي أن يضع المبرمج في اعتباره أن يكون للتشفيير أساس أو نقطة بداية يستخدمها المبرمج لاحقا لكي يستطيع فك التشفيير مرة أخري
مثال توضيحي:
التاريخ يمكن تحويله الي مصفوفة بايت أو يمكن تحويله الي رقم
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(bytes, 0)
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(hash, values, length)
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(source, source)
End Sub
Public Sub New(source As String, key As Long)
Me.New(source, key, source)
End Sub
Public Sub New(source As String, guard As String)
Me.New(source, source.Length, guard)
End Sub
Public Sub New(source As String, key As Long, guard 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(values, bytes, Me.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(s, key, guard).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), True, False)
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 = s
Retired

