المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
21-09-17, 01:59 PM
(آخر تعديل لهذه المشاركة : 26-09-17, 01:21 PM {2} بواسطة silverlight.)
تشفير البيانات موضوع مهم جدا لكل مبرمج كمبيوتر
و في مرحلة معينة قد يحتاج المبرمج إلي تشفير المعلومات من أجل إخفاء معلومات معينة مهمة عين عيون المتطفلين
وغالبا كل مبرمج يجتهد في أن يخترع لنفسه نظام تشفير لا يعرفه غيره
وفي هذا الموضوع سنناقش بعضا من أساليب التشفيير البسيطة
قبل أن نسطرد في الحديث لنسأل أنفسنا سؤالا بسيطا
لماذا اي كلاس جديد يتم بناؤه تجد به أتوماتيكا ثلاثة من الدوال وهي كالأتي
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
Retired
تم الشكر بواسطة: سعود , سعود , محمد كريّم , Amir_Alzubidy , Fantastico , ابو خالد , sendbad100 , sendbad100 , أسامة السالمي , اسامه الهرماوي , اسامه الهرماوي
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
26-09-17, 01:42 PM
(آخر تعديل لهذه المشاركة : 26-09-17, 03:47 PM {2} بواسطة silverlight.)
الأسلوب الرابع :
تحويل البيانات الي 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(s As String) As IEncoder Return New EncoderDecoder(s) End Function
Public Shared Function Decode(s 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 Nothing, 1, 0) 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 String, source 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, _key, provider) Dim buffer As Byte() = Convert.FromBase64String(Me._source) Dim bytes As Byte() = Nothing Try Dim transform As ICryptoTransform = provider.CreateDecryptor() bytes = transform.TransformFinalBlock(buffer, 0, buffer.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, _key, provider) Dim buffer As Byte() = encoder.GetBytes(_source) Dim bytes As Byte() = Nothing Try Dim transform As ICryptoTransform = provider.CreateEncryptor() bytes = transform.TransformFinalBlock(buffer, 0, buffer.Length) Catch ex As Exception Finally service.Clear() provider.Clear() End Try Return Convert.ToBase64String(bytes) End Function
Private Function ProvideAccess(encoder As Encoding, key As String, ByRef service As MD5CryptoServiceProvider, ByRef provider As TripleDESCryptoServiceProvider) As Integer Dim result As Integer = 0 service = Nothing provider = Nothing If Not String.IsNullOrEmpty(key) Then 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 Encoding, key As String, ByRef provider As TripleDESCryptoServiceProvider) As MD5CryptoServiceProvider Dim service As MD5CryptoServiceProvider = Nothing If DefaultAccess.Invoke(encoder, key, service, provider) > 0 Then Return service End If Return Nothing End Function
Friend Delegate Function AccessorCallback(encoder As Encoding, key As String, ByRef service As MD5CryptoServiceProvider, ByRef provider As TripleDESCryptoServiceProvider) As Integer Friend Delegate Function AccessorEncryptionCallback(encoder As Encoding, key As String, ByRef 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(key, encrypted) Me.Text = decryptor.DecryptedString
Retired
المشاركات : 2,469
المواضيع 2
الإنتساب : Nov 2014
السمعة :
604
الشكر: 17077
تم شكره 15270 مرات في 3000 مشاركات
هذا المقال استحق التقييم و تم التثبيت للاستفادة .
شكرا جزيلا
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
27-09-17, 12:15 PM
(آخر تعديل لهذه المشاركة : 27-09-17, 01:26 PM {2} بواسطة silverlight.)
الأسلوب الخامس :
إستخدام ReverseString
هذا الأسلوب ربما يكون أحد الأساليب البسيطة التي لا تحتاج الي مهارة برمجية كبيرة
الفكرة تنحصر أنك تأخذ التكست المراد تشفييرة ثم تقوم بعمل Reverse له او تعكسه
ثم تقوم بتحويل كل حرف في هذا التكست الي بايت أو بمعني أدق تقوم بتحويل االحروف الي مصفوفة بايت
ولكي تفك التشفير فقط تقوم بتحويل مصفوفة البايت الي String ثم تعكس المدخلات الي اصلها
الدالة التالية تقوم بتحويل اي String إلي String معكوسه حروفه
PHP كود :
Private Function ReversString(s As String) As String Dim result As String = "" Dim count As Integer = If(Not String.IsNullOrEmpty(s), 1, 0) If count > 0 Then For i = 0 To s.Length - 1 result += s(s.Length - i - 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(s As String) As String Dim reversed As String = ReversString(s) Dim result As String = "" Dim count As Integer = If(Not String.IsNullOrEmpty(reversed), 1, 0) 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(s As String) As String Dim result As String = "" Dim count As Integer = If(Not String.IsNullOrEmpty(s), 1, 0) 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 - i - 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
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
27-09-17, 04:35 PM
(آخر تعديل لهذه المشاركة : 03-10-17, 02:52 PM {2} بواسطة silverlight.)
الأسلوب السادس
سمك لبن تمر هندي : وهي كلمات تشير الي مثل مصري شعبي يستخدم للتعبير عن شئ فيه لخبطة أو خليط من اشياء قد تفيد او لا تفيد
و الفكرة هنا ببساطة هي أن كل شئ يمكن تحويله الي مصفوفة بايت أو مصفوفة رقمية
و هنا يمكن للمبرمج أن يخلط و يمزج بين بعض الأفكار لكي يخرج بفكرة جديدة للتشفيير و فك التشفيير
و المهم في الفكرة هي أن يضع المبرمج في اعتباره أن يكون للتشفيير أساس أو نقطة بداية يستخدمها المبرمج لاحقا لكي يستطيع فك التشفيير مرة أخري
مثال توضيحي:
التاريخ يمكن تحويله الي مصفوفة بايت أو يمكن تحويله الي رقم
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
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
30-09-17, 11:59 AM
(آخر تعديل لهذه المشاركة : 30-09-17, 02:23 PM {2} بواسطة silverlight.)
المثال الثاني
نحدد شكلا أخر للنسق :
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(keyBytes, 0, result, 0, keyBytes.Length) System.Array.Copy(sourceBytes, 0, result, keyBytes.Length, sourceBytes.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 String, key As Long) _source = source _key = key _validSource = If(Not String.IsNullOrEmpty(source), True, False) _validkey = If(Not key = Nothing, True, False) 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(keyBytes, 0, _bytes, 0, keyBytes.Length) System.Array.Copy(sourceBytes, 0, _bytes, keyBytes.Length, sourceBytes.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(s, key) Dim bytes As Byte() = keyLayout.Bytes
طبعا من الممكن كتابة كلاس أخر لفك التشقيير أو يتم كتابة الكود الخاص بفك التشفيير علي شكل دالة بسيطة و القرار هنا يكون لمن سيكتب الكود
حاول عزيزيى القارئ أنك تكتب دالة بسيطة لكي تفك التشفيير الخاص بالكلاس
Retired
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
30-09-17, 02:22 PM
(آخر تعديل لهذه المشاركة : 01-10-17, 10:57 AM {2} بواسطة silverlight.)
المثال الثالث :
نحدد شكلا أخر للنسق :
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) {} ' سيتم تمرير مصفوفات البايت بالترتيب التالي ' 1- hash bytes ------- طول المصفوفة 64 بايت ' 2- date bytes ------- طول المصفوفة 8 بايت ' 3- key 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
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
01-10-17, 02:12 PM
(آخر تعديل لهذه المشاركة : 01-10-17, 02:32 PM {2} بواسطة silverlight.)
الأسلوب السابع:
String Indent
وهو أحد الأساليب البسيطة جدا للتشفيير
و الفكرة تكمن في انك تأخذ اي String و تضيف له أي String أخر
وهذا الفكرة من الممكن كتابة الكود الخاص بها بطرق برمجية كثيرة
و الكود التالي يمثل واحدا من هذه الطرق
PHP كود :
Private Function TryIndent(ByRef source As String, func As Func(Of String, String)) 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 String, String)) As Boolean Dim source As String = Nothing Return TryIndent(source, func) End Function
كيفية استخدام الدالة أعلاه
PHP كود :
Dim indent As String = "1234" Dim func As Func(Of String, String) = Function(s) indent + s Dim toIndnet As String = "56789" Dim indented As String = String.Empty If TryIndent(func) Then indented += func(toIndnet) End If
Me.Text = indented
طبعا و لفك التشغيير عليك فقط أن تحذف الجزء الذي تم إضافته الي String الأضلي
نفس الفكرة هذه من الممكن استخدامها في تجميل أو تزيين أي String
ومن الممكن طبعا تحويل الناتج الي مصفوفة بايت
مثال
PHP كود :
Dim indent As String = "♥´¯`*•.¸¸♥" Dim func As Func(Of String, String) = Function(s) indent + s + indent Dim toIndnet As String = "visual basci" Dim indented As String = String.Empty If TryIndent(func) Then indented += func(toIndnet) End If
Me.Text = indented
Retired
المشاركات : 1,545
المواضيع 33
الإنتساب : Jul 2016
السمعة :
255
الشكر: 6532
تم شكره 4340 مرات في 1696 مشاركات
02-10-17, 03:10 PM
(آخر تعديل لهذه المشاركة : 02-10-17, 03:11 PM {2} بواسطة sendbad100.)
ماشأ الله تبارك الله
كفييت ووفيت
شرح رائع وجميل ووافي وكامل
جزاك الله الف خير
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
04-10-17, 11:12 AM
(آخر تعديل لهذه المشاركة : 04-10-17, 11:30 AM {2} بواسطة silverlight.)
الأسلوب الثامن:
Hashing & Unhashing
هذا الأسلوب تم توضيحه في الموضوع الموجود في اللينك التالي
Hash & Unhash
و هنا فقط اريد اضافة شئ بسيط لهذا الموضوع و هو كيفية استخدام كل من
Left Shift = (<<) و Right Shift = (>>)
مثال بسيط علي Left Shift = (<<)
PHP كود :
Dim chr As Char = "A"c Dim x As Integer = AscW(chr) x = x << 16
الفكرة ببساطه هنا أننا تضرب الأسكي كود الخاص بأي حرف في القيمة 2 أس 16
أو بمعني أدق نضربها في 2 مرفوعة لأي أس و ليس 16 تحديدا
نفس الكود أعلاه يمكن كتابته كالأتي
PHP كود :
Dim chr As Char = "A"c Dim x As Integer = AscW(chr) x = x * (2 ^ 16)
و أيضا يمكن كتابته كالأتي
PHP كود :
Dim chr As Char = "A"c Dim x As Integer = AscW(chr) x = x * Math.Pow(2, 16)
و لفك التشفيير
يتم استخدام Right Shift = (>>)
الفكرة ببساطه هنا أننا نقسم الرقم المشفر علي القيمة 2 أس 16
PHP كود :
Dim y As Integer = x y = y >> 16 Dim result As Char = ChrW(y)
أيضا يمكن كتابة الكود بالشكل التالي
PHP كود :
Dim y As Integer = x y = y / (2 ^ 16) Dim result As Char = ChrW(y)
,وأيضا يمكن كتابة الكود كالتالي
PHP كود :
Dim y As Integer = x y = y / Math.Pow(2, 16) Dim result As Char = ChrW(y)
حاول أن نقوم بتغيير الرقم 16 و هو هنا يمثل الأس
خاول تغييره الي اي رقم اخر اقل من 16 أو أكبر من 16
يجب فقط أن تضع في اعتبارك أن Integer له MaxValue و له MinValue
في الكود أعلاه قمت فقط بتوضيح كيفية تشفيير و فك التتشفيير لحرف واحد
حاول تتطبق الفكرة علي string لتري كيف يتم التشفيير و العكس
يمكن كتابة الكود أعلاه علي شكل دوال رياضية كالتالي
PHP كود :
Private Function LeftShift(x As Integer, base As Integer, power As Integer) As Integer Return (x * Math.Pow(base, power)) End Function
Private Function RightShift(x As Integer, base As Integer, power As Integer) As Integer Return (x / Math.Pow(base, power)) End Function
استخدام احدي الدالتين في التشفيير
PHP كود :
Dim chr As Char = "A"c Dim x As Integer = AscW(chr) x = LeftShift(x, 8, 3)
وأيضا يمكن كتابة الكود علي هيئة كلاس كالتالي
PHP كود :
Public Class BitWise
Private value As Integer Private base As Integer Private power As Integer
Public Sub New(value As Integer, base As Integer, power As Integer) Me.value = value Me.base = base Me.power = power End Sub
Public ReadOnly Property Left As Integer Get Return (value * Math.Pow(base, power)) End Get End Property
Public ReadOnly Property Right As Integer Get Return (value / Math.Pow(base, power)) End Get End Property
End Class
Retired
|