2016-05-20 26 views
0

openssl ecparam -genkey -name secp256k1 -noout -outform DER -out private.keyと、この次のコマンドopenssl ec -inform DER -in private.key -noout -textを実行するには、私は次の出力を得る:今opensslで生成されたjavaと同じタイプのecdsa鍵ペアを生成するにはどうすればいいですか?私は私のマシン上でECDSA鍵ペアを生成するには、次のコマンドを実行しています

read EC key 
Private-Key: (256 bit) 
priv: 
    //private key 
pub: 
    04:64:0a:f7:e6:e1:a9:7f:d3:b2:ec:ad:f1:41:96: 
    ee:c1:c2:e7:02:4a:54:42:ab:e8:da:9f:88:e1:02: 
    46:aa:32:91:38:b5:9e:37:fc:96:d9:36:02:07:de: 
    74:59:c4:a8:e0:2b:21:3a:d4:70:7d:5e:92:54:22: 
    65:80:0f:df:fd 
ASN1 OID: secp256k1 

を私がに興味があることは上記公開されていますコロンが付いていないキーは04640af7e6e1a97fd3b2ecadf14196eec1c2e7024a5442abe8da9f88e10246aa329138b59e37fc96d9360207de7459c4a8e02b213ad4707d5e92542265800fdffdです。この公開鍵に、その鍵が有効かどうかを検証するapi呼び出しに送る必要があります。 opensslによって生成されたキーは、api呼び出しで送信されたときに、サーバーによって有効として受け入れられます。

しかし、api呼び出しで送信されたときにjavaで生成された公開ecdsキーは拒否されます。私は鍵ペア

public KeyPair getECDSAKeyPair() throws NoSuchProviderException, NoSuchAlgorithmException, 
     InvalidAlgorithmParameterException { 
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC"); 
    ECGenParameterSpec spec = new ECGenParameterSpec("secp256k1"); 
    keyPairGenerator.initialize(spec, new SecureRandom()); 
    return keyPairGenerator.generateKeyPair(); 
} 

public String getHexPublicKeyString(KeyPair keypair) { 
    PublicKey publicKey = keypair.getPublic(); 
    return Hex.toHexString(publicKey.getEncoded()); 
} 

私の質問には、OpenSSLによって生成されたとして、私はECDSAの鍵ペアの同じタイプを生成することができる方法で生成するには、次のコードを使用していますか? OpenSSLで生成された鍵とOpenSSLで生成された鍵が受け入れられるようにjavaによって生成された鍵の違いは何ですか?javaが生成する鍵は拒否されますか?

+0

*「私はに興味がコロンなし上記の公開鍵である...」* - パイプそれTR 'を通じて'または' sed'を実行してコロンと空白を削除します。 OpenSSL wikiの[Elliptic Curve Cryptography](https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography)も参照してください。 – jww

+0

私はどのようにjavaで同じタイプのキーを作成するのですか? – Harry

+0

これは役に立ちます:[PublicKeyオブジェクトをECの公開鍵のバイトからどのように取得できますか?](http://stackoverflow.com/q/26159149)。つまり、JavaとOpenSSLのECキーがあります。あなたはプレゼンテーションの詳細に問題があるようですが、あなたは必要なフォーマットを教えていません。そして 'openssl ec -inform DER -in private.key -noout -text'はさらに別のプレゼンテーション形式を作成します。 APIで期待される形式を教えてください。それは、(1)PEMまたは(2)DER(16進数やWebsafe Base64のようなオプションのエンコーディング)のいずれかになります。 (3)publicKeyまたは(4)subjectPublicKeyInfo。 – jww

答えて

0

私はSpongyCastleを使用して、以下の方法で必要な公共を生成することができた:

public static String getHexEncodedPublicKey(PublicKey publicKey) throws IOException, InvalidKeyException { 
    ECPublicKeyParameters ecPublicKeyParameters 
      = (ECPublicKeyParameters) ECUtil.generatePublicKeyParameter(publicKey); 
    byte[] encoded = ecPublicKeyParameters.getQ().getEncoded(false); 
    return Hex.toHexString(encoded); 
} 
関連する問題