Подтвердить что ты не робот

SHA256withRSA, что он делает и в каком порядке?

Я новичок, когда дело доходит до криптографии и таких вещей. Я не (и не хочу) знать детали SHA256 и RSA. Я "знаю", что они делают, а не как они это делают, и на данный момент это достаточно.

Мне интересно, что такое "SHA256withRSA" -алгоритм (если вы можете это назвать) действительно делать и в каком порядке. Например, он hash данные с SHA256, а затем шифрует его с помощью RSA или это наоборот или что-то еще?

Причина, по которой я спрашиваю, заключается в том, что я хочу сделать эквивалент java:

Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey); //privateKey == a key extracted from a .p12 file

в Objective-C на iOS. И я не мог найти ничего, что делает именно это, поэтому я спрашиваю, могу ли я просто хэш-данные (SHA256), а затем зашифровать его (RSA) (или наоборот) и получить такое же поведение?

Каково предлагаемое решение для такого рода вещей?

Спасибо!

EDIT: Я не упомянул, что я подписываю данные с помощью закрытого ключа, который получается:

KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(new File(filename)), password.toCharArray());
PrivateKey privateKey = (PrivateKey)keystore.getKey(alias, password.toCharArray());

Где имя файла, например: "/somewhere/mykey.p12".

4b9b3361

Ответ 1

"SHA256withRSA" реализует дополнение и модульное возведение PKCS # 1 v1.5 с формальным именем RSASSA-PKCS1-v1_5 после вычисления хэш поверх данных с использованием SHA256.

Итак, общий порядок:

  • хеширования;
  • заполнение хеша для генерации подписи;
  • модульное возведение в степень с использованием частного показателя и модуля.

Отступы, используемые для генерации шифрования и подписи, различны, поэтому использование шифрования может привести к ошибочным подписям.


Схема заполнения PKCS # 1 v1.5 была заменена PSS. Для новых протоколов рекомендуется использовать схему PSS. Для RSA существует очень читаемый общедоступный стандарт. Этот стандарт также использовался в качестве базы для RFC 3447: Стандарты криптографии с открытым ключом (PKCS) # 1: Спецификации шифрования RSA Версия 2.1 ( который в основном является копией).


Что касается дополнения в iOS, пожалуйста, проверьте этот ответ Томасом Порнином. В основном вы должны создать хэш SHA-256, префикс статического блока данных (определенный в спецификациях PKCS # 1), затем используйте SecKeyRawSign с помощью kSecPaddingPKCS1.

Для вашего удобства, блок данных PKCS # 1, который должен быть префикс в шестнадцатеричной нотации для SHA-256 (его можно легко найти в стандартных документах, это в примечаниях раздел 9.2):

30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20

Примечания:

  • Вышеуказанные шаги не включают преобразование из байтов в целое и наоборот. Результат необработанных операций RSA, как правило, преобразуется в беззнаковое кодирование большого конца с одинаковым размером модуля в байтах (что обычно совпадает с размером ключа, так как размер ключа уже кратен 8). Эти преобразования называются I2OSP и OS2IP в RFC.