Конвертируйте код используя openssl для использования mbedtls - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь преобразовать некоторый код C, написанный для запуска на Mac, во встроенное устройство, которое не имеет библиотек шифрования.Код для Mac использует libcrypto.Я пытался собрать libcrypto из openssl для встроенного устройства, но получаю сотни ошибок из-за несоответствия прототипов указателей функций.openssl пронизан огромными макросами.В качестве альтернативы я сейчас пытаюсь использовать mbedtls, но я не смог заставить работать функцию расшифровки.

Код, который я пытаюсь перенести, немного странный.Он имеет то, что он называет открытым ключом и фактически вызывает RSA_public_encrypt() без дополнения для расшифровки данных.В качестве теста я изменил код Mac на RSA_public_decrypt(), и он сработал, поэтому я предполагаю, что ключ симметричный.Ключ, который он использует, выглядит следующим образом:

"-----BEGIN PUBLIC KEY-----\n"
5 lines of Base64 strings
"-----END PUBLIC KEY-----\n"

Для mbedtls я использую mbedtls_pk_parse_public_key() для анализа ключа.Если я проверю структуру ключа RSA низкого уровня после синтаксического анализа ключа, то будет 128-байтовый N-компонент и 16-байтовый E-компонент.Я получаю одинаковые данные ключа как с openssl, так и с mbedtls, поэтому кажется, что ключ проанализирован правильно.При дешифровании на Mac с RSA_public_decrypt() вход и выход составляют 128 байтов.Для mbedtls я вызываю mbedtls_pk_decrypt() для расшифровки, но когда я прослеживаю через код, он вызывает mbedtls_rsa_rsaes_pkcs1_v15_decrypt(), что заставляет заполнение быть 11 байтов.

Так что мои вопросы: 1) что именно "открытый »ключ содержит только N и E компоненты и не использует заполнение;2) Вызываю ли я правильную функцию расшифровки mbedtls?

РЕДАКТИРОВАТЬ: пробовал другой подход, и мой выходной буфер просто заполняется нулями.

mbedtls_rsa_context rsa;
mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0);
mbedtls_rsa_import_raw(&rsa, modulus, sizeof(modulus), NULL, 0, NULL, 0, NULL, 0, exp, sizeof(exp));
mbedtls_rsa_complete(&rsa);
mbedtls_rsa_public(&rsa, inBfr, outBfr);
mbedtls_rsa_free(&rsa);

РЕДАКТИРОВАТЬ 2: Моя конечная цель - встроенныйустройство с процессором ARM, но я тестировал на Windows, чтобы увидеть, будет ли работать mbedtls.Я начал с VS 2010, потому что именно это использовалось для проекта, над которым я работаю.Я переключился на VS 2015, и 2-й подход импорта необработанных данных ключа и вызова mbedtls_rsa_public() работал отлично.Я думаю, компилятор VS 2010 не достаточно хорош.Затем я перенес код в систему разработки для моего встроенного устройства, и это также сработало.

1 Ответ

2 голосов
/ 25 сентября 2019

Эквивалент OpenSSL RSA_public_encrypt(…, RSA_NO_PADDING) будет mbedtls_rsa_public.Функция mbedtls_pk_encrypt позволяет получить доступ только к механизмам шифрования на основе RSA (RSAES-PKCS1-v1_5 и RSAES-OAEP), а не необработанного примитива RSA («учебник RSA» или «RSA без заполнения»).

Вам нужно вызвать mbedtls_pk_parse_public_key для анализа ключа, затем получить указатель на объект ключа RSA с помощью mbedtls_pk_rsa и вызвать mbedtls_rsa_public с помощью этого объекта ключа RSA.

mbedtls_pk_context pk;
mbedtls_pk_init(&pk);
mbedtls_rsa_context *rsa = mbedtls_pk_rsa(&pk);
mbedtls_rsa_public(&rsa, inBfr, outBfr);
mbedtls_pk_free(&pk);

Я думаю, что это должно работать из вашего описания, но, очевидно, я не могу проверить это без примеров данных.

...