Ответ 1
PKCS # 1 содержит два "paddings" для подписей с RSA, "новый" (называемый PSS, добавленный в версии 2.1) и "старый" (переименован "v1.5", поскольку он уже был в версии 1.5 PKCS # 1). Мы говорим о дополнении v1.5.
Когда некоторые данные подписаны, он сначала хэшируется с подходящей хеш-функцией (например, SHA-1), тогда хеш-значение (20 байтов при использовании SHA-1) завернуто в два последовательных слоя:
-
Хэш-значение кодируется в структуру на основе ASN.1, которая также указывает, какая хэш-функция была использована. На практике, если хеш-значение H, то первая упаковка приводит к последовательности байтов A || H, где "||" является конкатенацией, а "A" - это заголовок, который специфичен для хэш-функции (обычно от 15 до 20 байтов).
-
"A || H" расширяется с помощью дополнительных байтов:
0x00 0x01 0xFF 0xFF... 0xFF 0x00 || A || Н
Число байтов значения 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, который вы пытаетесь использовать, выглядит довольно низкоуровневым, и все подозрительно выглядит так, как будто вы привязываетесь к реализации собственного криптографического протокола вместо использования существующей библиотеки или фреймворка.)