В чем разница между различными типами заполнения в iOS? - PullRequest
14 голосов
/ 20 февраля 2011

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

  • 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() должен ли разработчик использовать kSecPaddingPKCS1 и выполнять заполнение ASN.1 самостоятельно? Требуется ли заполнение ASN.1 или его можно опустить?

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

1 Ответ

21 голосов
/ 21 февраля 2011

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 ||A ||H

Количество байтов значения 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, который вы пытаетесь использовать, кажется довольно низкоуровневым, и все это подозрительно выглядит так, как будто вы пытаетесь реализовать свой собственный криптографический протокол.вместо использования существующей библиотеки или фреймворка.)

...