0

私は、DES 暗号化を使用してオブジェクトをデシリアライズする際に問題を抱えています。

「Bad Data」という例外が発生します。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 モードなどのブロック暗号モードはパディングする必要があります。ストリームは、シリアル化されたデータ オブジェクトが暗号化する必要がある最後のデータであることを認識していないため、最後のブロック自体をパディングして暗号化することはできません。

FlushFinalBlockは、最後のプレーン テキスト データを に書き込んだ後に呼び出す必要がありますCryptoStreamclose()または、基になるストリームの代わりに上位を呼び出すか、基になるストリームを呼び出す前にCryptoStream適切に破棄されることを確認してください。close()

于 2013-07-12T18:11:49.313 に答える