17-03-16, 07:03 PM
(آخر تعديل لهذه المشاركة : 17-03-16, 07:05 PM {2} بواسطة silverlight.)
السلام عليكم ورحمة الله وبركاته
من فترة ليست بالقصيرة كنت قرأت في MSDN عن الكلاس DeflateStream وطبقا للمثال الموجود في مايكروسوفت فإن هذا الكلاس يقوم بضغط ملف أو يقوم بفك الضغط عن ملف أي أنه يقوم بعمل Compress أو Decompress و عندما استخدمت المثال الموجود في مايكروسوفت لضفط ملف وحيد وهذا الملف كان عبارة عن صورة عادية ثم حاولت أن أفتح الملف مرةأخري بعد ضغطه بأحد برامج الصور العادية هنا اكتشفت أن الملف لا يعمل ولا يمكن أن تستطيع فتح الملف مرة أخري إلا بعد أن تقوم بإلغاء عملية الضغط التي حدثت لهذا الملف
الحقيقة هذا الأمر لفت إنتباهي جدا وعندما بدأت أدرس الأمر اكتشفت أن الكلاس لا يقوم فقط بضغط الملف بل هو فعليا يقوم أيضا بتشفيير الملف
وبما أننا نتعامل مع كلاس تم توريثه من Stream
وبما أن الكلاس يستطيع ضغط و تشفيير ملف فهل من الممكن أن يقوم الكلاس بضغط و تشفير String مثلا؟
والإجابة عن هذا التساؤل تكمن في الكلاس الموجود أدناه و الذي من الممكن استخدامه في تشفيير و فك التشفيير لأي String
الكود التالي يوضح كيفية إستخدام الكلاس في تشفيير و إلغاء التشقيير
بالنهاية أعتقد أن أهم مميزات الكلاس DeflateStream هو أنه من الممكن استخدامه وبسهولة في عمل نسخة احتياطية مشفرة للملفات ثم يتم إسترجاع النسخة الإحتياطية حين الحاجة لها وأعتقد أن المثال الموجود في مايكروسوفت يؤكد هذا
المصادر
DeflateStream Class
الكود كاملا بالمرفقات وهو مكتوب بنسخة الفيجوال استوديو 2015
من فترة ليست بالقصيرة كنت قرأت في MSDN عن الكلاس DeflateStream وطبقا للمثال الموجود في مايكروسوفت فإن هذا الكلاس يقوم بضغط ملف أو يقوم بفك الضغط عن ملف أي أنه يقوم بعمل Compress أو Decompress و عندما استخدمت المثال الموجود في مايكروسوفت لضفط ملف وحيد وهذا الملف كان عبارة عن صورة عادية ثم حاولت أن أفتح الملف مرةأخري بعد ضغطه بأحد برامج الصور العادية هنا اكتشفت أن الملف لا يعمل ولا يمكن أن تستطيع فتح الملف مرة أخري إلا بعد أن تقوم بإلغاء عملية الضغط التي حدثت لهذا الملف
الحقيقة هذا الأمر لفت إنتباهي جدا وعندما بدأت أدرس الأمر اكتشفت أن الكلاس لا يقوم فقط بضغط الملف بل هو فعليا يقوم أيضا بتشفيير الملف
وبما أننا نتعامل مع كلاس تم توريثه من Stream
وبما أن الكلاس يستطيع ضغط و تشفيير ملف فهل من الممكن أن يقوم الكلاس بضغط و تشفير String مثلا؟
والإجابة عن هذا التساؤل تكمن في الكلاس الموجود أدناه و الذي من الممكن استخدامه في تشفيير و فك التشفيير لأي String
PHP كود :
Public MustInherit Class Deflator
Private Const bufferSize As Integer = 4096 ' (1024 *4)
Public Shared Function GetDefaultDeflator() As Func(Of Deflator)
Return Function() GetDeflators()(0)()
End Function
Private Shared Iterator Function GetDeflators() As IEnumerable(Of Func(Of Deflator))
Yield Function() New DefaultDeflator
Return
End Function
Friend MustOverride Function Encrypt(source As String) As Func(Of String)
Friend MustOverride Function Decrypt(decryptedText As String) As Func(Of String)
Private Function TryToDecrypt(decryptedText As String, ByRef text As String) As Func(Of Boolean)
Dim buffer As Byte() = CType(Nothing, Byte())
Dim canDecryptString As Boolean = CType(Nothing, Boolean)
Try
buffer = Convert.FromBase64String(decryptedText)
Catch ex As Exception
text = Nothing
canDecryptString = False
Return Function() canDecryptString
End Try
Dim bytes As Byte() = CType(Nothing, Byte())
Using ms As MemoryStream = New MemoryStream(buffer)
Using ds As DeflateStream = New DeflateStream(ms, CompressionMode.Decompress)
Try
bytes = Read(ds)()
Catch ex As Exception
text = Nothing
canDecryptString = False
Return Function() canDecryptString
End Try
End Using
End Using
Try
text = Encoding.UTF8.GetString(bytes)
canDecryptString = True
Catch ex As Exception
text = Nothing
canDecryptString = False
End Try
Return Function() canDecryptString
End Function
Private Function Read(ds As DeflateStream) As Func(Of Byte())
Dim bytes As Byte() = New Byte(bufferSize - 1) {}
Dim buffer As Byte() = CType(Nothing, Byte())
Using ms As MemoryStream = New MemoryStream()
While True
Dim NumberOfDecompressedBytes As Integer = ds.Read(bytes, 0, bytes.Length)
Dim count As Integer = NumberOfDecompressedBytes
If count <= 0 Then
Exit While
End If
ms.Write(bytes, 0, count)
End While
buffer = ms.ToArray()
End Using
Return Function() buffer
End Function
#Region "DefaultDeflator"
Private Class DefaultDeflator
Inherits Deflator
Friend Overrides Function Decrypt(decryptedText As String) As Func(Of String)
Dim result As String = CType(Nothing, String)
If MyBase.TryToDecrypt(decryptedText, result)() Then
Return Function() result
End If
Return Nothing
End Function
Friend Overrides Function Encrypt(source As String) As Func(Of String)
Dim bytes As Byte() = Encoding.UTF8.GetBytes(source)
Dim buffer As Byte() = CType(Nothing, Byte())
Using ms As MemoryStream = New MemoryStream()
Using ds As DeflateStream = New DeflateStream(ms, CompressionMode.Compress)
ds.Write(bytes, 0, bytes.Length)
ds.Flush()
ds.Close()
End Using
buffer = ms.ToArray()
End Using
Return Function() Convert.ToBase64String(buffer)
End Function
End Class
#End Region
End Class
الكود التالي يوضح كيفية إستخدام الكلاس في تشفيير و إلغاء التشقيير
PHP كود :
Public Class Form1
Private Sub Encrypt_Btn_Click(sender As Object, e As EventArgs) Handles Encrypt_Btn.Click
Dim source As String = TextBox1.Text
If Not String.IsNullOrEmpty(source) Then
Label1.Text = Deflator.GetDefaultDeflator()().Encrypt(source)()
End If
End Sub
Private Sub Decrypt_Btn_Click(sender As Object, e As EventArgs) Handles Decrypt_Btn.Click
Dim decrypted As String = Label1.Text
If Not String.IsNullOrEmpty(decrypted) Then
Label2.Text = Deflator.GetDefaultDeflator()().Decrypt(decrypted)()
End If
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim secretWord As String = "omar amin"
TextBox1.Text = secretWord
End Sub
End Class
بالنهاية أعتقد أن أهم مميزات الكلاس DeflateStream هو أنه من الممكن استخدامه وبسهولة في عمل نسخة احتياطية مشفرة للملفات ثم يتم إسترجاع النسخة الإحتياطية حين الحاجة لها وأعتقد أن المثال الموجود في مايكروسوفت يؤكد هذا
المصادر
DeflateStream Class
الكود كاملا بالمرفقات وهو مكتوب بنسخة الفيجوال استوديو 2015