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
Post a Comment