как читать открытый ключ ECC, который был сгенерирован из java bouncycastle при использовании crypto++
Я создаю открытый ключ ECC из bouncycastle с помощью кода ниже:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");
keyPairGenerator.initialize(256, new SecureRandom());
KeyPair kp = keyPairGenerator.generateKeyPair();
PublicKey publicKey = kp.getPublic();
PrivateKey privateKey = kp.getPrivate();
String serverPublicKey = Base64.getEncoder().encodeToString(publicKey.getEncoded());
затем я копирую открытый ключ и читаю, используя приведенный ниже код в iOS:
NSString *publicKey = @"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWPSEiXPN274aQi0FyG39w05HUu/fVOMlH56SGvCGWRoQ0IcFxJTxBziTHLJ+OC3o+yl7P8h0oz/ChL15hfMbWA==";
StringSource ss(publicKey.UTF8String, true, new CryptoPP::Base64Decoder);
CryptoPP::ECIES<CryptoPP::ECP>::Encryptor encrypto;
encrypto.AccessKey().AccessGroupParameters().Initialize(ASN1::secp256r1());
//get point on the used curve
ECP::Point point;
encrypto.GetKey().GetGroupParameters().GetCurve().DecodePoint(point, ss7, (size_t)ss.MaxRetrievable());
cout << "X: " << std::hex << point.x << endl;
cout << "Y: " << std::hex << point.y << endl;
//set encryptor's public element
encrypto.AccessKey().SetPublicElement(point);
//check whether the encryptor's access key thus formed is valid or not
encrypto.AccessKey().ThrowIfInvalid(prng, 3);
PrintPublicKey(encrypto.GetKey());
Я получаю ошибку
libC++abi.dylib: завершается неперехваченным исключением типа CryptoPP::CryptoMaterial::InvalidMaterial: CryptoMaterial: этот объект содержит недопустимые значения
может ли кто-нибудь помочь мне в этом вопросе?
1 ответ
Вы должны использовать
ECGenParameterSpec
:
private KeyPair generateEcKeyPair() throws InvalidAlgorithmParameterException,
NoSuchProviderException, NoSuchAlgorithmException {
KeyPairGenerator kpgen = KeyPairGenerator.getInstance("EC", "BC");
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
kpgen.initialize(spec, new SecureRandom());
return kpgen.generateKeyPair();
}
Тогда ваш открытый ключ
generateEcKeyPair().getPublic()
.