Создание ECPublicKey из строки - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть нормальная строка, я кодирую ее с помощью класса Base64 из Java util и передаю его в конструктор ECPublicKey, но он не работает.Нужно ли кодировать в каком-то другом формате, чтобы передать его в конструктор ECPublicKey?

Я также пытался создать подход с использованием ключевых ключей, как показано ниже, кодировка obj - это строка в кодировке Base64 String

byte[] keyBytesPublic = Base64.getDecoder().decode(encodingObj);

X509EncodedKeySpec specPublic = new X509EncodedKeySpec(keyBytesPublic);

KeyFactory keyFactory = KeyFactory.getInstance("EC");
ECPublicKey public_key12 = (ECPublicKey) keyFactory.generatePublic(specPublic);

String obj = "{ "+
    "hello world "+
"}";

byte[] encodingObj = Base64.getEncoder().encode(obj.getBytes());
byte[] keyBytesPublic = Base64.getDecoder().decode(encodingObj);

Сначала попытался сгенерировать из ключа fatory

X509EncodedKeySpec specPublic = new X509EncodedKeySpec(keyBytesPublic);
KeyFactory keyFactory = KeyFactory.getInstance("EC");
ECPublicKey public_key12 = (ECPublicKey) keyFactory.generatePublic(specPublic);
PublicKey publicKey = keyFactory.generatePublic(specPublic);

или если я напрямую передал кодировку obj в конструктор

ECPublicKey publicKey1 = new ECPublicKeyImpl(encodingObj);

1 Ответ

0 голосов
/ 18 апреля 2019

Формат называется SubjectPublicKeyInfo, который является частью спецификаций X.509.Это кодированная структура ASN.1, которая также включает тип ключа.Внутренне у вас будет структура X9.63, кодирующая открытый ключ.Там у вас есть опции именованных кривых (где параметры кривой идентифицируются с использованием OID) или кривых, задающих все их параметры и несжатые или сжатые точки для публичной точки W.

Например, вы можете увидетьПример использования именованной кривой с OID и открытой несжатой точкой в этом другом вопросе я ответил :

> openssl asn1parse -i -in ecpub.der -inform DER -dump
0:d=0  hl=2 l=  89 cons: SEQUENCE          
2:d=1  hl=2 l=  19 cons:  SEQUENCE          
4:d=2  hl=2 l=   7 prim:   OBJECT            :id-ecPublicKey
13:d=2  hl=2 l=   8 prim:   OBJECT            :prime256v1
23:d=1  hl=2 l=  66 prim:  BIT STRING        
  0000 - 00 04 d0 ee 64 61 7b 90-48 a2 a9 5f b5 a3 da 67   ....da{.H.._...g
  0010 - 53 56 91 e0 cf 5b b8 85-3e 05 0c b9 e6 95 c3 8d   SV...[..>.......
  0020 - 26 ab d7 ee 47 94 38 61-1e cd 07 e6 90 0b 3d 4a   &...G.8a......=J
  0030 - 6a df c5 d5 9f f3 11 91-53 00 ff 0e 91 93 49 44   j.......S.....ID
  0040 - 4c 58

Обратите внимание, что я изменил строку, чтобы использовать DER, поскольку это то, что ожидает Java.Java не содержит анализатора PEM в общедоступном API, для этого вам придется использовать, например, Bouncy Castle.


Вы не должны генерировать ключ с использованием фабрики ключей с нуля, ключи являются частьюоткрытого / закрытого ключа пара .Для создания такой кодировки вы можете использовать следующий код (включая base64, если вам нужна строка):

KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC");
kpg.initialize(new ECGenParameterSpec("secp256r1"));
KeyPair kp = kpg.generateKeyPair();
ECPublicKey publicKey = (ECPublicKey) kp.getPublic();
System.out.println("Encoding format: " + publicKey.getFormat());
byte[] derEncoded = publicKey.getEncoded();
// base64 encoded is what you get for PEM, between the header and footer lines
String base64DEREncoded = Base64.getEncoder().encodeToString(derEncoded);
System.out.println("Base64 SubjectPublicKeyInfo: " + base64DEREncoded);

Результат:

Encoding format: X.509
Base64 SubjectPublicKeyInfo: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDA0qMRpJwaJyJ4YDciMqWefvr/mwYvF1fKnblJl5DOqAh5XUXkdWvYRDTTs9hPoHfPaNWWC9I0hOGb6+JPNxVw==

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

...