Java Serialization
ica 14.05.2007 - 15:26 1013 3
ica
hmm
|
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. 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: 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
...
|
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
|
|
gue
Addicted
|
Aus dem Java Cryptography Extension Reference Guide: 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
|