I am trying to generate ECDSA key pair using SpongyCastle in Android. This is the code:
static {
Security.insertProviderAt(new org.spongycastle.jce.provi
Java's default encoding for a PublicKey
is "X.509"
which is not just the EC point; it is an ASN.1 structure identifying the algorithm (EC) and parameters (here prime256v1) PLUS a BIT STRING wrapping the point; see rfc5280 section 4.2.1.7 and rfc3279 section 2.3.5.
Similarly the default encoding for PrivateKey
is "PKCS#8"
(unencrypted) which is a structure containing an AlgorithmIdentifier plus an OCTET STRING wrapping the data which in this case contains both the private key value and a copy of the public key, see rfc5208 section 5 and C.4 of document SEC 1 at http://www.secg.org with tag [0]
omitted but tag [1]
present.
To read (either or both of) them back in to Java, get a KeyFactory.getInstance("EC")
and use generate{Public,Private}
on an X509EncodedKeySpec
or PKCS8EncodedKeySpec
respectively.
ECDSA and ECDH (and ECMQV etc) use the same key structures, unlike classic integer DSA and DH which use the same mathematical structure ($Z_p^*$) but slightly different representations.
PS: the javadoc for java.security.Key tells you most of this.