Vb.net DES序列化异常

Vb.net DES序列化异常,vb.net,serialization,encryption,des,Vb.net,Serialization,Encryption,Des,我在使用DES加密反序列化对象时遇到了一些问题 我在反序列化desObjectFromFile函数中遇到一个异常,该异常显示“坏数据” 我能帮点忙吗 这是我的密码: Public Sub SerializeDESObjectToFile(FileName As String, Item As Object) Dim fs As FileStream Dim formatter As New BinaryFormatter Dim DESKey() As Byte

我在使用DES加密反序列化对象时遇到了一些问题

我在
反序列化desObjectFromFile
函数中遇到一个异常,该异常显示“坏数据”

我能帮点忙吗

这是我的密码:

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

    Dim DESKey() As Byte = {200, 5, 78, 232, 9, 6, 0, 4}
    Dim DESInitializationVector() As Byte = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    Dim MyStreamEncrypter As CryptoStream = Nothing

    fs = New FileStream(FileName, FileMode.Create)
    Dim DESAlgorithm As DES
    DESAlgorithm = New DESCryptoServiceProvider
    MyStreamEncrypter = New CryptoStream(fs, DESAlgorithm.CreateEncryptor(DESKey, DESInitializationVector), CryptoStreamMode.Write)

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

Public Function DeserializeDESObjectFromFile(FileName As String) As Object
    Dim fs As New FileStream(FileName, FileMode.Open)
    Dim ItemToReturn As New Object

    Dim DESKey() As Byte = {200, 5, 78, 232, 9, 6, 0, 4}
    Dim DESInitializationVector() As Byte = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    Dim MyStreamDecrypter As CryptoStream = Nothing

    Dim DESAlgorithm As DES
    DESAlgorithm = New DESCryptoServiceProvider

    MyStreamDecrypter = New CryptoStream(fs, DESAlgorithm.CreateDecryptor(DESKey, DESInitializationVector), CryptoStreamMode.Read)

    Try
        Dim formatter As New BinaryFormatter
        ItemToReturn = DirectCast(formatter.Deserialize(MyStreamDecrypter), Object)
        Return ItemToReturn
    Catch e As Exception
        MsgBox(e.Message)
        Return Nothing
    Finally
        fs.Close()
    End Try
End Function

确保流中的最后一个块被刷新是很重要的。分组密码模式(如ECB模式和CBC模式)需要填充,因为分组密码只能加密纯文本的完整块。由于流不知道序列化数据对象是它必须加密的最后一个数据,因此它无法填充和加密最后一个块本身


应在将最后一个纯文本数据写入
加密流
后调用。或者,您可以在上层
加密流
上调用
close()
,而不是在底层流上调用
close()
,或者在调用底层流上的
close()。使用常用的标签,例如,使用而不仅仅是为了获得更多的关注。如果C.NET专家能够检查最后一行,那将不胜感激。我有理由相信读过API,但这只是我所知的范围。