Я не вижу способа в JCE использовать именованную кривую непосредственно для ключа, но ее можно использовать для генерации ключа, а затем из этого ключа можно извлечь параметры:
// generate bogus keypair(!) with named-curve params
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec gps = new ECGenParameterSpec ("secp256r1"); // NIST P-256
kpg.initialize(gps);
KeyPair apair = kpg.generateKeyPair();
ECPublicKey apub = (ECPublicKey)apair.getPublic();
ECParameterSpec aspec = apub.getParams();
// could serialize aspec for later use (in compatible JRE)
//
// for test only reuse bogus pubkey, for real substitute values
ECPoint apoint = apub.getW();
BigInteger x = apoint.getAffineX(), y = apoint.getAffineY();
// construct point plus params to pubkey
ECPoint bpoint = new ECPoint (x,y);
ECPublicKeySpec bpubs = new ECPublicKeySpec (bpoint, aspec);
KeyFactory kfa = KeyFactory.getInstance ("EC");
ECPublicKey bpub = (ECPublicKey) kfa.generatePublic(bpubs);
//
// for test sign with original key, verify with reconstructed key
Signature sig = Signature.getInstance ("SHA256withECDSA");
byte [] data = "test".getBytes();
sig.initSign(apair.getPrivate());
sig.update (data);
byte[] dsig = sig.sign();
sig.initVerify(bpub);
sig.update(data);
System.out.println (sig.verify(dsig));
Вы получаете параметры, но, по-видимому, больше не связаны с OID, что может иметь значение. В частности, это может рассматриваться как «произвольное» или «явное» в TLS и не работать, даже если стороны TLS поддерживают ту же самую кривую по имени.
Обратите внимание, что openssl использует имя prime256v1, но не все. Java (вс.) использует secp256r1 или OID. Если вы на самом деле получаете этот публичный ключ от openssl, обратите внимание, что JCE может напрямую читать формат X.509 SubjectPublicKeyInfo, который openssl вызывает PUBKEY, включая именованную форму (OID).
person
dave_thompson_085
schedule
26.03.2014