【问题标题】:Way to enumerate all elliptic curve names available in Java?枚举Java中可用的所有椭圆曲线名称的方法?
【发布时间】:2018-07-25 22:39:16
【问题描述】:

有没有办法枚举所有可以赋予的椭圆曲线名称 ECGenParameterSpec 构造函数?或者您是否只需要在墙上扔出一大串曲线名称,然后在尝试使用它们时查看哪些会抛出异常,哪些不会抛出异常?

【问题讨论】:

  • java.security.Security.getAlgorithms() - 不知道如何分辨哪些是椭圆曲线

标签: java cryptography elliptic-curve


【解决方案1】:

有一种更好的方法可以使用支持的 API 而不是反射来获取支持的曲线名称列表:

Security.getProviders("AlgorithmParameters.EC")[0]
    .getService("AlgorithmParameters", "EC").getAttribute("SupportedCurves");

在 jshell 中(采用 OpenJDK 11.0.1):

jshell> Security.getProviders("AlgorithmParameters.EC")[0]
    .getService("AlgorithmParameters", "EC").getAttribute("SupportedCurves")
$10 ==> "[secp112r1,1.3.132.0.6]|[secp112r2,1.3.132.0.7]|[secp128r1,1.3.132.0.28]|[secp128r2,1.3.132.0.29]|[secp160k1,1.3.132.0.9]|[secp160r1,1.3.132.0.8]|[secp160r2,1.3.132.0.30]|[secp192k1,1.3.132.0.31]|[secp192r1,NIST P-192,X9.62 prime192v1,1.2.840.10045.3.1.1]|[secp224k1,1.3.132.0.32]|[secp224r1,NIST P-224,1.3.132.0.33]|[secp256k1,1.3.132.0.10]|[secp256r1,NIST P-256,X9.62 prime256v1,1.2.840.10045.3.1.7]|[secp384r1,NIST P-384,1.3.132.0.34]|[secp521r1,NIST P-521,1.3.132.0.35]|[X9.62 prime192v2,1.2.840.10045.3.1.2]|[X9.62 prime192v3,1.2.840.10045.3.1.3]|[X9.62 prime239v1,1.2.840.10045.3.1.4]|[X9.62 prime239v2,1.2.840.10045.3.1.5]|[X9.62 prime239v3,1.2.840.10045 ... 840.10045.3.0.18]|[X9.62 c2tnb431r1,1.2.840.10045.3.0.20]|[brainpoolP160r1,1.3.36.3.3.2.8.1.1.1]|[brainpoolP192r1,1.3.36.3.3.2.8.1.1.3]|[brainpoolP224r1,1.3.36.3.3.2.8.1.1.5]|[brainpoolP256r1,1.3.36.3.3.2.8.1.1.7]|[brainpoolP320r1,1.3.36.3.3.2.8.1.1.9]|[brainpoolP384r1,1.3.36.3.3.2.8.1.1.11]|[brainpoolP512r1,1.3.36.3.3.2.8.1.1.13]"

然后您可以解析这些条目。

不过,现在还有new "XEC" curves - X25519 和 X448。据我所知,这些仅作为two constants of NamedParameterSpec 提供。

【讨论】:

  • 这比反射要好得多,但不幸的是,您最终必须解析字符串描述才能找到各个曲线。在 Java 8 和 Java 11 上测试和工作。
【解决方案2】:

这在很大程度上取决于您要使用的提供程序。正如user69513 所述,您需要查阅文档。还有最基本的问题。

对于 SunEC 提供者,文档无处可寻,公众也无法获得资源。但是通过查看 sunec.jar 中公开的类,我们会发现 CurveDB 类和方法 getSupportedCurves。可以使用反射来调用它:

public static void main(String[] args) throws Exception {
    Method method = sun.security.ec.CurveDB.class.getDeclaredMethod("getSupportedCurves", null);
    method.setAccessible(true);
    Collection result = (Collection) method.invoke(null, null);
    for (Object object : result) {
        System.out.println(object);
    }
}

