La conversion de Chaînes de clés de chiffrement et vice versa java

Je suis actuellement en train de travailler sur un moyen de convertir les clés dans les chaînes, et vice-versa. Il travaille pour la clé publique de conversions, et de convertir une clé privée dans une Chaîne. Pour une raison quelconque, le même code ne sera pas convertir une Chaîne de retour dans une clé privée, je ne peux pas comprendre.

Le convertisseur de code est:

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
@SuppressWarnings("restriction")
public  class KeyConvert {
public static PublicKey stringToPublicKey(String s) {
BASE64Decoder decoder = new BASE64Decoder();
byte[] c = null;
KeyFactory keyFact = null;
PublicKey returnKey = null;
try {
c = decoder.decodeBuffer(s);
keyFact = KeyFactory.getInstance("DSA", "SUN");
} catch (Exception e) {
System.out.println("Error in Keygen");
e.printStackTrace();
}
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(c);
try {
returnKey = keyFact.generatePublic(x509KeySpec);
} catch (Exception e) {
System.out.println("Error in Keygen2");
e.printStackTrace();
}
return returnKey; 
}
public static PrivateKey stringToPrivateKey(String s) {
BASE64Decoder decoder = new BASE64Decoder();
byte[] c = null;
KeyFactory keyFact = null;
PrivateKey returnKey = null;
try {
c = decoder.decodeBuffer(s);
keyFact = KeyFactory.getInstance("DSA", "SUN");
} catch (Exception e) {
System.out.println("Error in first try catch of stringToPrivateKey");
e.printStackTrace();
}
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(c);
try {   //the next line causes the crash
returnKey = keyFact.generatePrivate(x509KeySpec);
} catch (Exception e) {
System.out.println("Error in stringToPrivateKey");
e.printStackTrace();
}
return returnKey; 
}
public static String publicKeyToString(PublicKey p) {
byte[] publicKeyBytes = p.getEncoded();
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(publicKeyBytes);
}
public static String privateKeyToString(PrivateKey p) {
byte[] privateKeyBytes = p.getEncoded();
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(privateKeyBytes);
}
}

Et le pilote de code que j'utilise est:

import java.security.PrivateKey;
import java.security.PublicKey;
public class SQLServerTest {
public static void main(String[] args) throws Exception {
ServerSQLManager s = new ServerSQLManager();
ServerUser user = new ServerUser("testUser", "pass123");
s.getKeys(user);
PublicKey testKey = user.getPublicKey();
System.out.println(testKey);
PrivateKey testKey2 = user.getPrivateKey();
System.out.println(testKey2);
}
}

Lorsque je l'exécute, je reçois inadapté à la spécification de la clé, quelqu'un peut me pointer dans la bonne direction avec ce? La sortie de la console est:

Error in stringToPrivateKey
java.security.spec.InvalidKeySpecException: Inappropriate key specification
at sun.security.provider.DSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at KeyConvert.stringToPrivateKey(KeyConvert.java:61)
at ServerSQLManager.getKeys(ServerSQLManager.java:128)
at SQLServerTest.main(SQLServerTest.java:20)
Sun DSA Public Key
Parameters:DSA
p:     fd7f5381 1d751229 52df4a9c 2eece4e7 f611b752 3cef4400 c31e3f80 b6512669
455d4022 51fb593d 8d58fabf c5f5ba30 f6cb9b55 6cd7813b 801d346f f26660b7
6b9950a5 a49f9fe8 047b1022 c24fbba9 d7feb7c6 1bf83b57 e7c6a8a6 150f04fb
83f6d3c5 1ec30235 54135a16 9132f675 f3ae2b61 d72aeff2 2203199d d14801c7
q:     9760508f 15230bcc b292b982 a2eb840b f0581cf5
g:     f7e1a085 d69b3dde cbbcab5c 36b857b9 7994afbb fa3aea82 f9574c0b 3d078267
5159578e bad4594f e6710710 8180b449 167123e8 4c281613 b7cf0932 8cc8a6e1
3c167a8b 547c8d28 e0a3ae1e 2bb3a675 916ea37f 0bfa2135 62f1fb62 7a01243b
cca4f1be a8519089 a883dfe1 5ae59f06 928b665e 807b5525 64014c3b fecf492a
y:
5210e849 24d90208 56802887 dfaededf 78d3e6d0 d2e59a1c fb52dde8 96147784
b2589365 2529414c 8265b61d c1fe6d98 cee0eea3 cce1e366 cd621ca7 41e3a94f
9c15bfcb eb860d19 21efd574 79bb5b15 8159b1cb e3fc7f76 f85a6fc1 8d65afc6
7c4fafda 503b01b5 99752ee4 2408ad80 1d983579 b00e2120 6d735874 ccaea1c0
null

Je suis conscient que je ne devrais pas être en utilisant le soleil.misc.* de la bibliothèque, et nous sommes à la recherche dans la version d'Apache, mais souhaitez tout de même de comprendre cela (aussi il ne sera jamais le code de production)

Des conseils appréciés.

  • Ne pas le faire. La chaîne n'est pas un conteneur pour les données binaires.
  • Avez-vous essayé de débogage pour réduire la cause de cela? Personne ici ne va déboguer votre code pour vous lorsque vous venez de vider tous vos fichiers.
InformationsquelleAutor | 2012-03-18