|
|
29 мая 2011
Оглавление: 1. RSASSA-PSS 2. Особенности
RSASSA-PSS — асимметричный алгоритм цифровой подписи. Основан на принципе кодирования PSS, предложенном в 1996 году авторами Mihir Bellare и Phillip Rogaway. Внесён в стандарт PKCS #1 v2.1 от 2002 года, выработанный RSA Laboratories, США.
Описание алгоритма
Пусть Алиса хочет послать сообщение M Бобу, заверив его электронной подписью S. B, получив сообщение от A, должен верифицировать подпись.
- открытый ключ, и соответствующий закрытый ключ A. n целое положительное число длинной modBits бит или k байт.
- emBits = modBits 1
- zBits = 8emLen emBits
В данной статье под «старший байт» понимается самый первый, левый байт. Под «младший байт» соответственно понимается самый последний, правый байт.
Также под «строка» следует понимать некий массив, элементами которого являются одиночные байты. Таким образом «строковым представлением числа n» является строка N, полученная разбиением двоичной записи n на байты. Например:
- n = 258 {100000010}
- N = {00000001|00000010}
При этом - старший байт, а - младший байт.
Далее описаны функции создания и верификации электронной подписи.
Создание подписи
RSASSA-PSS-Sign, M)
- Входные данные:
- закрытый ключ
- M подписываемое сообщение, строка
- Выходные данные:
- S подпись, строка длины k
- Возможные ошибки:
- "сообщение слишком длинное"; «ошибка кодирования»
- Последовательность действий:
- PSS-кодирование:
- Применим функцию PSS-Encode к строке M для получения строки EM длины x.
- EM такова, что длина в битах целочисленного представления EM не превышает emBits, и zBits старших бит равны 0.
- EM = PSS-Encode
- Заметим, что длина EM равна, если emBits делится на 8 без остатка, и равна k в противном случае.
- Если PSS-encoding возвращает ошибку «сообщение слишком длинное», выводится сообщение об ошибке и работа прекращается.
- Если PSS-encoding возвращает ошибку «ошибка кодирования», выводится сообщение об ошибке и работа прекращается.
- RSA-подпись:
- Присвоим m целочисленное представление строки EM.
-
- m = str-to-int
- Используем закрытый ключ.
-
- s = m mod n
- Представим m, как байтовую строку длины k.
-
- S = int-to-str
- Вывод S
PSS-кодирование
PSS-Encode
- Опции:
- Hash хэш-функция, возвращает байтовую строку длины hLen
- MGF mask generation function. Преобразует входную байтовую строку в строку заданной длины.
- sLen длина байтовой строки salt
- Входные данные:
- M подписываемое сообщение, строка
- emBits максимальная длина в битах целочисленного представления выходной строки EM, по меньшей мере
PSS-Encode
- Выходные данные:
- EM закодированное сообщение, строка длины emLen
- Возможные ошибки:
- «сообщение слишком длинное»; «ошибка кодирования»
- Последовательность действий:
- Если длина M больше максимально возможной длины входной строки выбранной хэш-функции, возвращается сообщение «сообщение слишком длинное» и работа прекращается.
- mHash = Hash, строка длины hLen.
- Если emLen <, возвращается сообщение «ошибка кодирования» и работа прекращается.
- Генерируется случайная строка salt длины sLen; если sLen = 0, salt пустая строка.
- M’ =00 00 00 00 00 00 00 00||mHash||salt, строка длины, первые 8 байт которой нулевые.
- H = Hash, строка длины hLen.
- Генерируется строка PS состоящая из нулевых байтов. Длина PS может оказаться равной нулю.
- DB = PS||0x01||salt, строка длины.
- dbMask = MGF, строка длины.
- maskedDB = DB ⊕ dbMask.
- zBits старших бит в старшем байте maskedDB устанавливаются в 0.
- TF = 0xBC.
- EM = maskedDB||H||TF
- Вывод EM.
Верификация подписи
RSASSA-PSS-Verify, M, S)
- Входные данные:
- открытый ключ
- M полученное сообщение, строка
- S подпись, подлежащая проверке, строка длины k
- Выходные данные:
- "подпись действительна" или «подпись недействительна»
- Последовательность действий:
- Проверка длины:
- Если длина подписи S больше k байт, то выносится решение «подпись недействительна», и работа прекращается.
- RSA-проверка:
- Присвоим m целочисленное представление строки S.
-
- m = str-to-int
- Используем открытый ключ.
-
- s = m mod n
- Представим m, как байтовую строку длины emLen.
-
- EM = int-to-str
- Заметим, что emLen равна, если emBits делится на 8 без остатка и равна k в противном случае. Если же запись числа m занимает больше emLen байт, то выносится решение «подпись недействительна», и работа прекращается.
- PSS-проверка:
- Применим функцию PSS-Verify. Окончательное решение совпадает с решением, вынесенным PSS-Verify.
- Output = PSS-Verify
PSS-проверка
PSS-Verify
- Опции:
- Hash хэш-функция, возвращает байтовую строку длины hLen.
- MGF mask generation function. Преобразует входную байтовую строку в строку заданной длины.
- sLen длина байтовой строки salt.
- Входные данные:
- M полученное сообщение, строка.
PSS-Verify
- EM закодированное сообщение, строка длины emLen.
- emBits максимальная длина в битах целочисленного представления строки EM, по меньшей мере.
- Выходные данные:
- "подпись действительна" или «подпись недействительна»
- Последовательность действий:
- Если длина M больше максимально возможной длины входной строки выбранной хэш-функции, выносится решение «подпись недействительна» и работа прекращается.
- mHash = Hash, строка длины hLen.
- Если emLen <, выносится решение «подпись недействительна» и работа прекращается.
- Если младший байт EM не равен 0xBC, то выносится решение «подпись недействительна» и работа прекращается.
- Старшие байт EM записываются в строку maskedDB, а последующие hLen байт в строку H.
- Если старшие zBits бит старшего байта maskedDB не нулевые, то выносится решение «подпись недействительна» и работа прекращается.
- dbMask = MGF, строка длины.
- DB = maskedDB ⊕ dbMask.
- zBits старших бит в старшем байте DB устанавливаются в 0.
- Если старшие байт DB не равны 0 или если, последующий байт, приняв позицию старшего байта равной 1) не равен 0x01, то выносится решение «подпись недействительна» и работа прекращается.
- В байтовую строку salt записываются последние sLen байт DB.
- M’ =00 00 00 00 00 00 00 00||mHash||salt, строка длины, первые 8 байт которой нулевые.
- H' = Hash, строка длины hLen.
- Если H = H', то выносится решение «подпись действительна», иначе выносится решение «подпись недействительна».
Mask Generation Function
Опишем MGF, используемую в PSS-функциях.
MGF принимает на вход байтовую строку произвольной длины и желаемую длину выходной строки и выдаёт байтовую строку желаемой длины. На длины входной и выходной строк могут накладываться ограничения, но они обычно очень велики. MGF детерминирована; выходная строка полностью определяется входной строкой. Выходные данные MGF должны быть псевдослучайными, т.е. зная часть выходной строки, должно быть практичеки невозможно предугадать оставшуюся часть выходной строки. Этого можно добиться, положив в основу MGF хэш-функцию с аналогичным свойством. Данное свойство необходимо, т.к. на него полагается доказательство надёжности алгоритма.
В стандарте PKCS #1 v2.1 в качестве MGF предлагается использовать следующую функцию:
MGF1
- Опции:
- Hash хэш-функция, возвращает байтовую строку длины hLen.
- Входные данные:
- M преобразуемая строка.
- maskLen требуемая длина выходной байтовой строки, не превышает 2hLen.
- Выходные данные:
- mask строка длины maskLen.
- Возможные ошибки:
- «длина маски слишком велика»
- Последовательность действий:
- Если maskLen > 2hLen, выводится сообщение «длина маски слишком велика» и работа прекращается.
- Пусть T пустая строка.
- В цикле ДЛЯ i ОТ 0 ДО ВЫПОЛНЯЕТСЯ:
- Представим i как байтовую строку C длины 4 байта.
-
- C = int-to-str
- M' = M||C.
- Допишем в конец строки T результат хэширования M'.
-
- T = T||Hash
- Запишем в mask старшие maskLen байт строки T.
- Вывод mask.
Параметры
В стандарте PKCS #1 v2.1 RSASSA-PSS присвоен идентификатор id-RSASSA-PSS, с которым должна ассоциироваться последовательность четырёх параметров. К этим параметрам относятся хэш-функция, MGF, длина случайно генерируемой строки salt, trailerField. Значения по умолчанию этих параметров, приведённые в рассматриваемом стандарте, даны в таблице.
Праметр |
Тип |
Значение ао умолчанию |
hashAlgorithm |
HashAlgorithm |
sha1 |
maskGenAlgorithm |
MaskGenAlgorithm |
mgf1SHA1 |
saltLength |
INTEGER |
20 |
trailerField |
TrailerField |
trailerFieldBC |
- Рекомендуется, чтобы хэш-функция, на которой основана MGF совпадала с той, что задаётся параметром hashAlgorithm.
- Значение по умолчанию параметра saltLength равно длине выходной строки выбранной хэш-функции. В отличии от остальных параметров, saltLength не обязательно должна быть фиксированной для данной пары RSA-ключей.
- Поле TF введено для совместимости с проектом IEEE P1363a. В рассматриваемом стандарте поддерживается только значение trailerField равное 0xBC. Однако, оно может иметь и другой вид, например HID||0xCC, где HID идентификатор хэш-функции, указанный в стандарте ISO/IEC 10118.
Просмотров: 2018
|