RSAPrivateKey返回RuntimeException

时间:2016-10-26 11:24:53

标签: java android asynchronous openssl

我试图在Android上获取OpenSSLRSAPublicKey和OPENSSLRSAPrivateKey格式的RSA密钥。

键看起来像这样(自动生成,不起作用):

  

私钥字符串:   MIICWwIBAAKBgHfvJ1jB80KZTaEYClqbM0znYlos0qTenOF + BSjC4DT31rCwLgMJ   5 / c7jSUuzH34OypP8Z7sGMz4UIXzXRGUKXA0TFXvq3aKNMGa74SCB3AGJmjb4yvT   rXpTytfeuJsodJzBmwsCkgfkAYZBH06OJAxNPpqoUMUZHOg61hTHwm9nAgMBAAEC   gYBC8L3yYVaITo6won1s8wEgJGmV0TzE / udrSG5SwOppRgeTWNJlqcrKCHgQT92d   VcaYKETBIh / 5j4NKMHo6zIqPpH7GxzNuG3Ua + pmi6VOcdFs7O071q6zAt9aLb / DD   rs7gJb5 / H2 / LuJBbKInKb + c0IUMEQ9AFoAc70q + um4eJmQJBAOxugXf7LFlCrfun   TuR5eYVjLBM9pmVRMEYJcp9CH7qtTAKhdHAKgnZ7Sw3gTxtBi + msnm3zXwtzO / CY   XJH + m7UCQQCB3E8xvJWICLpX / 11saDUOZsoaC53A7SunptkbAyJ49yE8SVg3O92i   kqRBlFho1JL84vDZe10GXwxj6O1XwigrAkAAzfN01A73ksmCxLP5BQzLzmWU / Y20   xIz0gA26yv / Oo85RZ / k8dFyzSIId3viF8DgoqGS1nRFiuZanpZaUfKHNAkAuQwDH   DCPE + U7 / eE6c1wbHqaCn5Kl / WD5sDEldkSFPvKJPasWNb7tGNj1jy2gveEMg6evp   XkRGh8fPM + SRle5fAkEAmaQeOnryugbQBVOAj006jEQaidYsF8FNnKSAyxPQlbSC   Nee4pL / hKkjqtm5zKgEp8f0dHRhz5vb94EdLnl1DJA ==

     

公钥字符串:   MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHfvJ1jB80KZTaEYClqbM0znYlos   0qTenOF + BSjC4DT31rCwLgMJ5 / c7jSUuzH34OypP8Z7sGMz4UIXzXRGUKXA0TFXv   q3aKNMGa74SCB3AGJmjb4yvTrXpTytfeuJsodJzBmwsCkgfkAYZBH06OJAxNPpqo   UMUZHOg61hTHwm9nAgMBAAE =

这是我的代码:

public static RSAPrivateKey getPrivateKeyFromString(String key) throws IOException, GeneralSecurityException {
    String privateKeyPEM = key;
    privateKeyPEM = privateKeyPEM.replace("-----BEGIN PRIVATE KEY-----\n", "");
    privateKeyPEM = privateKeyPEM.replace("-----END PRIVATE KEY-----", "");
    byte[] encoded = Base64.decode(privateKeyPEM, Base64.DEFAULT);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    ///////// Line below is (RSA.java:37)
    RSAPrivateKey privKey = (RSAPrivateKey) kf.generatePrivate(new PKCS8EncodedKeySpec(encoded));
    return privKey;
}
public static RSAPublicKey getPublicKeyFromString(String key) throws IOException, GeneralSecurityException {
    String publicKeyPEM = key;
    publicKeyPEM = publicKeyPEM.replace("-----BEGIN PUBLIC KEY-----\n", "");
    publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");
    byte[] encoded = Base64.decode(publicKeyPEM, Base64.DEFAULT);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new X509EncodedKeySpec(encoded));
    return pubKey;
}

有趣的是pubKey返回了这个:

OpenSSLRSAPublicKey{modulus=9920c2.....,publicExponent=10001}

但是privKey给了我这个例外:

W/System.err: java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0890ba:ASN.1 encoding routines:asn1_check_tlen:WRONG_TAG
W/System.err:     at com.android.org.conscrypt.OpenSSLKey.getPrivateKey(OpenSSLKey.java:283)
W/System.err:     at com.android.org.conscrypt.OpenSSLRSAKeyFactory.engineGeneratePrivate(OpenSSLRSAKeyFactory.java:64)
W/System.err:     at java.security.KeyFactory.generatePrivate(KeyFactory.java:187)
W/System.err:     at com.vladmarton.educomiit.RSA$override.getPrivateKeyFromString(RSA.java:37)

我浏览了stackoverflow很长一段时间,但我找不到任何有效的解决方案。我需要使用与pubKey一样的格式,但不能让私钥工作。

1 个答案:

答案 0 :(得分:0)

curl -X GET   https://myelastic/catalogsearch_fulltext
{"catalogsearch_fulltext":{"aliases":{},"mappings":{},"settings":{"index":{"number_of_shards":"5","provided_name":"catalogsearch_fulltext","max_shingle_diff":"10","creation_date":"1577099050110","number_of_replicas":"1","uuid":"n2iEXzQ-S4ePMUyoOAUB9w","version":{"created":"7010199"}}}}}