Я пытаюсь, чтобы открытый ключ RSA расшифровал подписанный файл с помощью wolfcrypt — да, я могу или не могу злоупотреблять возможностью RSA «подписать / проверить» для шифрования отдельного ключа AES с использованием личного ключа и дешифрования с использованием открытого ключа.
К сожалению, я застрял в wc_RsaSSL_Verify () — из-за своей жизни я не могу понять, почему он возвращает BAD_FUNC_ARG — я подумал, что такая ошибка должна быть сразу видна кому-то другому, поэтому я решаю обратиться к коллективу полномочия StackOverflow.
Насколько я могу судить, я даю функции то, что она запрашивает — входной буфер, выходной буфер, размер каждого и указатель на структуру RsaKey. Вот фрагмент кода из рассматриваемой функции:
bool VerifyWorker::GetAESKey()
{
bool result = true;
uint8_t en_aes_file_buff[VerifyWorkerLocal::RSA_KEY_SIZE];
uint8_t de_aes_file_buff[VerifyWorkerLocal::RSA_KEY_SIZE];
uint8_t* aes_iv_ptr = NULL;
// keyfile filestream
std::fstream aes_file;
// rsa_key must be initialized
if(rsa_key == NULL)
{
result = false;
}
// Open the key file and read it into a local buffer, then decrypt it and use it to initialize the
// aes struct
if(result)
{
aes_file.open(this->aes_key_file, std::ios_base::in | std::ios_base::binary);
if(aes_file.fail())
{
// Unable to open file - perror?
perror("GetAESKey");
result = false;
}
else
{
aes_file.read(reinterpret_cast<char*>(en_aes_file_buff), VerifyWorkerLocal::RSA_KEY_SIZE + 1);
if(!aes_file.eof())
{
// we didn't have enough space to read the whole signature!
std::cerr << "aes_file read failed! " << aes_file.rdstate() << std::endl;
result = false;
}
}
}
// "Unsign" the aes key file with RSA verify, and load the aes struct with the result
if(result)
{
int wc_ret = 0;
wc_ret = wc_RsaSSL_Verify(const_cast<const byte*>(en_aes_file_buff),
VerifyWorkerLocal::RSA_KEY_SIZE, reinterpret_cast<byte*>(&de_aes_file_buff),
VerifyWorkerLocal::RSA_KEY_SIZE, rsa_key);
Rsa_key — это закрытый элемент, инициализированный (успешно с использованием wc_PublicKeyDecode ()) в отдельной функции с файлом DER открытого ключа. Я сгенерировал как открытый, так и закрытый ключ, используя OpenSSL — который должен правильно дополнить мой ключ AES и файл iv, используя PKCS # 1 v1.5 b по умолчанию.
Я должен также упомянуть, что я использую wolfssl версии 3.9.8. Спасибо!
Я обнаружил, что проблема заключалась в том, что файл, который я подписал своим ключом RSA, был подписан неправильно. Когда я подписал файл с использованием OpenSSL, мой вызов
openssl rsautl -in keyfile -out keyfile -inkey private.pem -sign
Очевидно, openssl не любит, когда вы указываете один и тот же файл для -in и -out. Когда я изменил что-то вроде
openssl rsautl -in keyfile -out keyfile_signed -inkey private.pem -sign
Я действительно смог проверить файл с помощью wc_RsaSSL_Verify.
Так что, как и большинство глупых проблем с программным обеспечением в последний вечер, я искал не в том месте. Я был немного сбит с толку возвращаемым BAD_FUNC_ARG и думал, что это связано с форматом аргументов функции, а не с их содержимым. Надеюсь, этот ответ будет полезен и для кого-то еще.
Похоже, вы пытаетесь использовать RSA_Sign для выполнения «шифрования» ключа AES. Затем я предполагаю, что вы отправляете удаленному партнеру или компьютеру, который затем запустит операцию RSA_Verify для расшифровки ключа AES, правильно ли я понимаю сценарий?
Если это так, я прошу прощения, он не обнаружился, если вы искали, как это сделать изначально, но у нас на самом деле есть пример сделать именно это здесь:
https://github.com/wolfSSL/wolfssl-examples/tree/master/signature/encryption-through-signing
Этот пример включает в себя два отдельных приложения. Первое приложение, rsa-private-encrypt-app.c, подпишет (зашифрует) «поддельный ключ Aes» и выведет результат в файл. Второе приложение, «rsa-public-decrypt-app.c», затем открывает файл, который был выведен, и выполняет проверку (дешифрование) данных, содержащихся в файле, для восстановления оригинального «поддельного ключа Aes».
Я могу или не могу злоупотреблять полномочиями RSA «подписывать / проверять» для шифрования отдельного ключа AES с использованием личного ключа и дешифрования с использованием открытого ключа.
Нет, совсем нет, это правильное использование RSA-подписи / проверки, ПРИМЕРЯ, что вы работаете с входами фиксированной длины, такими как ключ AES.
Вот почему мы создали пример! У нас на самом деле был пользователь, который недавно задал очень похожий вопрос на наших форумах, что привело нас к тому, что мы сделали пример.
Однако стоит обратить внимание на одну проблему, с которой вы столкнулись при работе с openssl и wolfssl, в README:
… Имейте в виду, что это не ИСТИННЫЙ RSA ENCRYPT и, скорее всего, не будет взаимодействовать с другими библиотеками, которые предлагают API типа RSA_PRIVATE_ENCRYPT.
Это настоящая операция SIGN.
Если у вас есть какие-либо вопросы, не стесняйтесь размещать их здесь (и, конечно, добавьте тег wolfssl), или вы также можете в любое время отправить нам электронное письмо на [email protected]
Отказ от ответственности: я работаю на wolfSSL Inc.