Эллиптическая кривая с реализацией алгоритма цифровой подписи (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")
.