Quantcast
Channel: VBForums
Viewing all articles
Browse latest Browse all 42373

VS 2012 Serializing and Deserializing Encrypted Objects

$
0
0
I am having some trouble with deserializing an encrypted object.

Here is the Serialization Class:

Code:

Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Runtime.Serialization
Imports System.Security.Cryptography
Imports System.Text

Public Class ClassObjectSerialization
    Private _HashAlgorithm As String = "SHA1" 'SHA1 or MD5
    Private _Password As String = "CryptVariable123"
    Private _Salt As String = "CryptVariable123"
    Private _PasswordIterations As Integer = 2
    Private _InitialVector As String = "CryptVariable123" 'A string of 16 ASCII characters
    Private _KeySize As Integer = 256 '128, 192, or 256

    Public Sub New(CryptographyPassword As String)
        _Password = CryptographyPassword
    End Sub

    Public Sub SerializeObjectToFile(FileName As String, Item As Object)
        Dim fs As FileStream
        Dim formatter As New BinaryFormatter

        fs = New FileStream(FileName, FileMode.Create)

        Try
            formatter.Serialize(fs, Item)
        Catch e As Exception
            Console.WriteLine("Failed to serialize. Reason: " & e.Message)
        Finally
            fs.Close()
        End Try
    End Sub

    Public Function DeserializeObjectFromFile(FileName As String) As Object
        Dim fs As New FileStream(FileName, FileMode.Open)
        Dim ItemToReturn As New Object
        Try
            Dim formatter As New BinaryFormatter
            ItemToReturn = DirectCast(formatter.Deserialize(fs), Object)
            Return ItemToReturn
        Catch e As Exception
            Return Nothing
        Finally
            fs.Close()
        End Try
    End Function

    Public Sub SerializeEncryptedObjectToFile(FileName As String, Item As Object)
        Dim fs As FileStream
        Dim encryptor As CryptoStream

        Dim formatter As New BinaryFormatter

        Dim AES As AesManaged = New AesManaged
        AES.Padding = PaddingMode.None
        AES.Mode = CipherMode.CBC

        Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(_InitialVector)
        Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(_Salt)
        Dim DerivedPassword As New Rfc2898DeriveBytes(_Password, SaltValueBytes, _PasswordIterations)
        Dim KeyBytes As Byte() = DerivedPassword.GetBytes(CInt(_KeySize / 8))

        Dim encryptTransf As ICryptoTransform = AES.CreateEncryptor(KeyBytes, InitialVectorBytes)

        fs = New FileStream(FileName, FileMode.Create)
        encryptor = New CryptoStream(fs, encryptTransf, CryptoStreamMode.Write)

        Try
            formatter.Serialize(encryptor, Item)
        Catch e As Exception
            Console.WriteLine("Failed to serialize. Reason: " & e.Message)
        Finally
            fs.Close()
        End Try
    End Sub

    Public Function DeserializeEncryptedObjectFromFile(FileName As String) As Object
        Dim fs As New FileStream(FileName, FileMode.Open)
        Dim decryptor As CryptoStream

        Dim ItemToReturn As New Object

        Dim AES As AesManaged = New AesManaged
        AES.Padding = PaddingMode.None
        AES.Mode = CipherMode.CBC

        Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(_InitialVector)
        Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(_Salt)
        Dim DerivedPassword As New Rfc2898DeriveBytes(_Password, SaltValueBytes, _PasswordIterations)
        Dim KeyBytes As Byte() = DerivedPassword.GetBytes(CInt(_KeySize / 8))

        Dim decryptTrans As ICryptoTransform = AES.CreateDecryptor(KeyBytes, InitialVectorBytes)

        Try
            Dim formatter As New BinaryFormatter

            decryptor = New CryptoStream(fs, decryptTrans, CryptoStreamMode.Read)
            ItemToReturn = DirectCast(formatter.Deserialize(decryptor), Object)
            Return ItemToReturn
        Catch e As Exception
            Return Nothing
        Finally
            fs.Close()
        End Try
    End Function
End Class

I can successfully call the DeserializeObjectFromFile function, but the DeserializeEncryptedObjectFromFile function is returning the following error:
Quote:

End of stream encountered before passing was completed
Here is my code that works for Serializing and Deserializing an Object:

Code:

    Private Sub ButtonSaveObject_Click(sender As Object, e As EventArgs) Handles ButtonSaveObject.Click
        Dim TestObjectToSave As New TestClass
        TestObjectToSave.Name = "TestName"
        TestObjectToSave.Variable1 = "1234567890"
        SerializationClassLibrary.SerializeObjectToFile(SaveFolderPath & "TestClassObject.obj", TestObjectToSave)
    End Sub

    Private Sub ButtonOpenObject_Click(sender As Object, e As EventArgs) Handles ButtonOpenObject.Click
        Dim ObjectFromFile As Object
        Dim FileInfoObject As New FileInfo(SaveFolderPath & "TestClassObject.obj")
        If FileInfoObject.Exists Then
            ObjectFromFile = SerializationClassLibrary.DeserializeObjectFromFile(SaveFolderPath & "TestClassObject.obj")
            If ObjectFromFile IsNot Nothing Then
                If ObjectFromFile.GetType.Name = "TestClass" Then
                    Dim TestClassObjectFromFile As TestClass
                    TestClassObjectFromFile = CType(ObjectFromFile, TestClass)
                    MsgBox(TestClassObjectFromFile.Name)
                    MsgBox(TestClassObjectFromFile.Variable1)
                End If
            Else
                MsgBox("Not a serialized object")
            End If
        Else
            MsgBox("File does not exist")
        End If
    End Sub

This is the code for Serializing and Deserializing an Object with Cryptography that performs the exception:

Code:

    Private Sub ButtonSaveEncryptedObject_Click(sender As Object, e As EventArgs) Handles ButtonSaveEncryptedObject.Click
        Dim TestObjectToSave As New TestClass
        TestObjectToSave.Name = "TestName"
        TestObjectToSave.Variable1 = "1234567890"
        SerializationClassLibrary.SerializeEncryptedObjectToFile(SaveFolderPath & "TestClassObjectE.obj", TestObjectToSave)
    End Sub

    Private Sub ButtonOpenEncryptedObject_Click(sender As Object, e As EventArgs) Handles ButtonOpenEncryptedObject.Click
        Dim ObjectFromFile As Object
        Dim FileInfoObject As New FileInfo(SaveFolderPath & "TestClassObject.obj")
        If FileInfoObject.Exists Then
            ObjectFromFile = SerializationClassLibrary.DeserializeEncryptedObjectFromFile(SaveFolderPath & "TestClassObjectE.obj")
            If ObjectFromFile IsNot Nothing Then
                If ObjectFromFile.GetType.Name = "TestClass" Then
                    Dim TestClassObjectFromFile As TestClass
                    TestClassObjectFromFile = CType(ObjectFromFile, TestClass)
                    MsgBox(TestClassObjectFromFile.Name)
                    MsgBox(TestClassObjectFromFile.Variable1)
                End If
            Else
                MsgBox("Not a serialized object")
            End If
        Else
            MsgBox("File does not exist")
        End If
    End Sub


Viewing all articles
Browse latest Browse all 42373

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>