I am having some trouble with deserializing an encrypted object.
Here is the Serialization Class:
I can successfully call the DeserializeObjectFromFile function, but the DeserializeEncryptedObjectFromFile function is returning the following error:
End of stream encountered before passing was completed
Here is my code that works for Serializing and Deserializing an Object:
This is the code for Serializing and Deserializing an Object with Cryptography that performs the exception:
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
Quote:
End of stream encountered before passing was completed
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
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