Moinsen,
ich habe ein Problem mit der Ver-/Entschlüsselung von Dateien:
Die Dateien werden mit einem CryptoStream verschlüsselt und auf Festplatte geschrieben. Schon hier fällt auf, dass die Größe der Datei zugenommen hat. Die "Zunahme" kann variieren. Mir scheint dass das mit dem PaddingMode zusammenhängt. Wenn ich diese aber auf None setze klappt die Verschlüsselung nicht mehr.
Mein Problem tritt nun z.B. mit wieder entschlüsselten .docx Dateien auf, denn beim entschlüsseln wird die Datei nicht wieder kleiner. Und jetzt bekommt Word Probleme mit dem Dokument, weil es nicht mehr die richtige Größe hat.
Kann man irgendwie die originale Dateigröße ermitteln? Oder muss ich mir die merken?
Mein Code:
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Try
Dim filename As String = "test.docx"
Dim fs As New FileStream(filename, FileMode.Open)
Dim br As New BinaryReader(fs)
Dim b(CInt(br.BaseStream.Length)) As Byte
br.Read(b, 0, b.Length)
br.Close()
WriteFile(b, "crypted.docx_x")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button2.Click
Try
Dim filename = "decrypted.docx"
Dim fs As New FileStream(filename, FileMode.Create)
Dim s = ReadFile("crypted.docx_x")
Dim b(CInt(s.Length - 1)) As Byte
s.Position = 0
s.Read(b, 0, b.Length)
fs.Write(b, 0, b.Length)
fs.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private spwd As String = "123456789011"
Public Function WriteFile(ByVal b As Byte(), ByVal filename As String) As _
Boolean
Dim fs As FileStream = New FileStream(filename, FileMode.Create, _
FileAccess.Write)
Try
Dim rd As New RijndaelManaged
Dim md5 As New MD5CryptoServiceProvider
Dim bkey() As Byte = Encoding.Default.GetBytes(spwd)
Dim key() As Byte = md5.ComputeHash(bkey)
md5.Clear()
rd.Key = key
rd.IV = key
rd.Padding = PaddingMode.ANSIX923
Dim cryptostream As New CryptoStream(fs, rd.CreateEncryptor, _
CryptoStreamMode.Write)
cryptostream.Write(b, 0, b.Length - 1)
cryptostream.FlushFinalBlock()
fs.Close()
Return True
Catch ex As Exception
MsgBox(ex.Message)
End Try
Return False
End Function
Public Function ReadFile(ByVal filename As String) As Stream
If Not IO.File.Exists(filename) Then
Throw New IOException("File not found! (" + filename + ")")
End If
Dim ms As New MemoryStream
Dim fs As New FileStream(filename, FileMode.Open, FileAccess.Read)
Try
Dim rd As New RijndaelManaged
Dim md5 As New MD5CryptoServiceProvider
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(spwd))
md5.Clear()
rd.Key = key
rd.IV = key
rd.Padding = PaddingMode.None
Dim cryptostream As New CryptoStream(fs, rd.CreateDecryptor, _
CryptoStreamMode.Read)
Dim b(CInt(fs.Length - 1)) As Byte
cryptostream.Read(b, 0, b.Length)
ms.Write(b, 0, b.Length)
fs.Close()
Return ms
Catch ex As Exception
MsgBox(ex.Message)
End Try
Return Nothing
End Function
End Class Wäre super, wenn jmd eine Idee hat...
Gru?
(Bash) |