2

When I try to make RSA public key from string. I get exception mentioned below. I am trying to verify generated keys (string, using Swift) in Android. How to convert the string to private/public key?

static PublicKey getRSAPublicKeyFromString (String publicKeyPEM){
    try {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA", "SC");
        byte[] publicKeyBytes = Base64.decode(publicKeyPEM.getBytes("UTF-8"), Base64.DEFAULT);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes);
        return keyFactory.generatePublic(x509KeySpec);
    }catch (Exception e){
        e.printStackTrace ();
    }

    return null;
}

Exception

java.security.spec.InvalidKeySpecException: encoded key spec not recognised
at org.spongycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(BaseKeyFactorySpi.java:52)
at org.spongycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePublic(KeyFactorySpi.java:130)
at java.security.KeyFactory.generatePublic(KeyFactory.java:172)

public key in ios:

MIGJAoGBAOibWF15OhLJQAWpQN++UFqyG+2uLEG8PPvCajwwh6FWi6jLiZ9VN+l3JpiJTQwF/yxlSJCZCoYnljKeRBnNxpzBnuTJsyuZ4hI8ehLzDvh9nYzX/TlcZYVshJzyIVRZAbuFOCLNIltjB+Qmw8YGlxzeDSFaB6eEC1OP49hDakURAgMBAAE=
Umair M
  • 10,298
  • 6
  • 42
  • 74
Hoàng Hiệp
  • 43
  • 1
  • 5

1 Answers1

4

Unfortunately what you have is a base64 encoded PKCS#1 RSAPublicKey, which is something Java does not produce or consume. Java produces and consumes a slightly more generic and slightly more complicated X.509 SubjectPublicKeyInfo.

Using the Bouncycastle library, here is some example code to produce an RSAPublicKey:

import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1Primitive;

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

public class Main {

    public static void main(String[] args) throws Exception {
        String pubkey64 = "MIGJAoGBAOibWF15OhLJQAWpQN++UFqyG+2uLEG8PPvCajwwh6FWi6jLiZ9VN+l3JpiJTQwF/yxlSJCZCoYnljKeRBnNxpzBnuTJsyuZ4hI8ehLzDvh9nYzX/TlcZYVshJzyIVRZAbuFOCLNIltjB+Qmw8YGlxzeDSFaB6eEC1OP49hDakURAgMBAAE=";
        PublicKey rsaPub = readRSAPublicKey(pubkey64);
        System.out.println(rsaPub);
    }

    private static PublicKey readRSAPublicKey(String pubkey64) throws Exception {
        byte [] derRsaPubBytes = Base64.getDecoder().decode(pubkey64);
        ASN1Primitive asn1Prime = new ASN1InputStream(derRsaPubBytes).readObject();
        org.bouncycastle.asn1.pkcs.RSAPublicKey rsaPub = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(asn1Prime);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(new RSAPublicKeySpec(rsaPub.getModulus(), rsaPub.getPublicExponent()));
    }
}
Community
  • 1
  • 1
President James K. Polk
  • 40,516
  • 21
  • 95
  • 125