web-dev-qa-db-ja.com

base64でエンコードされた文字列からJava.security.PublicKeyオブジェクトを構築するにはどうすればよいですか?

外部ソース(Androidストア)からのbse64encoded文字列公開鍵があり、署名されたコンテンツを検証するためにそれを使用する必要があります。文字列をJava.security.PublicKeyインターフェースのインスタンスに変換するにはどうすればよいですか。私はJava 6にいます。それが違いを生むなら。

キーは(おそらく)標準のJava libを使用して生成され、弾力のある城ではありません(リモートチームからのものであるため、わかりません)。サンプルコードでは、Security.generatePublicKey(base64EncodedPublicKey);を使用するとしています。しかし、標準のセキュリティオブジェクトJavaにはそのようなメソッドはありません。

31
Usman Ismail

にこにこして...これを試してみてください

  • base64はキーデータをデコードしてバイト配列(byte [])を取得します
  • バイト配列を使用して新しいX509EncodedKeySpecを作成します
  • ここでRSAを想定してKeyFactory.getInstance( "RSA")を使用してKeyFactoryのインスタンスを取得します
  • x509EncodedKeySpecを指定して、generatePublic(KeySpec)メソッドを呼び出します。
  • 結果は、使用するための公開鍵である必要があります。
22
Dave G

上記の回答のコード

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

これを試して....

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

海綿城を使用して

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