web-dev-qa-db-fra.com

Comment puis-je construire un objet Java.security.PublicKey à partir d'une chaîne codée en base64?

J'ai une clé publique bse64encodée de source externe (Android Store) et je dois l'utiliser pour vérifier le contenu signé. Comment puis-je convertir la chaîne en une instance de l'interface Java.security.PublicKey. Je suis sur Java 6 si cela fait une différence.

La clé est (probablement) générée à l'aide de la bibliothèque standard Java et non d'un château gonflable (elle provient d'une équipe distante, donc je ne suis pas sûr). Leur exemple de code dit d'utiliser Security.generatePublicKey (base64EncodedPublicKey); mais l'objet de sécurité dans Java standard n'a pas de telle méthode.

24
Usman Ismail

Ok pour les sourires ... essayez ceci

  • base64 décode les données de clé pour obtenir un tableau d'octets (byte [])
  • Créer une nouvelle X509EncodedKeySpec en utilisant le tableau d'octets
  • Obtenez une instance de KeyFactory en utilisant KeyFactory.getInstance ("RSA") en supposant que RSA est ici
  • appeler la méthode generatePublic (KeySpec) avec X509EncodedKeySpec
  • Résultat/devrait/être une clé publique pour votre utilisation.
21
Dave G

Code pour la réponse ci-dessus

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;
}
42
alexis

Essaye ça....

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

Utiliser un château spongieux

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;
}
0
Jacob Abraham