Encrypt & Decrypt String with DeflateStream




من فترة ليست بالقصيرة كنت قد قرأت في MSDN عن الكلاس DeflateStream
وطبقا للمثال الموجود في موقع مايكروسوفت فإن هذا الكلاس يقوم بضغط ملف أو يقوم بفك الضغط عن ملف أي أنه يقوم بعمل Compress أو Decompress لأي ملف
وعندما استخدمت المثال الموجود في مايكروسوفت لضفط ملف وحيد وهذا الملف كان عبارة عن صورة عادية ثم حاولت أن أفتح الملف مرةأخري بعد ضغطه بأحد برامج الصور العادية هنا اكتشفت أن الملف لا يعمل ولا يمكن أن تستطيع فتح الملف مرة أخري إلا بعد أن تقوم بإلغاء عملية الضغط التي حدثت لهذا الملف
الحقيقة هذا الأمر لفت إنتباهي جدا وعندما بدأت أدرس الأمر اكتشفت أن الكلاس لا يقوم فقط بضغط الملف بل هو فعليا يقوم أيضا بتشفيير الملف
وبما أننا نتعامل مع كلاس تم توريثه من  Stream
وبما أن الكلاس يستطيع ضغط و تشفيير ملف فهل من الممكن أن يقوم الكلاس بضغط و تشفير String مثلا؟
والإجابة عن هذا التساؤل تكمن في الكلاس الموجود أدناه و الذي من الممكن استخدامه في تشفيير و فك التشفيير لأي  String

Imports System.IO
Imports System.IO.Compression
Imports System.Text

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

الكود التالي يوضح كيفية استخدام الكلاس
    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

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

المصادر


DownLoad

Comments

Popular posts from this blog

مقدمة الي تشفير الحروف الأبجدية العربية

VB.NET Translucent Control using GDI+

Add Custom Event to a Class in VB.NET