|
You last visited: Today at 17:10
Advertisement
[VB] Rijandel Problem
Discussion on [VB] Rijandel Problem within the .NET Languages forum part of the Coders Den category.
08/09/2011, 19:34
|
#1
|
elite*gold: 0
Join Date: Aug 2010
Posts: 334
Received Thanks: 79
|
[VB] Rijandel Problem
Hi,
ich bin grad dabei bei meinem Programm, das mit Rijandel Dateien verschlüsseln soll, eine Progress Bar hinzuzufügen. Dabei hab ich jetzt aber n Problem beim Entschlüsseln: Bei Dateien die größer sind als die Buffergröße funktioniert das nicht. Da bekomme ich ne Exception mit der Nachricht das die Länge de zu entschlüsselnden Daten nicht passt. Dann ist mir aufgefallen das beim letzten Lesen aus dem Crypto Stream die Länge um eins länger ist als der filestream, eventuell hab ich mich aber auch irgentwo verrechnet. Wenn ich dann die Länge um eins verkürze, bekomme ich beim Schliessen des Crypto Stream ne Exception, in der steht das keine Leerzeichen erlaubt sind ._. .
Mit ner Textdatei geht es problemlos. Bei Bildern die größer als der Buffer sind werden nur die ersten par Zeilen entschlüsselt^^.
Hier der Code:
Code:
Shared Sub DecryptFile(ByVal path As String, ByVal argKey As String, ByRef PBar As ProgressBar)
PBar.Value = 0
If Not File.Exists(path) Then
MessageBox.Show("Invalid path: " & path & ".", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
Try
Dim Buffercount As ULong
Dim BufferSize As ULong = 4096
Dim FileLen As Long 'Nicht ULong da sonst OVerflows auftreten bei FileLen - Buffersize, wenn die Datei kleiner als die Buffergröße ist.
Dim Buffer As ULong
Dim Data(BufferSize) As Byte
Dim aes As New RijndaelManaged
'Key und IV generieren
Dim SHA As New SHA512Cng
Dim Key As Byte() = SHA.ComputeHash(Encoding.UTF8.GetBytes(argKey)) : SHA.Clear()
Dim aesKey(31) As Byte 'Die ersten 256 Bits vom Hash werden der Key, die nächsten 128 der IV
For i As Integer = 0 To 31
aesKey(i) = Key(i)
Next
aes.Key = aesKey
Dim aesIV(15) As Byte
For i As Integer = 32 To 47
aesIV(i - 32) = Key(i)
Next
aes.IV = aesIV
Dim fs As New FileStream(path, FileMode.Open, FileAccess.ReadWrite)
FileLen = fs.Length
If Not FileLen > 0 Then
MessageBox.Show("File is empty!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
Dim cs As New CryptoStream(fs, aes.CreateDecryptor, CryptoStreamMode.Read)
Do
If Buffercount >= FileLen - BufferSize Then 'Wenn nur noch ein Vorgang benötigt wird.
ReDim Data(FileLen - Buffercount)
cs.Read(Data, 0, Data.Length)
fs.Seek(Buffercount, SeekOrigin.Begin)
fs.Write(Data, 0, Data.Length)
Exit Do
End If
Buffer = cs.Read(Data, 0, Data.Length)
fs.Seek(Buffercount, SeekOrigin.Begin)
fs.Write(Data, 0, Data.Length)
Buffercount += Buffer
PBar.Value = CInt((Buffercount / FileLen) * 100)
Loop
cs.Close()
aes.Clear()
PBar.Value = 100
Catch ex As Exception
MessageBox.Show("Failed to decrypt file " & System.IO.Path.GetFileName(path) & ". (Invalid Key?)", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
MessageBox.Show("Sucessfully decrypted file " & System.IO.Path.GetFileName(path) & ".", "Sucess")
End Sub
Verschlüsseln:
Code:
Shared Sub EncryptFile(ByVal path As String, ByVal argKey As String, ByVal PBar As ProgressBar)
PBar.Value = 0
If Not File.Exists(path) Then
MessageBox.Show("Invalid path: " & path & ".", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
Try
Dim Buffersize As Long = 4096
Dim Buffer As Long
Dim Buffercount As Long
Dim FileLen As Long
Dim Data(Buffersize) As Byte
Dim aes As New RijndaelManaged
Dim SHA As New SHA512Cng
'Key und IV erzeugen
Dim Key As Byte() = SHA.ComputeHash(Encoding.UTF8.GetBytes(argKey))
SHA.Clear()
Dim aesKey(31) As Byte 'Die ersten 256 Bits vom Hash werden der Key, die nächsten 128 der IV
For i As Integer = 0 To 31
aesKey(i) = Key(i)
Next
aes.Key = aesKey
Dim aesIV(15) As Byte
For i As Integer = 32 To 47
aesIV(i - 32) = Key(i)
Next
aes.IV = aesIV
Dim fs As New FileStream(path, FileMode.Open, FileAccess.ReadWrite)
FileLen = fs.Length
Dim cs As New CryptoStream(fs, aes.CreateEncryptor, CryptoStreamMode.Write)
Do
If Buffercount >= FileLen - Buffersize Then
ReDim Data(FileLen - Buffercount)
Buffer = fs.Read(Data, 0, FileLen - Buffercount)
fs.Seek(Buffercount, SeekOrigin.Begin)
cs.Write(Data, 0, Buffer)
PBar.Value = 100
Exit Do
End If
Buffer = fs.Read(Data, 0, Buffersize)
fs.Seek(Buffercount, SeekOrigin.Begin)
cs.Write(Data, 0, Buffersize)
Buffercount += Buffer
PBar.Value = CInt((Buffercount / FileLen) * 100) 'Prozent Anzeige
Loop
cs.FlushFinalBlock()
cs.Close()
aes.Clear()
Catch ex As Exception
MessageBox.Show("Encrypting file" & System.IO.Path.GetFileName(path) & " failed.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
MessageBox.Show("Encryption sucessfull!", "Sucess")
End Sub
Ich hoffe jemand kann mir da helfen. Danke.
|
|
|
Similar Threads
|
[Hilfe]Ungelöstes Server Erstell Problem, ausführliche Problem Schilderung
09/15/2011 - Flyff Private Server - 8 Replies
Hey Com!
Ich hoffe, dass dieser Thread nicht als Spamthread angesehen wird, da ich ja gestern schon einen zu diesem Thema eröffnet habe.
Sorry wenn ich euch mit dem Thema nerve, aber ich sitze nun schon 4 Tage über dem Problem, und finde einfach keine Lösung.
Nun werde ich hier allerdings eine ausführlichere Beschreibung des Problems geben.
Mein Problem ist, dass ich den Windows Mssql Server 2008/2005 aus Sedrika's TuT nicht installieren kann, da sobald ich ihn immer installiere...
|
[Problem]Habe ein Problem und zwar spinnt mein VPC etwas(ohne Grund)?!
07/28/2011 - Metin2 Private Server - 10 Replies
Also wie schon gesagt meins Server spinnt wodurch kiks usw. kommen :(
ich lade euch die Screens in den Anhang, mit der Hoffnung, dass ihr mir helfen könnt :) wäre echt sehr nice :)
|
All times are GMT +1. The time now is 17:10.
|
|