Moin,
ich schreibe seit einiger Zeit an einem kleinem Crypter, er operiert auf der Basis des AES Alghorhytmus und funktioniert so, wie er soll, wenn es um einzelne Dateien geht. Ich würde aber gerne auch eine Funktion haben, dass er mehrere Dateien nimmt, sie codiert und dann als eine ausgibt. Das ist auch gar nicht weiter problematisch, verpacken tut er ohne Fehler, nur wenn er es wieder entschlüsseln soll, kommt es immer zu Fehlern, weil ich die Byte-Arrays der einzelnen Dateien nicht von einander getrennt kriege.
Es kommt immer zu eine CryptoExeption, da das Byte Array nicht die richtige länge hat.
Hier ist der Code:
'Der Encryper
Sub EncryptToSingleFile(ByVal Path() As String, ByVal Desination As String)
Dim rd As New RijndaelManaged
Dim md5 As New MD5CryptoServiceProvider
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes( _
TextBox2.Text))
md5.Clear()
rd.Key = key
Dim header As String = Path.Length & vbCrLf
For i As Integer = 0 To Path.Length - 1
rd.GenerateIV()
Dim iv() As Byte = rd.IV
Dim ms As New MemoryStream
ms.Write(iv, 0, iv.Length)
Dim cs As New CryptoStream(ms, rd.CreateEncryptor, _
CryptoStreamMode.Write)
Dim data() As Byte = FileIO.FileSystem.ReadAllBytes(Path(i))
cs.Write(data, 0, data.Length)
cs.FlushFinalBlock()
Dim encdata() As Byte = ms.ToArray
If Not FileIO.FileSystem.DirectoryExists("C:\Temp\TPC\") Then
MkDir("C:\Temp\TPC\")
End If
Dim StrEncdata As String = Encoding.UTF8.GetString(encdata)
FileIO.FileSystem.WriteAllText("C:\Temp\TPC\" & i & ".aes", _
StrEncdata, False)
Dim Filename As String = Path(i).Remove(0, Path(i).LastIndexOf("\"))
header += Filename & "?" & StrEncdata.Length & vbCrLf
Next
header = header.Length + header.Length.ToString.Length + 5 & vbCrLf & _
header
FileIO.FileSystem.WriteAllText(desination & ".header", header, False)
For i As Integer = 0 To Path.Length - 1
Dim Current As String = FileIO.FileSystem.ReadAllText( _
"C:\Temp\TPC\" & i & ".aes")
Dim test As Integer = Current.Length
FileIO.FileSystem.WriteAllText(desination, Current, True)
Next
End Sub Zur Erklärung:
Der „Header“ ist ein Überbleibsel aus einem früheren Versuch die Eckdaten, der Datei in den Anfang der Codierten Datei zu setzen.
Die HeaderLength hätte ich eigentlich schon rauslöschen können, da ich den Header jetzt als eigenständige Datei speichere und sie somit hinfällig ist, hatte aber bisher keine Lust und mich stört sie in der entwiklungsphase auch nicht weiter.
' Der Decrypter
Sub DecryptFromFile(ByVal File As String, ByVal TargetDirectory As String)
Dim rd As New RijndaelManaged
Dim RijndaelIVLength As Integer = 16
Dim md5 As New MD5CryptoServiceProvider
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes( _
TextBox2.Text))
md5.Clear()
' Auslesen der Headerinformationen
Dim header As String = FileIO.FileSystem.ReadAllText(File & ".header")
Dim headerLength As Integer = Split(header, vbCrLf)(0)
Dim FileCount As Integer = Split(header, vbCrLf)(1)
Dim position As Integer
For j As Integer = 0 To FileCount - 1
Dim dataLength As Integer = Split(header, vbCrLf)(j + 2).Split("?")( _
1)
Dim dataName As String = Split(header, vbCrLf)(j + 2).Split("?")(0)
Dim iv(15) As Byte
Dim encdata() As Byte = FileIO.FileSystem.ReadAllBytes(File)
' Hier habe ich schon X codes drin gehabt um eine einzelne Datei an
' den Memorystream zu reichen
' was bisher nur bei einzel Datein funktioniert hat.
Dim ms As New MemoryStream(encdata)
ms.Read(iv, 0, RijndaelIVLength)
rd.IV = iv
rd.Key = key
Dim cs As New CryptoStream(ms, rd.CreateDecryptor, _
CryptoStreamMode.Read)
Try
Dim data(ms.Length - RijndaelIVLength) As Byte
Dim i As Integer = cs.Read(data, 0, data.Length)
FileIO.FileSystem.WriteAllBytes(dataName, data, False)
cs.Close()
rd.Clear()
Catch ex As Exception
MsgBox(ex.Message)
End Try
Next
End Sub Ich würde mich sehr über hilfe bei diesem Problem freuen.
StarTrekkker |