VB.NET  •  Use an Asymmetric Algorithm to Encrypt and Decrypt

Listing 2. The AsymmetricExample class uses the RSACryptoServiceProvider class to encrypt and decrypt information stored in an XML document called AsymmetricExample.xml, which resides in the C: drive's root directory. Notice how the class uses a byte array for encryption and decryption of the actual contents.

Imports System
Imports System.Security.Cryptography
Imports System.IO
Imports System.Xml

Public Class AsymmetricExample
   Private KeyFileName As String = _
      "c:\AsymmetricKey.xml"
   Private FileName As String = _
      "c:\AsymmetricExample.xml"
   Private CryptoProvider As _
      RSACryptoServiceProvider = New _
      RSACryptoServiceProvider(2048)

   Public Server As String = "(local)"
   Public Database As String = "Northwind"
   Public User As String = "sa"
   Public Password As String = ""
   Public Provider As String = "SQLOLEDB"

   Public Sub New()
      If Not File.Exists(KeyFileName) Then
         Dim FileWriter As FileStream = New _
            FileStream(KeyFileName, _
            FileMode.Create)
         Dim XmlWriter As XmlTextWriter = New _
            XmlTextWriter(FileWriter, _
            System.Text.Encoding.UTF8)

         XmlWriter.WriteRaw _
            (CryptoProvider.ToXmlString(True))
         XmlWriter.Close()
         FileWriter.Close()
      Else
         Dim FileReader As FileStream = New _
            FileStream(KeyFileName, _
            FileMode.Open)
         Dim XmlReader As XmlTextReader = New _
            XmlTextReader(FileReader)
         Dim XmlDoc As XmlDocument = New _
            XmlDocument()

         XmlDoc.Load(XmlReader)
         CryptoProvider.FromXmlString _
            (XmlDoc.InnerXml)
      End If
   End Sub

   Public Sub Encrypt()
      Dim MemWriter As StringWriter = New _
         StringWriter()
      Dim XmlWriter As XmlTextWriter = New _
         XmlTextWriter(MemWriter)

      XmlWriter.WriteStartDocument()
      XmlWriter.WriteStartElement _
         ("Configuration")
      XmlWriter.WriteStartElement("Data")
      XmlWriter.WriteElementString("Server", _
         Server)
      XmlWriter.WriteElementString("Database", _
         Database)
      XmlWriter.WriteElementString("User", User)
      XmlWriter.WriteElementString("Password", _
         Password)
      XmlWriter.WriteElementString("Provider", _
         Provider)
      XmlWriter.WriteEndElement()
      XmlWriter.WriteEndElement()
      XmlWriter.WriteEndDocument()

      Dim CryptoWriter As FileStream = New _
         FileStream(FileName, FileMode.Create)
      Dim Contents As String = _
         MemWriter.ToString()
      Dim Xml(Contents.Length - 1) As Byte

      Dim n As Integer = 0

      For n = 0 To Contents.Length - 1
         Xml(n) = _
            Convert.ToByte(Contents.Chars(n))
      Next

      Dim Text(Xml.Length - 1) As Byte

      Text = CryptoProvider.Encrypt(Xml, False)

      CryptoWriter.Write(Text, 0, Text.Length)
      CryptoWriter.Close()
      XmlWriter.Close()
      MemWriter.Close()
   End Sub

   Public Sub Decrypt()
      If Not File.Exists(FileName) Then
         Me.Encrypt()
      End If

      Dim FileReader As FileStream = New _
         FileStream(FileName, FileMode.Open)
      Dim Contents(FileReader.Length - 1) As Byte

      FileReader.Read(Contents, 0, _
         Convert.ToInt32(FileReader.Length))

      Dim Xml(Contents.Length - 1) As Byte

      Xml = CryptoProvider.Decrypt(Contents, False)

      Dim Text(Xml.Length - 1) As Char

      Xml.CopyTo(Text, 0)

      Dim StringText As String = New String(Text)
      Dim memreader As StringReader = New _
         StringReader(StringText)
      Dim XmlReader As XmlTextReader = New _
         XmlTextReader(memreader)
      Dim XmlDoc As XmlDocument = New _
         XmlDocument()

      XmlDoc.Load(XmlReader)

      Dim XPath As String = _
         "/Configuration/Data/"

      Server = XmlDoc.SelectSingleNode(XPath & _
         "Server").InnerText
      Database = XmlDoc.SelectSingleNode(XPath _
         & "Database").InnerText
      User = XmlDoc.SelectSingleNode(XPath & _
         "User").InnerText
      Password = XmlDoc.SelectSingleNode(XPath _
         & "Password").InnerText
      Provider = XmlDoc.SelectSingleNode(XPath _
         & "Provider").InnerText

      FileReader.Close()
      memreader.Close()
      XmlReader.Close()
   End Sub
End Class