Я использую MbedTLS в прошивке. Я успешно получил удаленный файл и его зашифрованный хэш, зашифрованный закрытым ключом (через OpenSSL). Я использовал mbedtls_sha256(), чтобы локально создать собственный хэш файла, а затем mbedtls_pk_verify() сравнить его с полученным зашифрованным хешем.
Однако функция mbedtls_pk_verify() терпит неудачу. Глядя на память с помощью отладчика, я вижу, что два хэша сами по себе совпадают, пока они приостановлены внутри mbedtls_pk_verify(), но я заметил, что есть много байтов, которые предшествуют одному хешу, которые отсутствуют в другом (расшифрованном) хэше. И я вижу, что mbedtls_pk_verify() пытается сравнить эти лишние байты...
Я обнаружил, что это, скорее всего, байты «OID», используемые для объявления алгоритма SHA-256. Есть ли способ автоматически добавить эти необходимые байты? В противном случае, каков обычный способ сделать то, что я хочу?
... в OpenSSL (и, предположительно, Libre и Boring) в исходном устаревшем RSA_{sign,verify} API он предоставляется напрямую, а более новый предпочтительный EVP_PKEY_{sign,verify}* API дополняется EVP_PKEY_CTX_{set,get}_signature_md или параметром 'digest' в EVP_PKEY_CTX_ctrl[_str]
@dave_thompson_085 Да, MbedTLS на стороне встроенной прошивки, похоже, выполняет метод подписи RSASSA-PKCS1v1_5, таким образом добавляя байты OID во время функции проверки к ожидаемому закодированному хешу (что-то вроде: 0x00 0x01 0xFF ... 0xFF 0x00 0x30 0x31 .. . [правильный, расшифрованный хеш], который соответствует описанию вашего URL). Итак, нужно ли мне каким-то образом добавлять эти байты OID к исходному дайджесту/хешированию прошивки OpenSSL перед ее отправкой на встроенное устройство - это типично?
«зашифровано с помощью закрытого ключа» — это нонсенс (но это абсурд, который сделали люди, так что вы вполне можете столкнуться с плохим протоколом). Вы можете использовать закрытый ключ для расшифровки или подписи, а открытый ключ — для шифрования или проверки. mbedtls_pk_verify хочет подпись PKCS#1v1.5, но то, что вы ему передаете, очевидно, не подпись. Каково содержимое данных, которые вы получаете после декодирования RSA (т. е. полный шестнадцатеричный дамп, заканчивающийся хешем)? Есть ли у вас код, который вызывает openssl для получения этих данных?
@Жиль, я узнаю больше по мере продвижения; Теперь я понимаю, что здесь задействована формализованная терминология. Я полагаю, что «подпись» в данном случае означает хэш, к которому добавлены байты заполнения и OID? Однако я бы сказал, что «зашифровать с помощью закрытого ключа» — это не нонсенс… Я могу «зашифровать хеш с помощью закрытого ключа» так же, как я мог бы зашифровать размер обуви моей бабушки, не так ли? Конечно, это не будут «подписи», поэтому mbedtls_pk_verify() меня подвел.
@Gilles Разница между шифрованием хеша и созданием правильной подписи заключается в том, где я заблудился (см. мой ответ).





Я обнаружил, что mbedtls_pk_verify() не удалось выполнить MbedTLS, потому что я использовал неправильную команду в OpenSSL для создания исходного зашифрованного хеша/подписи. Я использовал openssl dgst... когда мне нужно было использовать openssl sha256 -sign... Это добавляло необходимые байты (подписи), которые MbedTLS mbedtls_pk_verify() искал. Спасибо всем ответившим за то, что помогли мне разобраться.
К вашему сведению: openssl $hash -sign rsapriv или эквивалент openssl dgst -$hash -sign rsapriv — лучший способ, но openssl $hash -binary | openssl pkeyutl -sign -pkeyopt digest:$hash -inkey rsapriv также правильно выполняет PKCS1v1_5, а openssl $hash -binary | openssl rsautl -sign -inkey rsapriv — нет. Если бы вы включили это в свой вопрос, я бы сразу сказал вам.
@dave_thompson_085 Спасибо за ваши ответы. Я не знал, что мне нужно было включить это в свой первоначальный вопрос, поскольку я был новичком в этой сфере. Я винил свою прошивку, когда создал проблему еще на своем компьютере!
Это подпись RSASSA-PKCS1v1_5, также известная как RSA «классическая» или «устаревшая»? Здесь действительно используется заполнение, которое включает, но не только, OID используемого алгоритма хеширования; см. RFC8017 9.2 особенно примечание 1 на стр. 47. Я не знаю mbed, но был бы удивлен, если бы какая-либо криптобиблиотека за последние 40 лет не поддерживала эту схему подписи. Хотя я бы не ожидал этого при вызове хэша, потому что хеши используются во многих контекстах, отличных от подписей RSA-PKCS1v1_5. ...