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

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

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

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

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

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

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

Спасибо!

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

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".


person Whyser    schedule 09.01.2014    source источник


Ответы (1)


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

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

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

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


Схема заполнения 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 обычно преобразуется в беззнаковое big endian кодирование с тем же размером модуля в байтах (который обычно совпадает с размером ключа, поскольку размер ключа уже кратен 8). Эти преобразования называются I2OSP и OS2IP в RFC.
person Maarten Bodewes    schedule 09.01.2014
comment
Спасибо за обстоятельный ответ! Я не упомянул, что файл, содержащий используемый закрытый ключ, является файлом .p12 и, насколько я понимаю, использует PKCS12, какая разница? (Я отредактирую свой вопрос, чтобы он содержал эту информацию) - person Whyser; 09.01.2014
comment
Формат контейнера не должен иметь значения для подписи, поэтому это дополнительный вопрос. Пожалуйста, проверьте, stackoverflow.com/questions/10025807/ содержит необходимую информацию. - person Maarten Bodewes; 09.01.2014
comment
Спасибо! Вы ответили на вопрос, который я задал, и примете ваш ответ. Ссылка, которую вы предоставили, мне немного помогла, но я все еще не понимаю, как использовать ключ в obj-c для подписи данных. Есть указатели? Или я должен начать новый вопрос? Еще раз спасибо! - person Whyser; 09.01.2014
comment
Разве возвращенная ссылка на ключ не является первым входом метода знака? Если это не так, то немного просмотрите доступный код. Конечно, вы всегда можете задать новый вопрос (хотя я не разработчик iOS, поэтому я не смогу ответить сам). - person Maarten Bodewes; 09.01.2014