Как я могу создать объект java.security.PublicKey из строки в кодировке base64?

У меня есть открытый ключ bse64 с открытым ключом из внешнего источника (Android Store), и мне нужно использовать его для проверки подписанного содержимого. Как я могу преобразовать строку в экземпляр интерфейса java.security.PublicKey. Я нахожусь на Java 6, если это имеет значение.

Ключ (вероятно) сгенерирован с использованием стандартной библиотеки Java, а не надувного замка (из удаленной команды, поэтому я не уверен). Их пример кода говорит об использовании Security.generatePublicKey (base64EncodedPublicKey); но объект безопасности в стандартном Java не имеет такого метода.

 James Black05 июн. 2012 г., 18:04
Что вы используете для создания своего ключа, стандартную библиотеку Java, BouncyCastle или что-то еще?
 Usman Ismail05 июн. 2012 г., 18:18
Стандартный Java очень вероятно, но это удаленная команда, так что я не уверен

Ответы на вопрос(4)

PublicKey getPublicKey(byte[] encodedKey) throws NoSuchAlgorithmException, InvalidKeySpecException
{
    KeyFactory factory = KeyFactory.getInstance("RSA");
    X509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(encodedKey);
    return factory.generatePublic(encodedKeySpec);
}

public static PublicKey getPublicKeyFromString(String key) throws Exception {
    KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
    org.spongycastle.asn1.pkcs.RSAPublicKey pkcs1PublicKey
            = org.spongycastle.asn1.pkcs.RSAPublicKey.getInstance(decodeB64(key));
    RSAPublicKeySpec keySpec
            = new RSAPublicKeySpec(pkcs1PublicKey.getModulus(), pkcs1PublicKey.getPublicExponent());
    PublicKey publicKey = keyFactory.generatePublic(keySpec);
    return publicKey;
}
Решение Вопроса

base64 decode the key data to get a byte array (byte[]) Create a new X509EncodedKeySpec using the byte array Get an instance of KeyFactory using KeyFactory.getInstance("RSA") assuming RSA here call the method generatePublic(KeySpec) with the X509EncodedKeySpec Result /should/ be a public key for your usage.

public static PublicKey getKey(String key){
    try{
        byte[] byteKey = Base64.decode(key.getBytes(), Base64.DEFAULT);
        X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(byteKey);
        KeyFactory kf = KeyFactory.getInstance("RSA");

        return kf.generatePublic(X509publicKey);
    }
    catch(Exception e){
        e.printStackTrace();
    }

    return null;
}
 23 авг. 2016 г., 16:20
Какой импорт вы используете дляBase64.decode?
 04 июл. 2014 г., 18:06
код исправлен, спасибо
 25 апр. 2017 г., 21:09
Очевидно, вы можете использовать метод Base64.getDecoder (). Decode (bytes) из java.util.
 17 мар. 2017 г., 13:12
@Hooli: это "android.util.Base64". В любом случае значение DEFAULT равно 0.
 04 июл. 2014 г., 00:06
Я использовал подобный кусок кода, но это лучше;) Также, если вы работаете на Android, вы можете использовать: byte [] byteKey = Base64.decode (key.getBytes (), Base64.DEFAULT);

Ваш ответ на вопрос