Botan Загрузка существующего закрытого ключа RSA
Я использую библиотеку Botan C++ для подписи и проверки файла license.ini. Я настроил Botan PK_Signer для работы с алгоритмом RSA для шифрования хэша, созданного с помощью PKCS v1.5. Это мой код:
uint8_t private_key[] = "private key I already have generated."
// Read file content that needs to be signed.
std::string licensePath = argv[1];
std::string fileContents = readFileContent(licensePath);
// Prepare Botan RSA signer. PKCS1 v1.5 is used.
Botan::AutoSeeded_RNG rng;
Botan::secure_vector<uint8_t> secure_key_vector(private_key, private_key + sizeof(private_key) / sizeof(private_key[0]));
/////// NEXT LINE THROWS EXCEPTION!
Botan::RSA_PrivateKey rsa_priv_key(Botan::AlgorithmIdentifier(), secure_key_vector);
//////////////////////////////////////
Botan::PK_Signer signer(rsa_priv_key, rng, "EMSA-PKCS1-v1_5");
// Create signature.
signer.update(cleanStr(fileContents));
std::vector<uint8_t> signature = signer.signature(rng);
std::string hexSignature = Botan::hex_encode(signature);
Выделенная строка для генерации объекта RSA_PrivateKey выдает исключение:
Возникло исключение 0x00007FF85D2BC3C7 (vcruntime140.dll) в license_signer.exe: 0xC0000005: расположение чтения нарушения доступа 0x0000021A8FA07000.
Я никогда прежде не использовал библиотеку Botan. Если у кого-то есть идея, почему это происходит, или идея, как это реализовать, пожалуйста, помогите. Благодарю.
1 ответ
Использование Botan 2.12.1
#include <string>
#include <botan/auto_rng.h>
#include <botan/auto_rng.h>
#include <botan/base64.h>
#include <botan/pkcs8.h>
#include <botan/rsa.h>
#include <botan/x509_key.h>
#include <botan/data_src.h>
#include <botan/pubkey.h>
//Assuming the private and public keys are in Base64 encoded BER.
Botan::AutoSeeded_RNG rng;
Botan::RSA_PrivateKey keyPair(rng, static_cast<size_t>(4096));
std::string privateKey = Botan::base64_encode(Botan::PKCS8::BER_encode(keyPair));
std::string publicKey = Botan::base64_encode(Botan::X509::BER_encode(keyPair));
//Loading the public key
Botan::SecureVector<uint8_t> keyBytes(Botan::base64_decode(publicKey));
std::unique_ptr<Botan::Public_Key> pbk(Botan::X509::load_key(std::vector(keyBytes.begin(), keyBytes.end())));
//Loading the private key
Botan::SecureVector<uint8_t> keyBytes(Botan::base64_decode(privateKey));
Botan::DataSource_Memory source(keyBytes);
std::unique_ptr<Botan::Private_Key> pvk(Botan::PKCS8::load_key(source));
private_key
данные, поступающие в конструктор, который вы пытаетесь использовать, должны быть в кодировке DER. Убедитесь, что это так. В целом, однако, вам, вероятно, лучше использовать соответствующие loadKey
метод.