Объект параметра BouncyCastle не является ECParameterSpec - PullRequest
0 голосов
/ 06 февраля 2019

Я использую EC для шифрования с использованием bouncycastle,

BC Jar: org.bouncycastle: bcprov-jdk15on: 1.59

и использую приведенный ниже код для инициализации KeyPairGenerator

ECNamedCurveParameterSpec parameterSpec
                    = ECNamedCurveTable.getParameterSpec("secp256k1");

System.out.println("Passing ParameterSpec => " + parameterSpec);
System.out.println("Is Instance of org.bouncycastle.jce.spec.ECParameterSpec => " + (parameterSpec instanceof ECParameterSpec));

KeyPairGenerator keyPairGenerator
                    = KeyPairGenerator.getInstance("ECDSA", "BC");
keyPairGenerator.initialize(parameterSpec);

Но это дает мне следующее исключение.

java.security.InvalidAlgorithmParameterException: parameter object not a ECParameterSpec
        at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi$EC.initialize(Unknown Source)
        at java.security.KeyPairGenerator.initialize(KeyPairGenerator.java:411)
        at io.gupshup.crypto.web.ECKeyGenerator.generateKeyPair(ECKeyGenerator.java:56)

Теперь код в BouncyCastleProvider проверяет экземпляр класса, который я выполнил перед инициализацией.Также я напечатал все классы, загруженные в процессе.Я не могу определить проблему с помощью моего кода.

Для справки это вывод sout и загрузчика классов.

[Loaded org.bouncycastle.util.Pack from file:/opt/tomcat0.8/webapps/inbox/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
Passing ParameterSpec => org.bouncycastle.jce.spec.ECNamedCurveParameterSpec@7e5f0eee
Is Instance of org.bouncycastle.jce.spec.ECParameterSpec => true
[Loaded org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi from file:/opt/tomcat0.8/webapps/channel/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
[Loaded org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi$EC from file:/opt/tomcat0.8/webapps/channel/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
[Loaded org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi$ECDSA from file:/opt/tomcat0.8/webapps/channel/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
[Loaded org.bouncycastle.crypto.KeyGenerationParameters from file:/opt/tomcat0.8/webapps/channel/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
[Loaded org.bouncycastle.crypto.params.ECKeyGenerationParameters from file:/opt/tomcat0.8/webapps/channel/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
[Loaded org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator from file:/opt/tomcat0.8/webapps/channel/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
[Loaded org.bouncycastle.crypto.generators.ECKeyPairGenerator from file:/opt/tomcat0.8/webapps/channel/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
[Loaded sun.reflect.GeneratedConstructorAccessor150 from __JVM_DefineClass__]
[Loaded sun.security.jca.JCAUtil from /usr/lib/jvm/jdk1.8.0_131/jre/lib/rt.jar]
[Loaded sun.security.jca.JCAUtil$CachedSecureRandomHolder from /usr/lib/jvm/jdk1.8.0_131/jre/lib/rt.jar]
[Loaded org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec from file:/opt/tomcat0.8/webapps/channel/WEB-INF/lib/bcprov-jdk15on-1.59.jar]
[Loaded java.lang.Throwable$WrappedPrintStream from /usr/lib/jvm/jdk1.8.0_131/jre/lib/rt.jar]

Пожалуйста, помогите мне так же, как и яЧтобы найти проблему, я попробовал тот же код в моей локальной установке, и все работает как надо.

Это код внутри SPI, который не работает по неизвестной причине.

if (params == null)
{
    ECParameterSpec implicitCA = configuration.getEcImplicitlyCa();
    if (implicitCA == null)
    {
        throw new InvalidAlgorithmParameterException("null parameter passed but no implicitCA set");
    }

    this.ecParams = null;
    this.param = createKeyGenParamsBC(implicitCA, random);
}
else if (params instanceof ECParameterSpec)
{
    this.ecParams = params;
    this.param = createKeyGenParamsBC((ECParameterSpec)params, random);
}
else if (params instanceof java.security.spec.ECParameterSpec)
{
    this.ecParams = params;
    this.param = createKeyGenParamsJCE((java.security.spec.ECParameterSpec)params, random);
}
else if (params instanceof ECGenParameterSpec)
{
    initializeNamedCurve(((ECGenParameterSpec)params).getName(), random);
}
else if (params instanceof ECNamedCurveGenParameterSpec)
{`initializeNamedCurve(((ECNamedCurveGenParameterSpec)params).getName(), random);`
}
else
{
    throw new InvalidAlgorithmParameterException("parameter object not a ECParameterSpec");
}

TIA

1 Ответ

0 голосов
/ 07 февраля 2019

Поставщик Bouncy Castle использует определенный JCA API для спецификаций параметров.Если вы хотите использовать названную кривую secp256k1, то вы должны указать его с помощью класса JCA ECGenParameterSpec

    Security.addProvider(new BouncyCastleProvider());

    ECGenParameterSpec namedParamSpec = new ECGenParameterSpec("secp256k1");
    KeyPairGenerator ecKPGen = KeyPairGenerator.getInstance("EC", "BC");
    ecKPGen.initialize(namedParamSpec);
    KeyPair ecKP = ecKPGen.generateKeyPair();

Конечно, если вам нужно Надувной замок для этого является дискуссионным, хотяновый код EC в Bouncy работает довольно хорошо.

В любом случае,

    ECGenParameterSpec namedParamSpec = new ECGenParameterSpec("secp256k1");
    KeyPairGenerator ecKPGen = KeyPairGenerator.getInstance("EC");
    ecKPGen.initialize(namedParamSpec);
    KeyPair ecKP = ecKPGen.generateKeyPair();

работает очень хорошо в моей системе.

...