2016-07-20 2 views
1

У меня есть открытый ключ возвращается какJava нагрузки с открытым ключом

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

И я хочу использовать Java, чтобы загрузить его, и мой код, как

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(); 
     } 

    } 
} 

и я получил исключение брошено, говорит java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

Как правильно загрузить?

+1

SO Ответ на аналогичный вопрос: http://stackoverflow.com/questions/26867840/java-security-spec-invalidkeyspecexception-and-inalse-key-specification-e –

+0

Я не уверен, что получу ваш комментарий. Этот вопрос касается шифрования ключа и сохранения его в файл, а затем загрузки его из файла. Почему это похоже на мой вопрос? Ну, я не совсем понимаю «AQAB» в моем вопросе либо ... – Bomin

+0

AQAB - это всего лишь базовая 64 для публичного экспонента, которая обычно является «010001» в шестнадцатеричных (четвертое число Ферма). Если вы посмотрите на это поразрядным в 6-битных группах, то число будет '000000 010000 000000 000001', в числах' 0 16 0 1' из, als je dat vertaald naar base 64 символа, 'AQAB' (' A' является первым символ в алфавите base64). –

ответ

1

Java только подход (взгляд м, нет библиотеки):

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 не знает, такой формата, так что вы должны разобрать его самостоятельно, или найти декодер. Я ленился и запрограммировал это.

+0

очень приятно. Благодаря! – Bomin

+0

Спасибо. 'new BigInteger (1, nData),' спас мой день! – James

Смежные вопросы