PKCS#1 содержит два "отступа" для подписей с 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 || А || Н
Количество байтов значения 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