0

次のコマンドを実行して、マシンで ecdsa キーペアを生成しています。 openssl ecparam -genkey -name secp256k1 -noout -outform DER -out private.keyこの次のコマンドを実行するとopenssl ec -inform DER -in private.key -noout -text、次の出力が得られます。

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 呼び出しに、この公開キーを送信する必要があります。API 呼び出しで送信されたときにによって生成されたキーopensslは、サーバーによって有効なものとして受け入れられます。

しかし、API 呼び出しで送信されたときに Java で生成された公開 ecdsa キーは拒否されます。次のコードを使用してキーペアを生成しています

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 によって生成されたキーと Java によって生成されたコードの違いは何ですか。OpenSSL によって生成されたキーは受け入れられますが、Java によって生成されたキーは拒否されます。

4

1 に答える 1

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);
}
于 2016-05-28T10:18:25.457 に答える