Vishwamohan

Welcome to Vishwa's blog - Technology, Spirituality and More...

Secure Query String using Symmetric Cryptography

It is important to secure information on the web specially when transferring data from one page to another. Some information you may not want to make it readable by end user. Microsoft .NET provides Cryptography namespace which can be easily utilized for this purpose. The following example contains a simple class containing Encryption and Decryption method. It supports 2 types – DESC and Rijndael. Symmetric type and encryption key can be configured easily through .config file.


Imports System
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography
Imports System.Configuration
 
''' <summary>
''' Custom Encryption Class
''' Author: Vishwa
''' Date :05/28/08
''' Purpose: To Encrypt and Decrypt the Data
''' Design Pattern : Singleton
''' </summary>
''' <remarks>
''' This class implements a Base 64 encryption and decryption Using Symetric
''' IMPT: Config File will contain 2 keys and its value - SymmetricType and SymmetricKey
''' </remarks>
 
Public NotInheritable Class RegCryptographer
    Private Shared _instance As New RegCryptographer
 
#Region "Constructor"
    Private Sub New()
 
    End Sub
#End Region
 
#Region "Public Methods"
 
    Public Shared Function DecryptQueryString(ByVal stringToDecrypt As String) As String
        Return DecryptSymmetric(stringToDecrypt.Replace(" ", "+"))
    End Function
 
    Public Shared Function EncryptQueryString(ByVal stringToEncrypt As String) As String
        Return EncryptSymmetric(stringToEncrypt)
    End Function
 
#End Region
 
#Region "Custom Cryptography"
    Private Shared _key() As Byte = {}
    Private Shared _IV() As Byte = {}
    Private Shared _symmetricKey As String = String.Empty
 
#Region "Rijndael Encryption/Decryption"
    Public Shared Function DecryptSymmetric(ByVal stringToDecrypt As String) As String
        If SymmetricType = "Rijndael" Then
            Return DecryptSymmetricRijndael(stringToDecrypt)
        Else
            Return DecryptSymmetricDESC(stringToDecrypt)
        End If
    End Function
 
    Public Shared Function EncryptSymmetric(ByVal stringToEncrypt As String) As String
        If SymmetricType = "Rijndael" Then
            Return EncryptSymmetricRijndael(stringToEncrypt)
        Else
            Return EncryptSymmetricDESC(stringToEncrypt)
        End If
    End Function
 
    Private Shared Function DecryptSymmetricRijndael(ByVal stringToDecrypt As String) As String
        Try
            Dim inputByteArray(stringToDecrypt.Length) As Byte
            Dim rijndael As New RijndaelManaged()
            rijndael.GenerateIV()
            'rijndael.GenerateKey()
            '_key = rijndael.Key
            _IV = rijndael.IV
 
            rijndael.KeySize = 128
            rijndael.BlockSize = 128
            rijndael.Mode = CipherMode.ECB
            rijndael.Padding = PaddingMode.PKCS7
            _key = System.Text.Encoding.UTF32.GetBytes(SymmetricKey)
            inputByteArray = Convert.FromBase64String(stringToDecrypt)
 
            Dim decryptor As ICryptoTransform = rijndael.CreateDecryptor(_key, _IV)
            Dim msDecrypt As New MemoryStream()
            Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Write)
            csDecrypt.Write(inputByteArray, 0, inputByteArray.Length)
            csDecrypt.FlushFinalBlock()
            Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
            Return encoding.GetString(msDecrypt.ToArray())
        Catch e As Exception
            Return e.Message
        End Try
    End Function
 
    Private Shared Function EncryptSymmetricRijndael(ByVal stringToEncrypt As String) As String
        Try
            Dim rijndael As New RijndaelManaged()
            rijndael.GenerateIV()
            'rijndael.GenerateKey()
            '_key = rijndael.Key
            _IV = rijndael.IV
            _key = System.Text.Encoding.UTF32.GetBytes(SymmetricKey)
 
            rijndael.KeySize = 128
            rijndael.BlockSize = 128
            rijndael.Mode = CipherMode.ECB
            rijndael.Padding = PaddingMode.PKCS7
            Dim encryptor As ICryptoTransform = rijndael.CreateEncryptor(_key, _IV)
            Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(stringToEncrypt)
            Dim msEncrypt As New MemoryStream()
            Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
            csEncrypt.Write(inputByteArray, 0, inputByteArray.Length)
            csEncrypt.FlushFinalBlock()
            Return Convert.ToBase64String(msEncrypt.ToArray())
        Catch e As Exception
            Return e.Message
        End Try
    End Function
 
#End Region
 
#Region "DESC Encryption/DeCryption"
    Private Shared _symmetricType As String = String.Empty
    Private Shared Function DecryptSymmetricDESC(ByVal stringToDecrypt As String) As String
        Dim inputByteArray(stringToDecrypt.Length) As Byte
        Try
            inputByteArray = Convert.FromBase64String(stringToDecrypt)
            Dim des As New DESCryptoServiceProvider()
            des.GenerateIV()
            _IV = des.IV
            _key = System.Text.Encoding.UTF8.GetBytes(SymmetricKey)
 
            Dim ms As New MemoryStream()
            Dim cs As New CryptoStream(ms, des.CreateDecryptor(_key, _IV), CryptoStreamMode.Write)
            cs.Write(inputByteArray, 0, inputByteArray.Length)
            cs.FlushFinalBlock()
            Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
            Return encoding.GetString(ms.ToArray())
        Catch e As Exception
            Return e.Message
        End Try
    End Function
 
    Private Shared Function EncryptSymmetricDESC(ByVal stringToEncrypt As String) As String
        Try
            Dim des As New DESCryptoServiceProvider()
            des.GenerateIV()
            _IV = des.IV
            _key = System.Text.Encoding.UTF8.GetBytes(SymmetricKey)
 
            Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(stringToEncrypt)
            Dim ms As New MemoryStream()
            Dim cs As New CryptoStream(ms, des.CreateEncryptor(_key, _IV), CryptoStreamMode.Write)
            cs.Write(inputByteArray, 0, inputByteArray.Length)
            cs.FlushFinalBlock()
            Return Convert.ToBase64String(ms.ToArray())
        Catch e As Exception
            Return e.Message
        End Try
    End Function
 
 
#End Region
 
#Region "Properties"
   
    Private Shared ReadOnly Property SymmetricType() As String
        Get
            If String.IsNullOrEmpty(_symmetricType) Then
                Try
                   _symmetricType = ConfigurationManager.AppSettings.Item("SymmetricType")
                Catch ex As Exception
                    _symmetricType = "Rijndael"
                End Try
                If String.IsNullOrEmpty(_symmetricType) Then _symmetricType = "Rijndael"
            End If
            Return _symmetricType
        End Get
    End Property
 
 
    Private Shared ReadOnly Property SymmetricKey() As String
        Get
            If String.IsNullOrEmpty(_symmetricKey) Then
                Try
                    _symmetricKey = ConfigurationManager.AppSettings.Item("SymmetricKey")
                Catch ex As Exception
                    _symmetricKey = "DIffTkey"
                End Try
                If String.IsNullOrEmpty(_symmetricKey) Then _symmetricKey = "DIffTkey"
            End If
            Return Left(_symmetricKey, 8)
        End Get
    End Property
 
#End Region
 
#End Region
 
End Class
Loading