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

使用Java keytool生成ECDSA密钥对时选择曲线,java,cryptography,digital-signature,keytool,ecdsa,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

我试图理解在使用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 

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()));
然后是内容:

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
然后对于第二个对象标识符(OID):1.2.840.10045.3.1.7:

涵盖“secp256r1”,即“第2节:建议的椭圆曲线域参数”中列出的椭圆曲线域。SEC(高效加密标准)曲线以通常需要的安全级别提供椭圆曲线域参数,供ECC标准(如ANSI X9.62、ANSI X9.63、IEEE P1363和其他标准)的实施者使用


对于EC,可以使用
-keysize
指定曲线

您还可以编写一些Java代码以更简洁的方式完成这项工作


看一看。这是一个简单的工具,可以让您使用特定曲线创建JCEKS条目,或者以比keytool打印出来的略好的方式查看它们。

Java 11中的for
keytool
表示
-groupname
选项可以指定曲线名称。我有Java 11.0.3和
keytool
报告
非法选项:-groupname
,这太棒了:(看起来Java13确实支持
-groupname
参数,尽管我实际上没有使用它。