"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Java Serialization

ica 14.05.2007 - 15:26 1013 3
Posts

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9820
Hab folgendes Problem: muss in Java einen bestehenden SecretKey verwenden um etwas zu entschlüsseln (DES oder AES...spielt keine Rolle im Moment).

Nachdem man SecretKeys leider nunmal nicht so einfach erstellen kann dachte ich mir ich probiers per serialization.

Code:
SecretKey key = null;
ObjectInputStream ois = null;
ByteArrayInputStream bis = new ByteArrayInputStream("blah".getBytes());
try
	{
	       ois = new ObjectInputStream(bis);
	       ois.close();
	       key = (SecretKey)ois.readObject();
	}
	       catch(IOException ex)
	{
	       ex.printStackTrace();
	}

funktioniert aber leider nicht:

Code:
java.io.StreamCorruptedException: invalid stream header: 626C6168
	at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
	at java.io.ObjectInputStream.<init>(Unknown Source)

Weiss jemand was ich falsch mache? Der Fehler tritt in der Zeile ois = new ObjectInputStream(bis) auf.

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3280
close() vor readObject schaut mal ned gut aus imho.

dein problem: das byte[], das dem ByteArrayInputStream übergeben wird, ist der Buffer, den der ObjectInputStream nachher deserialisiert - sprich du willst "blah" als Objekt betrachten, was nicht funktionieren wird (62 = ascii code für "b" als hex, 6c=code für "l")...

du willst vermutlich einen fileinputstream verwenden.
Bearbeitet von DKCH am 14.05.2007, 15:42

vossi

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
http://www.google.at/search?q=java+...lient=firefox-a

sollte doch genau das sein was du willst oder?
danach kannste immer noch SecretKey key = new SecretKey(strKey);

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Aus dem Java Cryptography Extension Reference Guide:
Zitat
The following is an example of how to use a SecretKeyFactory to convert secret key data into a SecretKey object, which can be used for a subsequent Cipher operation:
// Note the following bytes are not realistic secret key data
// bytes but are simply supplied as an illustration of using data
// bytes (key material) you already have to build a DESKeySpec.
byte[] desKeyData = { (byte)0x01, (byte)0x02, (byte)0x03,
(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08 };
DESKeySpec desKeySpec = new DESKeySpec(desKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

In this case, the underlying implementation of secretKey is based on the provider of keyFactory.

An alternative, provider-independent way of creating a functionally equivalent SecretKey object from the same key material is to use the javax.crypto.spec.SecretKeySpec class, which implements the javax.crypto.SecretKey interface:
byte[] desKeyData = { (byte)0x01, (byte)0x02, ...};
SecretKeySpec secretKey = new SecretKeySpec(desKeyData, "DES");
hth
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz