【问题标题】:How to use custom EC parameters with java.security.KeyPairGenerator?如何将自定义 EC 参数与 java.security.KeyPairGenerator 一起使用?
【发布时间】:2018-09-18 15:37:37
【问题描述】:

我想使用 Edwards 曲线“Curve41417”(safecurves) 生成密钥对。

现在我已经将其转换为 Weierstrass 格式并尝试了以下源代码:

public class Test {

    public static void main(String[] args) {

        try {
            KeyPairGenerator keyGen = null;
            keyGen = KeyPairGenerator.getInstance("ECDSA", "LunaProvider");

            // Create a secure random number generator using the SHA1PRNG algorithm
            SecureRandom secureRandomGenerator = SecureRandom.getInstance("SHA1PRNG");

            //generator with the given parameter set and source of randomness
            keyGen.initialize(curve41417InHex(),secureRandomGenerator);

            //keyGen.initialize(ecSpec);
            KeyPair keyPair = keyGen.generateKeyPair();

        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (InvalidAlgorithmParameterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static ECParameterSpec curve41417InHex(){
        ECPoint point = new ECPoint(
                // gx
                new BigInteger("36AF93BFF765C2150A948827D97CF68F5F83E0D0C7411AE313A89ABF50224BBAE8C2F76271040290884CF5629DAB279D49AB0F98",16),
                // gy
                new BigInteger("1952C13B138703B04EA0D313944A8B1E9AE7882380AD83907F12F2A937C2503ADA9E6BF01CA1F76FDF9032C79F130EB2BEA4C102",16));

        final ECParameterSpec curve41417 = new ECParameterSpec(

                new EllipticCurve(
                        // field the finite field that this elliptic curve is over.
                        new ECFieldFp(new BigInteger("3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF",16)),
                        // a : the first coefficient of this elliptic curve.
                        new BigInteger("3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD324",16),
                        // b : the second coefficient of this elliptic curve.
                        new BigInteger("3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC3EC75",16)
                        ),
                point,
                // Order n
                new BigInteger("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB3CC92414CF706022B36F1C0338AD63CF181B0E71A5E106AF79",16),
                // Cofactor
                8);
        return curve41417;
    } 

}

前面源代码的输出是: Exception during Key Generation - Unsupported curve: java.security.spec.ECParameterSpec@43814d18

我相信我在从 Montgomery 到 Weierstrass 方程的转换中做错了,或者我没有使用正确的类来提供自定义 EC 参数。

是否有人已经成功使用自定义 EC 参数生成密钥对?也许是另一个蒙哥马利或爱德华兹曲线?

【问题讨论】:

    标签: java elliptic-curve key-pair


    【解决方案1】:

    我相信不可能使用 Luna 的 JSP API 基于 LunaProvider 中的自定义 EC 曲线生成 EC 密钥对。但是,可以使用 JCProv API(由 Luna)生成 EC 密钥对。 JCProv - PKCS#11 Java Wrapper,它是接近 PKCS#11 实现的较低级别 API。您可以使用 CryptokiEx.C_GenerateKey(..) 方法生成密钥对。 PKSC#11 C_GenerateKey() 方法文档可以在here 找到。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 2017-11-09
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      相关资源
      最近更新 更多