使用Java keytool生成ECDSA密钥对时选择曲线

时间:2016-03-27 09:58:23

标签: java cryptography digital-signature keytool ecdsa

我试图了解如何在使用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 

2 个答案:

答案 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打印出来的方式更好的方式查看它们。