我试图了解如何在使用Java(7)keytool生成密钥对时如何选择ECDSA曲线。
这也有助于找出默认设置使用的曲线。
这是我使用的命令:
keytool -genkeypair -keyalg EC -alias myAlias -keystore myKeystore.jks -storepass myStorepass -keypass myKeypass -validity 730 -keysize 256 -dname "CN=myCn, OU=myOu, O=myO, C=myC" -v
答案 0 :(得分:1)
Oracle提供的Java 7实现仅使用SEC曲线。这些与NIST标准化曲线相同。在您的情况下,确定使用了P-256。但是在Java中,使用了原始的SEC名称:"secp256r1"
。
因此您可以检索并编码私钥:
KeyStore store = KeyStore.getInstance("JKS");
store.load(new FileInputStream(args[0]), args[1].toCharArray());
ECPrivateKey key = (ECPrivateKey) store.getKey(args[2], args[3].toCharArray());
System.out.println(Base64.getEncoder().encodeToString(key.getEncoded()));
然后ASN.1 decode内容:
SEQUENCE (3 elem)
INTEGER 0
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.840.10045.2.1
OBJECT IDENTIFIER 1.2.840.10045.3.1.7
OCTET STRING (1 elem)
SEQUENCE (2 elem)
INTEGER 1
OCTET STRING (32 byte) E935A4475D495ADA18A791C1222D5A3424CF540BDE42802F588C664082D10808
然后lookup the value代表第二个OBJECT IDENTIFIER(OID):1.2.840.10045.3.1.7:
封面" secp256r1"," SEC 2:推荐的椭圆曲线域参数"中列出的椭圆曲线域。 SEC(高效密码学标准)曲线提供通常所需安全级别的椭圆曲线域参数,供ECC标准的实施者使用,如ANSI X9.62,ANSI X9.63,IEEE P1363和其他标准。
答案 1 :(得分:0)
对于EC,您可以使用-keysize
指定曲线!
您还可以编写一些Java代码,以更清晰的方式执行此操作。
看看https://github.com/alokmenghrajani/ec-keytool。这是一个简单的工具,可以让您创建具有特定曲线的JCEKS条目,或者以比keytool打印出来的方式更好的方式查看它们。