| 

.NET C# Java Javascript Exception

1
Also wie bereits aus dem Titel entnehmbar ist habe ich ein Problem mit der Verschlüsselung einer Datei mit AES-256.

Ich schreibe ein kleines Programm (wer möchte auch App) für Windows, mit der man einfach Dateien verschlüsseln können soll und zwar ohne Größenbeschränkung.

Verschlüsselung:
public static void EncryptFile(string filePath)
{
AesManaged aes = new AesManaged();
aes.KeySize = 256;
aes.Key = Key;
aes.IV = IV;

//Reads a file into a filestream
FileStream fsRead = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);


//Creates a CryptoStream and encrypts the filestream
CryptoStream crypto = new CryptoStream(fsRead, aes.CreateEncryptor(), CryptoStreamMode.Read);


int pos=0;
int readBytes = 0;

//defines a byte array with a length of 1024 to temporary store bytes
byte[] buffer = new byte[1024];
//array list to store the bytes
ArrayList bufferRead = new ArrayList();

do
{
readBytes = crypto.Read(buffer, 0, buffer.Length);

byte[] tmp = new byte[readBytes];
//Copies completely the bytes of the buffer into the tmp byte array
Array.Copy(buffer, tmp, readBytes);

fsRead.Seek(pos, SeekOrigin.Begin);
fsRead.Write(tmp, 0, readBytes);

pos+=readBytes;

} while (readBytes != 0);


//crypto.Close();

fsRead.Flush();
fsRead.Close();
}

Entschlüsselung:
public static void DecryptFile2(string filePath)
{
AesManaged aes = new AesManaged();
aes.KeySize = 256;
aes.Key = Key;
aes.IV = IV;

//Reads a file into a filestream
FileStream fsRead = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);


//Creates a CryptoStream and encrypts the filestream
CryptoStream crypto = new CryptoStream(fsRead, aes.CreateDecryptor(), CryptoStreamMode.Read);


int pos = 0;
int readBytes = 0;

//defines a byte array with a length of 1024 to temporary store bytes
byte[] buffer = new byte[1024];

do
{
readBytes = crypto.Read(buffer, 0, buffer.Length);

if (readBytes != 0)
{
byte[] tmp = new byte[readBytes];
//Copies completely the bytes of the buffer into the tmp byte array
Array.Copy(buffer, tmp, readBytes);

fsRead.Seek(pos, SeekOrigin.Begin);
fsRead.Write(tmp, 0, readBytes);

pos += readBytes;
}
else { }
} while (readBytes != 0);

//crypto.Close();

fsRead.Flush();
fsRead.Close();
}

Jedoch funktioniert dies nicht. Wenn ich eine Textdatei mit Inhalt "Hallo Welt" ver- und entschlüssle, so steht hinterher "Hallo Welt" und ein paar komische Zeichen (Sprache unbekannt). Auch Bilddateien kann man nach diesem Vorgang nicht mehr öffnen. Hat jemand eine Ahnung was ich falsch mache oder wo der Denkfehler liegt?

Vielen Dank für eure Hilfe.
News:
28.02.2012
Simon Rühle 147 1 7
1
Hallo. Ich habe deinen Code mal ausprobiert. Mit einer kleinen Textdatei hatte ich keine Probleme. Ver- und entschlüsseln funktionierte. Bei einer Bilddatei hatte ich allerdings auch Probleme. Aufgefallen ist mir, dass die ersten 1024 Byte nach der Entschlüsselung der Originaldatei entsprechen. Vielleicht probierst du mal nicht gleichzeitig aus einer Datei die Daten zu lesen und die ver- bzw. entschlüsselten Daten in die Datei zu schreiben.
multi1209 29.02.2012
Die Idee hatte ich auch schon, wie bekomme ich allerdings dann die Daten wieder in die Datei, aus der sie stammen?
Simon Rühle 29.02.2012
1
Ich würde z.B. die Verschlüsselung in eine temporäre Datei schreiben und nach Beendigung der Verschlüsselung die Originaldatei mit der temporären Datei überschreiben. Bei der Entschlüsselung müsstes du genauso vorgehen.

multi1209 29.02.2012
1 Antwort
1
Konnte die AES Implementation in .NET 3.5 überhaupt 256bit Schlüssellängen? Ich dachte da muss man RijandelManaged verwenden:

rm = new RijndaelManaged();
rm.KeySize = 256;
rm.BlockSize = 128;
rm.Key = rfc2898.GetBytes(rm.KeySize / 8);
rm.IV = rfc2898.GetBytes(rm.BlockSize / 8);
06.03.2012
Lord_Pinhead 778 1 8

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH