Я генерирую пару ключей ECDSA Prime256, используя OpenSSL с C ++, и пытаюсь импортировать шестнадцатеричную версию открытого ключа, используя Java.Я передаю байтовый массив, полученный из C ++, следующей функции в java, которая ожидает, что байтовый массив будет в кодированном формате X.509.
public static PublicKey getPublicKey(byte[] pk) throws NoSuchAlgorithmException, InvalidKeySpecException {
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pk);
KeyFactory kf = KeyFactory.getInstance(Constant.KEY_FACTORY_TYPE);
PublicKey pub = kf.generatePublic(publicKeySpec);
return pub;
}
Я создаю пару ключей эллиптической кривой, используя следующую функциюкоторый повторяет EC_KEY*
EC_KEY* generate_keypair() {
EC_KEY *eckey = EC_KEY_new();
EC_GROUP *ecgroup = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY_set_group(eckey, ecgroup);
EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE);
int kpGenerationStatus = EC_KEY_generate_key(eckey);
if (kpGenerationStatus) {
return eckey;
}
return nullptr;
}
Учитывая пару ключей, возвращенную вышеописанной функцией, я хочу экспортировать открытый ключ в формат ASN1.DER, который можно импортировать с помощью метода java, описанного выше.
Я преобразую открытый ключ типа EC_POINT*
в его шестнадцатеричную форму, используя EC_POINT_point2hex()
, выполнив следующее:
EC_GROUP *ecgroup = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY *keypair = generate_keypair();
char *result = NULL;
BN_CTX *ctx;
ctx = BN_CTX_new();
const EC_POINT *pub = EC_KEY_get0_public_key(keypair);
result = EC_POINT_point2hex(ecgroup, pub, POINT_CONVERSION_UNCOMPRESSED, ctx);
printf("%s\n", result);
, который возвращает следующее: 04F588CD1D7103A993D47E53D58C3F40BE8F570604CF2EA01A7657C1423EB19C51BC379F0BEE1FAA60BB9A07DE73EA9BEF7709C1C6429D4051B44F73A458FFB80D
Когда я проверяю это с помощью ASN.1 декодера , я вижу сообщение, которое говорит Length over 48 bits not supported at position 1
и пытается импортировать его, используя метод java, я получаю сообщение об ошибке:
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): Should use short form for length
Есть ли что-то, чего мне не хватает при экспорте открытого ключа из EC_POINT * в закодированную шестнадцатеричную строку X.509, которую я могу импортировать для проверки любых подписей?