2011-05-12 4 views
2

Я делал несколько простых тестов с криптографией BouncyCastle и криптографией RSA. То, что я делаю, генерируя частный/открытый ключ пары, как так:Ошибка BouncyCastle: не удается распознать тип ключа в подписчике на основе ECDSA

KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "JsafeJCE"); 
kpg.initialize(new ECGenParameterSpec("secp384r1")); 
KeyPair kp = kpg.genKeyPair(); 
PrivateKey priv = kp.getPrivate(); 
PublicKey pub = kp.getPublic(); 

Затем я генерировать подпись, как так

Signature sig = Signature.getInstance("SHA384/ECDSA","BC"); 

, и я пытаюсь подписать секретный ключ:

sig.initSign(priv); 

Все это вызывает у меня ошибку:

java.security.InvalidKeyException: не удается распознать тип ключа в ECDSA основанный подписчик

Когда я до н.э. и JsafeJCE, я не получаю ошибки и все в порядке. Работает также, если оба провайдера являются BC. Так почему же я не могу подписать сгенерированный ключ JsafeJCE с BC lib?

ответ

2

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

+0

Что происходит, когда поставщик на другом конце отличается? Поэтому я работаю с существующим приложением, которое использует поставщика JsafeJCE. Я использую BC на моем конце. Смогут ли ВС правильно проверить все? – Otra

+0

Да, данные транспортируются с использованием независимых от поставщика стандартных форматов. –

3

я решил такую ​​же проблему, выполнив следующие действия:

1) Создание статического поставщика:

private static BouncyCastleProvider bouncyCastleProvider; 
public static final BouncyCastleProvider BOUNCY_CASTLE_PROVIDER = new BouncyCastleProvider(); 
static { 
    bouncyCastleProvider = BOUNCY_CASTLE_PROVIDER; 
} 

2) Генерировать KeyPair:

KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", bouncyCastleProvider); 
g.initialize(ecSpec, random); 
KeyPair keyPair = g.generateKeyPair(); 

3) Если вы хотите, чтобы подпишите что-нибудь с помощью ключа:

Signature signature = Signature.getInstance("SHA256withECDSA", bouncyCastleProvider); 
signature.initSign(privateKey); 
signature.update(signedData); 
signature.sign(); 

Это сработало для меня и, надеюсь, будет работать и на вас.

 Смежные вопросы

  • Нет связанных вопросов^_^