How can I construct a java.security.PublicKey object from a base64 encoded string?

后端 未结 5 1859
生来不讨喜
生来不讨喜 2020-11-30 02:40

I have a bse64encoded string Public key from external source (Android Store) and I need to use it to verify signed content. How can I convert the string into an instance of

相关标签:
5条回答
  • 2020-11-30 02:46

    Code for the above answer

    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;
    }
    
    0 讨论(0)
  • 2020-11-30 02:48

    Using spongy castle

    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 讨论(0)
  • 2020-11-30 02:51

    you can try this solution:

    add this dependency:

    <dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.61</version>
    

    and use this method:

    private Key parsePublicKey(String publicKey) throws IOException {
        PEMParser pemParser = new PEMParser(new StringReader(publicKey));
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
        SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo.getInstance(pemParser.readObject());
        return converter.getPublicKey(publicKeyInfo);
    }
    
    0 讨论(0)
  • 2020-11-30 03:00

    Ok for grins ... try this

    • 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.
    0 讨论(0)
  • 2020-11-30 03:13

    Try this....

    PublicKey getPublicKey(byte[] encodedKey) throws NoSuchAlgorithmException, InvalidKeySpecException
    {
        KeyFactory factory = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(encodedKey);
        return factory.generatePublic(encodedKeySpec);
    }
    
    0 讨论(0)
提交回复
热议问题