// Generate an Elliptic Curve key-pair, using a named curve // // ECgen UserID // will create files: UserID.private, UserID.public // import java.math.BigInteger; import java.security.*; import java.security.spec.*; import java.security.interfaces.*; import java.io.*; public class ECgen { public static void usage() { System.err.println( "Usage: ECgen [-c curve_name (default: secp256k1)] UserID"); System.exit(1); } public static void main(String args[]) throws Exception { String name = "secp256k1", UserID = null; for( int i = 0; i < args.length; ++i) { if( args[i].equals( "-c")) name = args[++i]; else if( UserID != null) usage(); else UserID = args[i]; } if( UserID == null) usage(); // generate key pair // KeyPairGenerator kpg = KeyPairGenerator.getInstance( "EC"); ECGenParameterSpec curve = new ECGenParameterSpec( name); kpg.initialize( curve); KeyPair kp = kpg.genKeyPair(); ECPrivateKey priv = (ECPrivateKey) kp.getPrivate(); ECPublicKey pub = (ECPublicKey) kp.getPublic(); // save private key // FileOutputStream fos = new FileOutputStream( UserID + ".private"); fos.write( priv.getEncoded()); fos.close(); // save public key // fos = new FileOutputStream( UserID + ".public"); fos.write( pub.getEncoded()); fos.close(); // display private and public values // BigInteger S = priv.getS(); ECPoint W = pub.getW(); BigInteger WX = W.getAffineX(); BigInteger WY = W.getAffineY(); System.out.println( name); System.out.println( " S = " + S.toString(16)); System.out.println( "W.X = " + WX.toString(16)); System.out.println( "W.Y = " + WY.toString(16)); } }