Я использовал метод generateKeyPair()
для генерации 2 разных KeyPair
с использованием алгоритма ECDSA.ECDSA частные и открытые ключи - как получить SecretKey?
public KeyPair generateKeyPair(){
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp192r1");
KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
g.initialize(spec, new SecureRandom());
return g.generateKeyPair();
}
Тогда я использовал PrivateKey
и PublicKey
из отдельных KeyPair
, чтобы получить комбинированный SecretKey
:
private SecretKey generateSecretKey(PrivateKey privateKey, PublicKey publicKey) {
KeyAgreement ka = KeyAgreement.getInstance("ECDH");
ka.init(privateKey);
ka.doPhase(publicKey),
true);
return ka.generateSecret("AES");
}
Но я получаю в ka.generateSecret("AES")
:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at org.bouncycastle.jcajce.provider.asymmetric.util.BaseAgreementSpi.engineGenerateSecret(Unknown Source)
at javax.crypto.KeyAgreement.generateSecret(KeyAgreement.java:648)
Если я использую ECDSA, я получаю:
Exception in thread "main" java.security.NoSuchAlgorithmException: Algorithm ECDSA not available
at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:184)
Использование DH бросает:
Exception in thread "main" java.security.InvalidKeyException: DHKeyAgreement requires DHPrivateKey
at org.bouncycastle.jcajce.provider.asymmetric.dh.KeyAgreementSpi.engineInit(Unknown Source)
at javax.crypto.KeyAgreement.implInit(KeyAgreement.java:346)
at javax.crypto.KeyAgreement.chooseProvider(KeyAgreement.java:378)
at javax.crypto.KeyAgreement.init(KeyAgreement.java:470)
Как получить комбинированный SecretKey
от PrivateKey
и PublicKey
, которые генерируются с использованием алгоритма ECDSA?
Какой версии BouncyCastle вы используете? Также не используйте OpenJDK, поскольку он пропускает поддержку ECDSA в некоторых дистрибутивах Linux. – Robert
bcpkix-jdk15on 1.54. Он отлично подходит для подписывания и проверки в Windows и Linux. – Justas
Я не знаю BouncyCastle, но, глядя на ваш код, я замечаю пару вещей, которые могут вызвать проблему. Сначала похоже, что вы генерируете ключи ECDSA, но пытаетесь использовать их в соглашении с ключом DH - возможно, ключ - неправильный формат? Во-вторых, вам нужно предоставить детали кривой для объекта KeyAgreement? Я вижу, что он предоставляет [перегруженный метод 'init', который принимает' AlgorithmParameterSpec'] (https://docs.oracle.com/javase/8/docs/api/javax/crypto/KeyAgreement.html#init-java.security .KEY-java.security.spec.AlgorithmParameterSpec-). – matt