繁体   English   中英

使用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 提供的 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 解码内容:

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

然后查找第二个 OBJECT IDENTIFIER (OID) 的值:1.2.840.10045.3.1.7:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM