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

Choosing curve when generating ECDSA keypair with Java keytool

我想了解在使用 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 提供的 Java7 实现仅使用 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 第二个对象标识符 (OID):1.2.840.10045.3.1.7:

Covers "secp256r1", the elliptic curve domain listed in "SEC 2: Recommended Elliptic Curve Domain Parameters". The SEC (Standards for Efficient Cryptography) curves provide elliptic curve domain parameters at commonly required security levels for use by implementers of ECC standards like ANSI X9.62, ANSI X9.63, IEEE P1363, and other standards.

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

您还可以编写一些 Java 代码以更简洁的方式执行此操作。

看看https://github.com/alokmenghrajani/ec-keytool。这是一个简单的工具,可让您创建具有特定曲线的 JCEKS 条目或以比 keytool 打印出来的略好一些的方式查看它们。