2017-09-14 7 views
0

erstellen Ich habe Probleme beim Konvertieren meines öffentlichen Schlüssels aus einer XML-Datei in Java. Nach einigen Nachforschungen scheint es, dass die X509-Codierung das am häufigsten verwendete Format ist.Konnte kein öffentliches Schlüsselobjekt aus XML in Java

Ich habe eine XML-Datei, die etwa wie folgt aussieht:

<RSAKeyValue> 
<Modulus>hkjhvgkjewrlhfelwrkjvhwerkjlrkwjvbrvkjrbvkwjlvbwekvjbekvbwkbrkvbwrwebrvvbrlkvbklvrbkvlreb</Modulus> 
<Exponent>AQAB</Exponent> 
</RSAKeyValue> 

(nicht mein eigentlicher Schlüsselwert)

Hier ist ein Beispiel für den Code, was ich versuchte:

File fXmlFile = new File(".....\\...\\...\\file.xml"); //Path to xml file 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(fXmlFile); 
doc.getDocumentElement().normalize(); 

NodeList nList = doc.getElementsByTagName("Modulus"); 
Node n = nList.item(0); 

byte[] encKey = Base64.getEncoder().encode(n.getTextContent().getBytes()); 

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey); 
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN"); 
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec); 

In der letzten Zeile bekomme ich eine Ausnahme, die so aussieht:

java.security.spec.InvalidKeySpecException: Inappropriate key specification: invalid key format 
at sun.security.provider.DSAKeyFactory.engineGeneratePublic(DSAKeyFactory.java:119) 
at java.security.KeyFactory.generatePublic(KeyFactory.java:328) 
at XmlReader.main(XmlReader.java:41) 

Ich bin nicht sicher, was das Problem mit dem Schlüsselformat ist. Könnte es sich um ein Problem handeln, bei dem die Eingabe in eine Zeichenfolge konvertiert wird, die dazu führt, dass wichtige Daten für den Schlüssel verloren gehen?

Antwort

1

Sie bauen ein RSA-Schlüssel mit einem DSA KeyFactory und mit X509EncodedKeySpec während Sie Modul und Exponenten in base64 diese

codiert haben Versuchen:

BigInteger modulus = new BigInteger(Base64.getDecoder().decode(modulusAsString)); 
BigInteger exponent = new BigInteger(Base64.getDecoder().decode(exponentAsString)); 

RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey pubKey =keyFactory.generatePublic(keySpec); 

Ich lasse den XML Teil