0

我在使用 DES 加密反序列化对象时遇到了一些麻烦。

我收到一个异常,上面写着“错误数据”。在DeserializeDESObjectFromFile函数中。

我可以帮忙吗?

这是我的代码:

    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
4

1 回答 1

0

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

在将最后一个纯文本数据写入CryptoStream. 或者,您可以调用close()上层而不是底层流,或者在调用底层流之前CryptoStream确保它已正确处理。close()

于 2013-07-12T18:11:49.313 回答