Java действительно делает криптографию очень длинной.
Процедура создания открытого ключа от заданной точки EC:
- Построить
ECPoint
объект из заданных координат.
- Построить объект
ECParameterSpec
с информацией о вашей кривой.
- Постройте объект
ECPublicKeySpec
от вашего ECPoint
и вашего ECParameterSpec
объекта.
- Вызов
KeyFactory.generatePublic()
с объектом ECPublicKeySpec
для извлечения объекта PublicKey
.
- При необходимости введите
PublicKey
в ECPublicKey
.
Пример ниже:
// Setup for P-256 curve params
BigInteger p256_p = new BigInteger("ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", 16);
BigInteger p256_a = new BigInteger("ffffffff00000001000000000000000000000000fffffffffffffffffffffffc", 16);
BigInteger p256_b = new BigInteger("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16);
byte[] p256_seed = {
(byte) 0xc4, (byte) 0x9d, (byte) 0x36, (byte) 0x08,
(byte) 0x86, (byte) 0xe7, (byte) 0x04, (byte) 0x93,
(byte) 0x6a, (byte) 0x66, (byte) 0x78, (byte) 0xe1,
(byte) 0x13, (byte) 0x9d, (byte) 0x26, (byte) 0xb7,
(byte) 0x81, (byte) 0x9f, (byte) 0x7e, (byte) 0x90
};
BigInteger p256_xg = new BigInteger("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", 16);
BigInteger p256_yg = new BigInteger("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", 16);
BigInteger p256_n = new BigInteger("ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", 16);
// Construct prime field
ECFieldFp p256_field = new ECFieldFp(p256_p);
// Construct curve from parameters
EllipticCurve p256 = new EllipticCurve(p256_field, p256_a, p256_b, p256_seed);
// Construct base point for curve
ECPoint p256_base = new ECPoint(p256_xg, p256_yg);
// Construct curve parameter specifications object
ECParameterSpec p256spec = new ECParameterSpec(p256, p256_base, p256_n, 1); // Co-factor 1 for prime curves
// ------------------------------------------------------------- //
// Construct EC point from "raw" public key
ECPoint point = new ECPoint(r, s); // r, s is of type BigInteger
// Create a EC public key specification object from point and curve
ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, p256spec);
// Retrieve EC KeyFactory
KeyFactory ECFactory = KeyFactory.getInstance("EC");
// Generate public key via KeyFactory
PublicKey pubKey = ECFactory.generatePublic(pubKeySpec);
ECPublicKey ECPubKey = (ECPublicKey) pubKey;
Это может быть полезно для генерации ECParameterSpec один раз (возможно, в статическом блоке инициализатора) для повышения производительности.
Примечание: возможно, существует гораздо более простой способ создания объекта ECParameterSpec (например, с помощью названных кривых), но до сих пор я обнаружил, что эта функция имеет ECGenParameterSpec
. Дайте мне знать в комментариях, если есть менее болезненный подход.
Чтобы спасти себя боль делать выше, закодировать ключ EC под X.509, который будет в полной мере описать ключ и производить загрузку его намного проще.
В java, с ECPublicKey, все, что вам нужно сделать, это позвонить ECPublicKey.getEncoded()
и передать/сохранить массив байтов туда, где вам нужен следующий ключ. Х.509 закодирован ключ может быть восстановлен с помощью:
// Retrieve EC KeyFactory
KeyFactory ECFactory = KeyFactory.getInstance("EC");
// Generate public key via KeyFactory
PublicKey pubKey = ECFactory.generatePublic(new X509EncodedKeySpec(data));
ECPublicKey ECPubKey = (ECPublicKey) pubKey;
, где «данные» является закодированной массив байт.
Каков формат вашего EC Public Key? Сжатый или несжатый? –
64 байта? Очевидно, не сжимается. Это было бы 33 байта, если бы оно было сжато. –
Исправить. Он несжатый. – user1094206