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