В чем разница между различными типами отступов в iOS?

В iOS Certificate, Key, and Trust Services API содержит следующие типы заполнения:

  • kSecPaddingNone
  • kSecPaddingPKCS1
  • kSecPaddingPKCS1MD2
  • kSecPaddingPKCS1MD5
  • kSecPaddingPKCS1SHA1

Пользователь из списка рассылки Apple CDSA сообщает, что " kSecPaddingPKCS1 [...] такой же, как PKCS #1 1,5". Справочник по сертификатам, ключам и службам доверия аннотирует последние три типа заполнения (kSecPaddingPKCS1MD2, kSecPaddingPKCS1MD5 и kSecPaddingPKCS1SAH) словами «Будет выполнено стандартное заполнение ASN.1, а также заполнение PKCS1 базовой операции RSA».

  1. В чем разница с kSecPaddingPKCS1?
  2. Является ли kSecPaddingPKCS1 просто необработанным дополнением базовой операции RSA в соответствии с RFC 3447?
  3. Нужно ли разработчику при подписании дайджеста SHA-256, SHA-384 или SHA-512 использовать SecKeyRawSign() и выполнять заполнение ASN.1 самостоятельно? Необходимо ли заполнение ASN.1 или его можно опустить?

Любой намек, который указывает мне правильное направление, высоко ценится.


person mbinna    schedule 19.02.2011    source источник


Ответы (1)


PKCS#1 содержит два "отступа" для подписей с RSA, "новый" (называемый PSS, добавленный в версии 2.1) и «старый» (переименованный в «v1.5», так как он уже был в версии 1.5 PKCS#1). Мы говорим о дополнении v1.5.

Когда некоторые данные подписаны, они сначала хэшируются с помощью подходящей хеш-функции (например, SHA-1), затем хеш-значение (20 байт при использовании SHA-1) упаковывается в два последовательных слоя:

  1. Хэш-значение кодируется в структуру на основе ASN.1, которая также указывает, какая хеш-функция использовалась. На практике, если значение хеш-функции равно H, то первая упаковка приводит к последовательности байтов A || H, где "||" — это конкатенация, а "A" — заголовок, специфичный для хеш-функции (обычно от 15 до 20 байтов).

  2. "A || H" расширен несколькими дополнительными байтами:

0x00 0x01 0xFF 0xFF ... 0xFF 0x00 || А || Н

Количество байтов значения 0xFF регулируется таким образом, чтобы общий размер равнялся размеру модуля RSA (т. е. 128 байтов для 1024-битного ключа RSA).

Второй шаг — это то, что PKCS#1 называет «заполнением типа 1».

kSecPaddingPKCS1 означает, что функция выполняет только второй шаг: предполагается, что входные данные уже являются правильными "A || H". Обратите внимание, что SSL/TLS (до версии 1.1) использует вариант подписи, для которого требуется этот режим (нет " A", но есть две хеш-функции). При использовании kSecPaddingPKCS1SHA1 функция подписи ожидает хэш-значение в качестве входных данных и добавляет сам заголовок "A".

Для правильной, соответствующей стандартам подписи, которая может быть проверена сторонними реализациями, в какой-то момент должен быть добавлен заголовок "A". Вы можете добавить его самостоятельно и использовать kSecPaddingPKCS1 или использовать kSecpaddingPKCS1SHA1 и позволить движку добавить его самостоятельно, что, вероятно, менее подвержено ошибкам.

(По состоянию на 2011 год использование SHA-1 не рекомендуется; вам лучше переключиться на SHA-256 или SHA-512. Кроме того, API, который вы пытаетесь использовать, кажется довольно низкоуровневым, и все это подозрительно выглядит так, как будто вы пытаетесь реализовать свой собственный криптографический протокол вместо использования существующей библиотеки или фреймворка.)

person Thomas Pornin    schedule 21.02.2011
comment
Спасибо за этот отличный ответ! Я знаю, что это довольно низкий уровень. Я пишу свою дипломную работу о безопасности приложений iOS, и мне нужно немного углубиться в API безопасности. Я не реализую свой собственный криптографический протокол. Напомним, чтобы использовать, например. SHA-512 Я бы вычислил дайджест H и объединил его с заголовком из PKCS#1: SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 04 40 || H. Результат вместе с kSecPaddingPKCS1 является входом для SecKeyRawSign(). Это правильно? - person mbinna; 22.02.2011
comment
Круто, тогда на мой вопрос дан полный ответ. - person mbinna; 22.02.2011
comment
С 2011 года использование SHA-1 не рекомендуется. Не могли бы вы дать ссылку на статью, чтобы поддержать/объяснить это? - person lhunath; 04.03.2012
comment
@lhunath: см., например, специальную публикацию NIST 800 -107, в частности немного о том, что SHA-1 не следует использовать в каких-либо новых приложениях цифровой подписи, требующих не менее 80 бит безопасности. Кроме того, после конца 2010 года SHA-1 не должен использоваться ни в каких приложениях для цифровой подписи. В SHA-1 есть (пока теоретические) недостатки в отношении устойчивости к коллизиям, поэтому его использование официально не рекомендуется в новых приложениях (для совместимости с устаревшие приложения, он по-прежнему одобрен на языке NIST). - person Thomas Pornin; 05.03.2012
comment
как я могу использовать SecPadding.PKCS8, так как IOS не поддерживает это ??!! - person Abdulrahman Masoud; 28.11.2016