Эллиптическая кривая с реализацией алгоритма цифровой подписи (ECDSA) на BouncyCastle

Я пытаюсь реализовать ECDSA (алгоритм цифровой подписи эллиптической кривой), но я не смог найти примеров в Java, которые используют Bouncy Castle. Я создал ключи, но я действительно не знаю, какие функции я должен использовать, чтобы создать подпись и проверить ее.

public static KeyPair GenerateKeys()
    throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException
{
    ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("B-571");
    KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
    g.initialize(ecSpec, new SecureRandom());
    return g.generateKeyPair();
}

3 ответов


owlstead правильно. И разработать немного больше, вы можете сделать это:

KeyPair pair = GenerateKeys();
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "BC");
ecdsaSign.initSign(pair.getPrivate());
ecdsaSign.update(plaintext.getBytes("UTF-8"));
byte[] signature = ecdsaSign.sign();

и проверить:

Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", "BC");
ecdsaVerify.initVerify(pair.getPublic());
ecdsaVerify.update(plaintext.getBytes("UTF-8"));
boolean result = ecdsaVerify.verify(signature);

после установки BouncyCastle-это провайдер: набор классов, который предоставляет некоторые криптографические функции, которые приложения должны использовать через общий API, с которым поставляется Java. Вижу Архитектура Криптографии Java, особенно раздел о подписях, чтобы увидеть, как генерировать или проверять подпись. В принципе, вы получаете java.security.Signature экземпляр (со статическим getInstance() метод), затем вы инициализируете его либо закрытым ключом (initSign(), чтобы создать подпись) или открытый ключ (initVerify(), для проверки подписи). Затем вы вводите данные сообщения с одним или несколькими update() звонки, и, наконец, вы звоните sign() или verify(), для создания или проверки подписи.


вы, кажется, используете надувной замок в основном в качестве поставщика. В этом случае вы можете просто использовать Signature.getInstance("SHA256withECDSA", "BC").