Készítünk tehát két függvényt, melyek unicode típusú sztringek titkosítására, visszafejtésére alkalmas. Az egyik Encrypt néven, a másik Decrypt néven kerül létrehozásra. Az Encrypt titkosítja a paraméterként átadott sztringet, míg a Decrypt visszafejti azt. A titkosításhoz a TripleDES nevű algoritmust használjuk fel, melyhez a TripleDESCryptoServiceProvider osztályra lesz szükségünk.
Private Shared csp As TripleDESCryptoServiceProvider
Az osztályunk konstruktorában hozzuk létre ezt az osztályt, és adjuk meg a kódoláshoz, dekódoláshoz szükséges kulcsokat. A key, illetve az iv tömbben megadott értékek ránk vannak bízva, ezek tetszőlegesek lehetnek. A szöveg visszafejtéséhez ezekre az értékekre van szükség.
Shared Sub New()
csp = New TripleDESCryptoServiceProvider()
Dim key As Byte() = {2, 55, 86, 23, 2, 21, 111, 132, 222, 182, 72, 132, 12, 3, 231, 12}
Dim iv As Byte() = {12, 231, 34, 242, 52, 12, 8, 21}
csp.Key = key
csp.IV = iv
End Sub 'New
Nézzük, hogy miként történik a paraméterként kapott sztring titkosítása. Létrehozunk egy memória stream-et, valamint egy ICryptoTransform interfészt.
Public Shared Function Encrypt(ByVal s As String) As String
Dim ms As New MemoryStream()
Dim ct As ICryptoTransform = csp.CreateEncryptor()
Szükségünk lesz egy titkosító stream-re is, melyet a CryptoStream osztály valósít meg. Ennek első paraméterébe a már létrejött memória stream-et adjuk meg, másodikként az ICryptoTransform interfészt. Végső paraméterként azt határozzuk meg, hogy írható legyen ez az adatfolyam.
Dim cs As New CryptoStream(ms, ct, CryptoStreamMode.Write)
Kell még egy StreamWriter osztály, mellyel a titkosítandó sztringet tudjuk majd a memória stream-re írni.
Dim sw As New StreamWriter(cs, System.Text.Encoding.Unicode)
sw.Write(s)
sw.Flush()
cs.FlushFinalBlock()
Miután ezt megtörtént az adat már titkosítva van a stream-en, most már csak sztringgé kell alakítanunk. Ehhez létrehozunk egy bájtokat tartalmazó tömböt, majd a memória stream-ről kiolvassuk ide az adatokat.
ms.Position = 0
Dim buf(ms.Length) As Byte
ms.Read(buf, 0, CInt(ms.Length))
Zárunk minden megnyitott stream-et.
sw.Close()
cs.Close()
ms.Close()
Végül az eredmény buffert Base64 kódolású sztringként adjuk vissza, hogy az könnyen kezelhető, tárolható legyen.
Return Convert.ToBase64String(buf)
End Function 'Encrypt
Az Encrypt függvény által adott titkosított sztringet kell paraméterként megadnunk a Decrypt függvénynek. Ez végzi el a visszafejtést. Először is egy bájtokat tartalmazó tömböt hozunk létre a Base64 kódolású sztringből.
Public Shared Function Decrypt(ByVal s As String) As String
Dim buf As Byte() = Convert.FromBase64String(s)
Következik a memória stream és az ICryptoTransform interfész létrehozása mint az előbb.
Dim ms As New MemoryStream()
Dim ct As ICryptoTransform = csp.CreateDecryptor()
A titkosítást végző stream felhasználásával a bájt tömböt a stream-re írjuk és ezzel elvégezzük a visszafejtést.
Dim cs As New CryptoStream(ms, ct, CryptoStreamMode.Write)
cs.Write(buf, 0, buf.Length)
cs.FlushFinalBlock()
Az eredmény kiolvasásához egy StreamReader osztályt használunk fel, melynek ReadToEnd függvényét alkalmazva egy lépésben megkapjuk a visszafejtett sztringet.
ms.Position = 0
Dim sr As New StreamReader(ms, System.Text.Encoding.Unicode)
Dim result As String = sr.ReadToEnd()
Végül már csak zárni kell a stream-eket és visszaadni az eredmény sztringet.
cs.Close()
ms.Close()
Return result
End Function 'Decrypt
A két függvény felhasználása már lényegesen egyszerűbb, mint azok elkészítése. Titkosításhoz egyszerűen meghívjuk az Encrypt függvényt, átadva számára a tikosítandó szöveget.
Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
label1.Text = Util.Encrypt(textBox1.Text)
End Sub 'button1_Click
A titkosított sztringet visszafejthetjük a Decrypt függvény hívásával.
Private Sub button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button2.Click
label2.Text = Util.Decrypt(Util.Encrypt(textBox1.Text))
End Sub 'button2_Click