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

من فترة ليست بالقصيرة كنت قرأت في 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 ObjectAs EventArgsHandles Encrypt_Btn.Click
        Dim source 
As String TextBox1.Text
        If Not String
.IsNullOrEmpty(sourceThen
            Label1
.Text Deflator.GetDefaultDeflator()().Encrypt(source)()
 
       End If
 
   End Sub

    Private Sub Decrypt_Btn_Click
(sender As ObjectAs EventArgsHandles Decrypt_Btn.Click
        Dim decrypted 
As String Label1.Text
        If Not String
.IsNullOrEmpty(decryptedThen
            Label2
.Text Deflator.GetDefaultDeflator()().Decrypt(decrypted)()
 
       End If
 
   End Sub

    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        Dim secretWord 
As String "omar amin"
 
       TextBox1.Text secretWord
    End Sub

End 
Class 

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


المصادر
DeflateStream Class


الكود كاملا بالمرفقات وهو مكتوب بنسخة الفيجوال استوديو 2015


الملفات المرفقة
.rar   Test_Deflation.rar (الحجم : 66.99 ك ب / التحميلات : 66)
الرد }}}}
#2
جميل جداً
ابداع
الرد }}}}
تم الشكر بواسطة:


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


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