Michael Banzon wrote:
> Hej, jeg har de to funktioner angivet nedenfor (undskyld de
> danske tegn, ikke mit designvalg
). Men de kaster en
> java.io.StreamCorruptedException når jeg forsøger at indlæse
> objectet igen... Er der nogen der ved hvad der kunne være galt?
Du mangler at give et AlgorithmParameters objekt med til Cipher.init()
metoden. Nu ved jeg ikke så meget om dette, så jeg prøvede at
generere et sådant med
java.security.AlgorithmParameterGenerator.generateParameters()
men så fik jeg denne:
java.security.NoSuchAlgorithmException: PBEWITHMD5ANDDES
AlgorithmParameterGenerator not available
at java.security.Security.getEngineClassName(Security.java:583)
at java.security.Security.getEngineClassName(Security.java:594)
at java.security.Security.getImpl(Security.java:1043)
at java.security.AlgorithmParameterGenerator.getInstance(
AlgorithmParameterGenerator.java:117)
at Krypt.dekrypterFraDisk(Krypt.java:54)
så fuskede jeg og gemte et AlgorithmParameters objekt fra krypteringen,
og så virkede det sørme:
import javax.crypto.*;
import java.io.*;
import javax.crypto.spec.*;
import java.security.spec.*;
import java.security.*;
class Krypt
{
public static final String KRYPTERINGSALGORITME = "PBEWithMD5AndDES";
public static final String KRYPTERINGSNØGLE = "fooBAR";
public static final byte[] SALT = {(byte)0xA9, (byte)0x9B, (byte)0xC8,
(byte)0x32,
(byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03};
public static final int KRYPTERINGSITERATIONER = 20;
private static AlgorithmParameters params;
public static boolean krypterTilDisk(String fil, Serializable objekt) {
try {
KeySpec nøgleSpecifikationer = new
PBEKeySpec(KRYPTERINGSNØGLE.toCharArray(), SALT, KRYPTERINGSITERATIONER);
SecretKey nøgle =
SecretKeyFactory.getInstance(KRYPTERINGSALGORITME).generateSecret(nøgleSpecifikationer);
Cipher cipher = Cipher.getInstance(nøgle.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, nøgle);
params = cipher.getParameters();
SealedObject krypteretObjekt = new SealedObject(objekt, cipher);
ObjectOutputStream objektSkriver = new ObjectOutputStream(new
FileOutputStream(fil));
objektSkriver.writeObject(krypteretObjekt);
objektSkriver.close();
return true;
} catch(Exception e) {
e.printStackTrace(System.out);
return false;
}
}
public static Object dekrypterFraDisk(String fil) {
try {
KeySpec nøgleSpecifikationer = new
PBEKeySpec(KRYPTERINGSNØGLE.toCharArray(), SALT, KRYPTERINGSITERATIONER);
SecretKey nøgle =
SecretKeyFactory.getInstance(KRYPTERINGSALGORITME).generateSecret(nøgleSpecifikationer);
Cipher cipher = Cipher.getInstance(nøgle.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, nøgle, params );
ObjectInputStream objektLæser = new ObjectInputStream(new
FileInputStream(fil));
SealedObject krypteretObjekt = (SealedObject)(objektLæser.readObject());
objektLæser.close();
return krypteretObjekt.getObject(cipher);
} catch(Exception e) {
e.printStackTrace(System.out);
return null;
}
}
public static void main( String[] args )
{
java.util.Vector vec = new java.util.Vector();
vec.add("Hello");
krypterTilDisk( "hello.txt", vec);
java.util.Vector res = (java.util.Vector)dekrypterFraDisk( "hello.txt");
System.out.println( res.get(0) );
}
}
Ulrik Magnusson