这会让你完全不满意:

secp112r1 (1.3.132.0.6)
secp112r2 (1.3.132.0.7)
secp128r1 (1.3.132.0.28)
secp128r2 (1.3.132.0.29)
secp160k1 (1.3.132.0.9)
secp160r1 (1.3.132.0.8)
secp160r2 (1.3.132.0.30)
secp192k1 (1.3.132.0.31)
secp192r1 [NIST P-192, X9.62 prime192v1] (1.2.840.10045.3.1.1)
secp224k1 (1.3.132.0.32)
secp224r1 [NIST P-224] (1.3.132.0.33)
secp256k1 (1.3.132.0.10)
secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)
secp384r1 [NIST P-384] (1.3.132.0.34)
secp521r1 [NIST P-521] (1.3.132.0.35)
X9.62 prime192v2 (1.2.840.10045.3.1.2)
X9.62 prime192v3 (1.2.840.10045.3.1.3)
X9.62 prime239v1 (1.2.840.10045.3.1.4)
X9.62 prime239v2 (1.2.840.10045.3.1.5)
X9.62 prime239v3 (1.2.840.10045.3.1.6)
sect113r1 (1.3.132.0.4)
sect113r2 (1.3.132.0.5)
sect131r1 (1.3.132.0.22)
sect131r2 (1.3.132.0.23)
sect163k1 [NIST K-163] (1.3.132.0.1)
sect163r1 (1.3.132.0.2)
sect163r2 [NIST B-163] (1.3.132.0.15)
sect193r1 (1.3.132.0.24)
sect193r2 (1.3.132.0.25)
sect233k1 [NIST K-233] (1.3.132.0.26)
sect233r1 [NIST B-233] (1.3.132.0.27)
sect239k1 (1.3.132.0.3)
sect283k1 [NIST K-283] (1.3.132.0.16)
sect283r1 [NIST B-283] (1.3.132.0.17)
sect409k1 [NIST K-409] (1.3.132.0.36)
sect409r1 [NIST B-409] (1.3.132.0.37)
sect571k1 [NIST K-571] (1.3.132.0.38)
sect571r1 [NIST B-571] (1.3.132.0.39)
X9.62 c2tnb191v1 (1.2.840.10045.3.0.5)
X9.62 c2tnb191v2 (1.2.840.10045.3.0.6)
X9.62 c2tnb191v3 (1.2.840.10045.3.0.7)
X9.62 c2tnb239v1 (1.2.840.10045.3.0.11)
X9.62 c2tnb239v2 (1.2.840.10045.3.0.12)
X9.62 c2tnb239v3 (1.2.840.10045.3.0.13)
X9.62 c2tnb359v1 (1.2.840.10045.3.0.18)
X9.62 c2tnb431r1 (1.2.840.10045.3.0.20)

【讨论】:

    【解决方案3】:

    来自ECGenParameterSpec 构造函数的文档:

    ...有关支持的名称列表,请参阅将使用其实现的提供者的文档。

    所以(部分)您的问题的答案是,您必须知道您传递的名称受到您将使用的任何实现的支持。


    至于列举各种算法,相信你追求的是java.security.Security.getProviders(String filter)

    public static Provider[] getProviders(String filter) ...

    返回一个数组,其中包含所有满足指定选择标准的已安装提供程序,如果没有安装此类提供程序,则返回 null。 ...

    另见Java Security Standard Algorithm Names Specification


    对于ECGenParameterSpec,它唯一的内部成员是您传递给它的单个String 对象。那是怎么回事?好吧,它实现了AlgorithmParameterSpec,它(来自文档):

    ... 这个接口不包含任何方法或常量。它的唯一目的是对所有参数规范进行分组(并提供类型安全性)。所有参数规范都必须实现这个接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多