2017-08-02 6 views
0

は基本的に私は、OpenSSLを使用すると、このようになります署名を検証しようとしています:のPublicKey、Javaの

openssl dgst -sha256 -verify prime192v1-pub-v1.pem -signature signatureFile.bin < dataFile.bin 

を...とAndroid上でそれを行うために、私はPublicKeyオブジェクトを作成する必要があります。私が使用しているメソッドは、の行kf.generatePublic(new X509EncodedKeySpec(encoded))にスローします。

import org.spongycastle.util.encoders.Base64; 

import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.security.KeyFactory; 
import java.security.PublicKey; 
import java.security.spec.X509EncodedKeySpec; 

public class SO { 

    public static PublicKey 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); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     return kf.generatePublic(new X509EncodedKeySpec(encoded)); 
    } 

} 

これは私がメソッドを呼び出す方法です:

SO.getPublicKeyFromString(
      "-----BEGIN PUBLIC KEY-----\n" + 
      "MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEXMHnQfWiM4oCaLfx296llgz7iaVv\n" + 
      "avMPppkzVNZAxtlNLhFlXnNWD0Mw9yzP8/Go\n" + 
      "-----END PUBLIC KEY-----" 
    ); 

誰もが私が間違ってやっている知っていますか?

+1

はい、RSA公開鍵ではなく、楕円曲線(P192)の公開鍵です。 –

+0

[JavaからOpenSSLで生成されたECDSA鍵を読み取ることができません:InvalidKeySpecException](https://stackoverflow.com/q/42234685/608639)、[spicyy castleを使用してビットコイン曲線(secp256k1)用のECDSA鍵ペア(256bit)を作成する方法?](https://stackoverflow.com/q/29778852/608639)、[PEMでエンコードされた楕円曲線の公開鍵をBouncy Castleにロードする方法](https://stackoverflow.com/q/40434317/608639)、[ EC公開鍵バイトからPublicKeyオブジェクトを取得するにはどうすればよいですか?](https://stackoverflow.com/q/26159149/608639)、[楕円曲線PEMでエンコードされた秘密鍵をロードするにはどうすればいいですか?](https:// stackoverflow .com/q/41927859/608639)など – jww

答えて

0

私はそれを働かせました。公開鍵は楕円曲線(p192)の公開鍵であり、別の方法でロードする必要があります。 PublicKeyを持っているので、opensslコマンドと同じ方法で署名を検証することができました。

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

import java.io.Reader; 
import java.io.StringReader; 
import java.security.KeyFactory; 
import java.security.PublicKey; 
import java.security.Security; 
import java.security.Signature; 
import java.security.spec.X509EncodedKeySpec; 

public class SO { 

    public PublicKey getPublicKey() throws Exception { 
     Security.addProvider(new BouncyCastleProvider()); 
     Reader rdr = new StringReader(
       "-----BEGIN PUBLIC KEY-----\n" + 
         "MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEXMHnQfWiM4oCaLfx296llgz7iaVv\n" + 
         "avMPppkzVNZAxtlNLhFlXnNWD0Mw9yzP8/Go\n" + 
         "-----END PUBLIC KEY-----\n" 
     ); // or from file etc. 

     org.bouncycastle.util.io.pem.PemObject spki = new org.bouncycastle.util.io.pem.PemReader(rdr).readPemObject(); 
     PublicKey key = KeyFactory.getInstance("EC", "BC").generatePublic(new X509EncodedKeySpec(spki.getContent())); 
     return key; 
    } 

    public static boolean verify(byte[] data, byte[] signatureBytes, PublicKey publicKey) throws Exception { 
     Signature signature = Signature.getInstance("SHA256withECDSA", "BC"); 
     signature.initVerify(publicKey); 
     signature.update(data); 
     return signature.verify(signatureBytes); 
    } 

} 
関連する問題