PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Verschlüsselung von Dateien


Evalley
2007-06-20, 14:03:42
erledigt

Der_Donnervogel
2007-06-20, 14:48:45
Eins vorweg, ich habe in Java noch nie etwas verschlüsselt und weiß deshalb jetzt nicht was Java dort anbietet.

Beim lesen/schreiben von/in Dateien muss man etwas aufpassen. Da ich hier etwas von "Datei zeilenweise einlesen" und "UTF-8" lese, gehe ich recht in der Annahme, dass hier Reader/Writer verwendet wurden? Falls dem so ist, ist das vermutlich der Grund für die Probleme. Diese sind für die Verarbeitung von Text gedacht, also zum einlesen von Text ideal. Wenn man aber mit Byte-Daten arbeitet sollte man besser die Input/Output-Streams nehmen. Also beispielsweise das verschlüsselte Array mit einem FileOutputStream und dessen Funktion .write() schreiben, bzw. diesen sinnvollerweise erst noch mit einem BufferedOutputStream verbinden. Diese Daten kann man dann mit einem FileInputStream (bzw. BufferedInputStream) wieder herauslesen. Eine Funktion um ein komplettes Array automatisch herauszulesen gibt es nicht, also einfach mit read() einlesen, bis der Stream leer ist. Müßte eigentlich klappen.

Evalley
2007-06-20, 15:46:41
erledigt

mithrandir
2007-06-20, 16:43:24
Also mir fällt vor allem auf, dass du die 1024 bytes nach dem Lesen nicht auf die gelesen Länge beschränkst (Rückgabewert von read).

Wenn's daran nicht liegt, ist's wahrscheinlich ein Encoding-Problem. Verwende überall explizit das gewünschte Encoding, z.B. anstatt getBytes() verwende getBytes( "UTF-8" ), dann wir nicht das voreingestellte vom Betriebssystem genommen.

public static void main( String[] args )
{
String txt = "Dies ist mal ein kleiner, erster Test! ÄÖÜäöü?ß@€\n";
try
{
File f = new File( "F:/test.log" );
// byte[] bytes = txt.getBytes();
byte[] bytes = txt.getBytes( "UTF-8" );
byte[] encrypt = encrypt( bytes );

BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream( f ) );
out.write( encrypt );
out.close();

byte[] daten = new byte[1024];
BufferedInputStream in = new BufferedInputStream( new FileInputStream( f ) );
int length = in.read( daten );
in.close();
byte[] _daten = new byte[length];
System.arraycopy( daten, 0, _daten, 0, length );

byte[] decrypt = decrypt( _daten );

System.out.println( new String( decrypt, "UTF-8" ) );
}
catch( Exception ex )
{
ex.printStackTrace();
}
}

protected static byte[] encrypt( byte[] bytes ) throws UnsupportedEncodingException
{
return new String( bytes, "UTF-8" ).getBytes( "UTF-8" );
}

protected static byte[] decrypt( byte[] bytes ) throws UnsupportedEncodingException
{
return new String( bytes, "UTF-8" ).getBytes( "UTF-8" );
}

Der_Donnervogel
2007-06-20, 16:57:26
Das denk ich auch, wobei es aufgrund der fixen Größe des Lesepuffers immer noch problematisch ist. Wenn man es wirklich sicher haben wollte, dass es funktioniert, müßte man das lesen so in der Art machen:


int rd;
List<Byte> dataIn = new ArrayList<Byte>();
while ((rd = in.read()) != -1) {
dataIn.add((byte)rd);
}

RMC
2007-06-20, 21:54:00
Es gibt ja auch Reader, die zeilenweise als String einlesen, wenn ich das richtig in Erinnerung hab. Ist sicher nicht so performant, aber bequem. Ist aber natürlich nicht direkt zu gebrauchen, wenn die Verschlüsselungsfunktion jetzt unbedingt bytes braucht.

Evalley
2007-06-21, 14:55:57
erledigt