Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ärger mit PBE und dem Security-Provider

0 views
Skip to first unread message

Martin König

unread,
Sep 15, 2004, 6:39:10 PM9/15/04
to
Hallo,
bei Verschlüsselung von Daten mit einem Passwort habe ich mir was
zusammengebastelt, dass aber eine sehr seltsames Verhalten hat. Ich benutze
eine Klasse PBE, die greift auf verschlüsseltes RSA-Schlüsselpaar zu. Das
Schlüsselpaar wird einmal verschlüsselt und als Datei abgespeichert. Auf die
Datei wird immer lesend zugegriffen und das Schlüsselpaar entsprechend mit
dem Passwort entschlüsselt. Das wird von einem Art Manager gemacht, der
hochgefahren wird und neben der Entschlüsselung noch andere Dinge macht, die
jetzt nicht so wichtig sind. Mein Problem ist folgendes. Wenn ich den
Manager starte und das Passwort eingebe, dann kommt folgende Exception:

java.lang.ExceptionInInitializerError
at javax.crypto.SecretKeyFactory.getInstance(DashoA6275)
Caused by: java.lang.SecurityException: Cannot set up certs for trusted CAs
at javax.crypto.SunJCE_b.<clinit>(DashoA6275)
... 9 more
Caused by: java.security.PrivilegedActionException:
java.security.InvalidKeyException: MD5/RSA/PKCS#1: Not an RSA public key
at java.security.AccessController.doPrivileged(Native Method)
... 10 more
Caused by: java.security.InvalidKeyException: MD5/RSA/PKCS#1: Not an RSA
public key
at
cryptix.provider.rsa.Any_RSA_PKCS1Signature.engineInitVerify(Any_RSA_PKCS1Si
gnature.java:254)
at java.security.Signature.initVerify(Unknown Source)
at sun.security.x509.X509CertImpl.verify(Unknown Source)
at sun.security.x509.X509CertImpl.verify(Unknown Source)
at javax.crypto.SunJCE_b.c(DashoA6275)
at javax.crypto.SunJCE_b.b(DashoA6275)
at javax.crypto.SunJCE_s.run(DashoA6275)
... 11 more

So, der Manager startet erst gar nicht. Wenn ich den Manager nochmal starte
und das Passwort eingebe, funzt es ganz normal.
Meine Frage: Woran kann das liegen, dass der Manager beim ersten Mal mit der
o.g. Fehlermeldung nicht startet?
Die Ursache liegt in der Zeile:
keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES","SunJCE"); in der
Methode decrypt. Was ich aber nicht verstehe ist, das es beim zweiten Start
klappt. Unter welcen Umständen kann es passieren, dass so eine Fehlermeldung
rauskommt? Ich kenne es nur so, dass man Ärger mit dem Proivider hat, weil
er nicht vertrauenswürdig ist, aber dann dürfte es überhaupt nicht funzen.
Versteh auch nicht, was der Provider Cryptix mit der ganzen Sache zu tun
hat. Ich greife doch explizit auf SunJCE zu und nicht auf Cryptix, owbwohl
Cryptix als Provider installiert ist. Jemand eine Idee, was die URsache sein
könnte?


import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;


public class PBE
{

public PBE()
{
Security.addProvider( new com.sun.crypto.provider.SunJCE());
}


public byte[] encrypt(byte[] data, char[] password)
{
byte[] ret = null;
try
{
PBEKeySpec pbeKeySpec;
PBEParameterSpec pbeParamSpec;
SecretKeyFactory keyFac;
byte[] salt = {
(byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
(byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
};
int count = 20;
pbeParamSpec = new PBEParameterSpec(salt, count);
pbeKeySpec = new PBEKeySpec(password);
keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
ret = pbeCipher.doFinal(data);
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("Fehler");
}
return ret;
}

public byte[] decrypt(byte[] data, char[] password)
{

byte[] ret = null;

try
{
PBEKeySpec pbeKeySpec;
PBEParameterSpec pbeParamSpec;
SecretKeyFactory keyFac;
byte[] salt = {
(byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
(byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
};
int count = 20;
pbeParamSpec = new PBEParameterSpec(salt, count);
pbeKeySpec = new PBEKeySpec(password);
keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES","SunJCE");
SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.DECRYPT_MODE, pbeKey, pbeParamSpec);

ret = pbeCipher.doFinal(data);

}
catch (IllegalBlockSizeException e) {
System.out.println (e.getMessage());
System.out.println ("");
e.printStackTrace();
System.out.println("Fehler");
} catch (Exception e) { e.printStackTrace();
}

return ret;
}
}


0 new messages