2016-07-20 10 views
1

Ich habe einen öffentlichen Schlüssel zurückgegeben wieJava Last öffentlichen Schlüssel

"kty" : "RSA", 
"alg" : "RS256", 
"ext" : false, 
"n": "vswzzDmrqLSHUu61YDxUhM87hjcVjg42NwpFOyLQK8CyW5YRcr1YUkFRNDbb92MTNW3CsSWJX3DSuilnxf8n3_JW-A9R5JAqwmEygYIXuFcoJ_pb923bph0-ayWPBfD-qwYrELvpiEHBf1QSLJYkRb1wzAlwhCeYJorifu2WhCZoOVVYQAEyNqYF7AVhNImioT8-lhFWGqHp2Jt7-oXtCjVVyyShRHUMYyCRzGj1VGI6AU5DgVebXYD2GJawUhX -AD2CzsX8lMXeaVu88sBU9XLL1Zb_cOvAC7wTXxcls0taKx-8PiWUWKjSg0-O2ZXbfFROyQpQYHQH0BkO8XRh8w" 
"e" : "AQAB" 

Und ich möchte Java verwenden, um es zu laden, und mein Code wie

package key; 

import java.security.KeyFactory; 
import java.security.PublicKey; 
import java.security.spec.X509EncodedKeySpec; 
import java.util.Base64; 

public class PublicKeyReader { 

    public static PublicKey get() throws Exception { 
     String key = "vswzzDmrqLSHUu61YDxUhM87hjcVjg42NwpFOyLQK8CyW5YRcr1YUkFRNDbb92MTNW3CsSWJX3DSuilnxf8n3_JW-A9R5JAqwmEygYIXuFcoJ_pb923bph0-ayWPBfD-qwYrELvpiEHBf1QSLJYkRb1wzAlwhCeYJorifu2WhCZoOVVYQAEyNqYF7AVhNImioT8-lhFWGqHp2Jt7-oXtCjVVyyShRHUMYyCRzGj1VGI6AU5DgVebXYD2GJawUhX-AD2CzsX8lMXeaVu88sBU9XLL1Zb_cOvAC7wTXxcls0taKx-8PiWUWKjSg0-O2ZXbfFROyQpQYHQH0BkO8XRh8w"; 

     X509EncodedKeySpec spec = new X509EncodedKeySpec(key.getBytes()); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     return kf.generatePublic(spec); 
    } 

    public static void main(String[] args) { 
     try { 
      new PublicKeyReader().get(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

und ich habe Ausnahme geworfen, sagt java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

Wie man es richtig lädt?

+1

SO Antwort zu ähnlicher Frage: http://stackoverflow.com/questions/26867840/java-security-spec-invalidkeyspecexception-and-inappropriate-key-specification-e –

+0

Ich bin nicht sicher, dass ich Ihren Kommentar bekommen. In dieser Frage geht es darum, einen Schlüssel zu verschlüsseln und in einer Datei zu speichern und ihn dann aus der Datei zu laden. Warum ähnelt es meiner Frage? Nun, ich verstehe "AQAB" in meiner Frage auch nicht wirklich ... – Bomin

+0

AQAB ist nur Basis 64 für den öffentlichen Exponenten, der in der Regel '010001' in Hexadezimalen (die vierte Primzahl von Fermat) ist. Wenn Sie es bitweise in 6-Bit-Gruppen betrachten, lautet die Nummer '000000 010000 000000 000001', in Zahlen' 0 16 0 1' von, als Datenbasis 64 Zeichen, 'AQAB' (' A' ist die erste Zeichen im Base64-Alphabet). –

Antwort

1

Java nur Ansatz (Look ma, keine Bibliotheken):

package nl.owlstead.stackoverflow; 

import java.io.File; 
import java.math.BigInteger; 
import java.nio.file.Files; 
import java.security.KeyFactory; 
import java.security.PublicKey; 
import java.security.interfaces.RSAPublicKey; 
import java.security.spec.RSAPublicKeySpec; 
import java.util.Base64; 
import java.util.Base64.Decoder; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class LoadRSAKeyFromText { 

    public static void main(String[] args) throws Exception { 
     // parse the lines to find the modulus n and public exponent e 
     List<String> all = Files.readAllLines(new File(args[0]).toPath()); 
     String nString = null, eString = null; 
     for (String line : all) { 
      Pattern nPattern = Pattern.compile("\"n\"\\s*:\\s*\"(.*?)\",?"); 
      Matcher nMatcher = nPattern.matcher(line); 
      if (nMatcher.matches()) { 
       nString = nMatcher.group(1).replaceAll("\\s+", ""); 
      } 

      Pattern ePattern = Pattern.compile("\"e\"\\s*:\\s*\"(.*?)\",?"); 
      Matcher eMatcher = ePattern.matcher(line); 
      if (eMatcher.matches()) { 
       eString = eMatcher.group(1); 
      } 
     } 

     // decode base 64 (with _ and -, so URL safe) 
     Decoder urlDecoder = Base64.getUrlDecoder(); 
     byte[] nData = urlDecoder.decode(nString); 
     byte[] eData = urlDecoder.decode(eString); 

     // convert to *positive* integers 
     BigInteger n = new BigInteger(1, nData); 
     BigInteger e = new BigInteger(1, eData); 

     // create RSA specification and convert to key 
     RSAPublicKeySpec keySpec = new RSAPublicKeySpec(n, e); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     RSAPublicKey pk = (RSAPublicKey) kf.generatePublic(keySpec); 
     System.out.println(pk.getAlgorithm()); 
    } 
} 

Java nicht weiß, diese Art von Format, so dass Sie es selbst zu analysieren haben, oder einen Decoder zu finden. Ich war faul und programmierte es.

+0

sehr nett. Vielen Dank! – Bomin

+0

Danke. 'new BigInteger (1, nData);' rettete meinen Tag! – James

Verwandte Themen