Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何枚举Java中可用的所有椭圆曲线名称?_Java_Cryptography_Elliptic Curve - Fatal编程技术网

如何枚举Java中可用的所有椭圆曲线名称?

如何枚举Java中可用的所有椭圆曲线名称?,java,cryptography,elliptic-curve,Java,Cryptography,Elliptic Curve,是否有某种方法可以枚举所有可以指定给的椭圆曲线名称 建造师?或者你必须在墙上抛出一大串曲线名称,看看当你试图使用它们时,哪些会抛出异常,哪些不会抛出异常?来自构造器文档: 。。。有关受支持名称的列表,请参阅将使用其实现的提供商的文档 因此,您的问题(部分)的答案是,您必须知道您要传递的名称受您将要使用的任何实现的支持 至于列举各种算法,我相信你想要的是 公共静态提供程序[]获取提供程序(字符串筛选器) 返回一个数组,其中包含满足指定选择条件的所有已安装的提供程序,如果未安装此类提供程序,则返回

是否有某种方法可以枚举所有可以指定给的椭圆曲线名称 建造师?或者你必须在墙上抛出一大串曲线名称,看看当你试图使用它们时,哪些会抛出异常,哪些不会抛出异常?

来自构造器文档:

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

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


至于列举各种算法,我相信你想要的是

公共静态提供程序[]获取提供程序(字符串筛选器)

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

另见


至于,它唯一的内部成员是传递给它的单个
String
对象。那是怎么回事?嗯,它实现了(从文档中):

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


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

对于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);
    }
}
Security.getProviders("AlgorithmParameters.EC")[0]
    .getService("AlgorithmParameters", "EC").getAttribute("SupportedCurves");
这为您提供了完整的discolure:

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)

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

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);
    }
}
Security.getProviders("AlgorithmParameters.EC")[0]
    .getService("AlgorithmParameters", "EC").getAttribute("SupportedCurves");
在jshell中(采用OpenJDK 11.0.1):

然后可以解析这些条目


但是,现在还有-X25519和X448。据我所知,它们只能作为.

java.security.security.getAlgorithms()
-不知道如何区分哪些是椭圆曲线,尽管这比反射好得多,但不幸的是,您必须解析字符串描述才能找到单独的曲线。测试并使用Java8和Java11。