У меня есть следующий код, реализованный на Java. Метод принимает ключ в кодировке base64 PKCS8 в виде строки и выдает обратно секретный ключ RSA (это моя интерпретация, я новичок в крипто, поэтому, пожалуйста, потерпите меня)
public static PrivateKey getPrivateKey(final String
Base64EncodedPkcs8String) {
PKCS8EncodedKeySpec privateKeySpec = new
PKCS8EncodedKeySpec(Base64.decodeBase64(base64EncodedPkcs8String));
try {
return KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec);
}
catch (NoSuchAlgorithmException e) {
logger.error("NoSuchAlgorithmException", e);
return null;
}
catch (InvalidKeySpecException e) {
logger.error("InvalidKeySpecException", e);
return null;
}
}
Я пытаюсь сделать что-то подобное, используя OpenSSL:
EVP_PKEY* pPrivateKeyInfo = nullptr;
std::string copy = "\n"; //<-- I don't know if this is right
copy += strBase64EncodedPrivateKey;
copy += "\n"; //<-- or this
auto c_string = copy.c_str();
unsigned char* pszDecodedMessage = nullptr;
size_t stEncodedMessageLength{};
this->DecodeBase64Message(c_string, pszDecodedMessage, &stEncodedMessageLength);
auto pKeybio = BIO_new_mem_buf((void*)(pszDecodedMessage), -1);
if (nullptr == pKeybio)
{
return nullptr;
}
pPrivateKeyInfo = PEM_read_bio_PrivateKey(pKeybio, &pPrivateKeyInfo, nullptr, nullptr);
if (nullptr == pPrivateKeyInfo)
{
return nullptr;
}
Вызов PEM_read_bio_PrivateKey всегда терпит неудачу. Я также пытался использовать PEM_read_bio_PKCS8_PRIV_KEY_INFO, которая также не работает.
Кто-нибудь видит какие-либо явные проблемы с этим кодом? Есть лучший способ сделать это? (Проще?)