Guten Tag,
ich habe gerade angefangen, ein kleines Programm zu schreiben und habe dort eine Klasse "SaveFile", die eine ArrayList mit "Server" Objekten enthält. Diese Objekte des Typs "Server" haben Informationen wie eine IP-Addresse und einiges mehr. Nun möchte ich über eine Klasse "ConfigManager" eine serialisierte Form von "SaveFile" verschlüsselt in eine Datei schreiben. Das Verschlüsseln an sich übernimmt die Utility-Klasse "ReadWriteAES".
So weit, so gut. Der Schreibvorgang läuft komplett ohne sichtbare Fehlermeldungen ab, sprich keine auffindbaren Exceptions. Wenn ich nun die Datei auslese, bekomme ich aber eine EOFException.
Die bedeutet meines Wissens nach ja, dass die Datei zuende ist, obwohl man noch mehr lesen will.
Ich hoffe ihr könnt mir helfen. Dazu hier der entsprechende Code:
SaveFile.java
ConfigManager.java
ReadWriteAES.java
Vielen Dank schon einmal im Voraus.
Mit freundlichen Grüßen,
Euer UNIX
P.S. Der Fehler tritt in Zeile 38 der ConfigManager.java auf, welche diese ist:
ich habe gerade angefangen, ein kleines Programm zu schreiben und habe dort eine Klasse "SaveFile", die eine ArrayList mit "Server" Objekten enthält. Diese Objekte des Typs "Server" haben Informationen wie eine IP-Addresse und einiges mehr. Nun möchte ich über eine Klasse "ConfigManager" eine serialisierte Form von "SaveFile" verschlüsselt in eine Datei schreiben. Das Verschlüsseln an sich übernimmt die Utility-Klasse "ReadWriteAES".
So weit, so gut. Der Schreibvorgang läuft komplett ohne sichtbare Fehlermeldungen ab, sprich keine auffindbaren Exceptions. Wenn ich nun die Datei auslese, bekomme ich aber eine EOFException.
Die bedeutet meines Wissens nach ja, dass die Datei zuende ist, obwohl man noch mehr lesen will.
Ich hoffe ihr könnt mir helfen. Dazu hier der entsprechende Code:
SaveFile.java
Java:
import java.io.Serializable;
import java.util.ArrayList;
import de.mrpixeldream.badguys.control.modules.Server;
public class SaveFile implements Serializable
{
private static final long serialVersionUID = 1L;
public ArrayList<Server> myServers = new ArrayList<>();
}
ConfigManager.java
Java:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.NoSuchPaddingException;
public class ConfigManager
{
public static void writeConfig(SaveFile save, String masterPassword) throws Exception
{
FileOutputStream file = new FileOutputStream("bgSave.enc");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream objectStream = new ObjectOutputStream(bos);
ReadWriteAES.encode(bos.toByteArray(), file, masterPassword);
objectStream.close();
}
public static SaveFile readConfig(String masterPassword) throws Exception
{
SaveFile config = null;
FileInputStream file = new FileInputStream("bgSave.enc");
byte[] fileContent = ReadWriteAES.decode(file, masterPassword);
ByteArrayInputStream bis = new ByteArrayInputStream(fileContent);
ObjectInputStream objectStream = new ObjectInputStream(bis);
config = (SaveFile) objectStream.readObject();
return config;
}
}
ReadWriteAES.java
Java:
import java.io.*;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import javax.crypto.*;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
public class ReadWriteAES
{
static void encode( byte[] bytes, OutputStream out, String pass ) throws Exception
{
Cipher c = Cipher.getInstance( "AES" );
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(pass.toCharArray(), "5500".getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Key k = new SecretKeySpec( secret.getEncoded(), "AES" );
System.out.println(new String(k.getEncoded()));
c.init( Cipher.ENCRYPT_MODE, k );
OutputStream cos = new CipherOutputStream( out, c );
cos.write( bytes );
cos.close();
}
static byte[] decode( InputStream is, String pass ) throws Exception
{
Cipher c = Cipher.getInstance( "AES" );
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(pass.toCharArray(), "5500".getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Key k = new SecretKeySpec( secret.getEncoded(), "AES" );
System.out.println(new String(k.getEncoded()));
c.init( Cipher.DECRYPT_MODE, k );
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CipherInputStream cis = new CipherInputStream( is, c );
for ( int b; (b = cis.read()) != -1; )
bos.write( b );
cis.close();
return bos.toByteArray();
}
static void encode(byte[] bytes, FileOutputStream out, byte[] secKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException, InvalidKeyException, IOException
{
Cipher c = Cipher.getInstance( "AES" );
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(new String(secKey).toCharArray(), "5500".getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Key k = new SecretKeySpec( secret.getEncoded(), "AES" );
c.init( Cipher.ENCRYPT_MODE, k );
OutputStream cos = new CipherOutputStream( out, c );
cos.write( bytes );
cos.close();
}
static byte[] decode(InputStream is, byte[] secKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IOException, InvalidKeySpecException
{
Cipher c = Cipher.getInstance( "AES" );
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(new String(secKey).toCharArray(), "5500".getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Key k = new SecretKeySpec( secret.getEncoded(), "AES" );
c.init( Cipher.DECRYPT_MODE, k );
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CipherInputStream cis = new CipherInputStream( is, c );
for ( int b; (b = cis.read()) != -1; ){
bos.write( b );
}
cis.close();
return bos.toByteArray();
}
}
Vielen Dank schon einmal im Voraus.
Mit freundlichen Grüßen,
Euer UNIX
P.S. Der Fehler tritt in Zeile 38 der ConfigManager.java auf, welche diese ist:
Code:
config = (SaveFile) objectStream.readObject();
Zuletzt bearbeitet: