Интернет магазин китайских планшетных компьютеров



Компьютеры - RSASSA-PSS

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
  • emLen = \lceil emBits/8 \rceil
  • zBits = 8emLen — emBits

В данной статье под «старший байт» понимается самый первый, левый байт. Под «младший байт» соответственно понимается самый последний, правый байт.
Также под «строка» следует понимать некий массив, элементами которого являются одиночные байты. Таким образом «строковым представлением числа n» является строка N, полученная разбиением двоичной записи n на байты. Например:

n = 258 {100000010}
N = {00000001|00000010}

При этом - старший байт, а - младший байт.
Далее описаны функции создания и верификации электронной подписи.

Создание подписи


RSASSA-PSS-Sign, M)

Входные данные:
— закрытый ключ
M — подписываемое сообщение, строка
Выходные данные:
S — подпись, строка длины k
Возможные ошибки:
"сообщение слишком длинное"; «ошибка кодирования»
Последовательность действий:
  1. PSS-кодирование:
    Применим функцию PSS-Encode к строке M для получения строки EM длины x.
    EM такова, что длина в битах целочисленного представления EM не превышает emBits, и zBits старших бит равны 0.
    EM = PSS-Encode
    Заметим, что длина EM равна, если emBits делится на 8 без остатка, и равна k в противном случае.
    Если PSS-encoding возвращает ошибку «сообщение слишком длинное», выводится сообщение об ошибке и работа прекращается.
    Если PSS-encoding возвращает ошибку «ошибка кодирования», выводится сообщение об ошибке и работа прекращается.
  2. RSA-подпись:
    • Присвоим m целочисленное представление строки EM.
    m = str-to-int
    • Используем закрытый ключ.
    s = m mod n
    • Представим m, как байтовую строку длины k.
    S = int-to-str
  3. Вывод S

PSS-кодирование

PSS-Encode

Опции:
Hash — хэш-функция, возвращает байтовую строку длины hLen
MGF — mask generation function. Преобразует входную байтовую строку в строку заданной длины.
sLen — длина байтовой строки salt
Входные данные:
M — подписываемое сообщение, строка
emBits — максимальная длина в битах целочисленного представления выходной строки EM, по меньшей мере
PSS-Encode
Выходные данные:
EM — закодированное сообщение, строка длины emLen
Возможные ошибки:
«сообщение слишком длинное»; «ошибка кодирования»
Последовательность действий:
  1. Если длина M больше максимально возможной длины входной строки выбранной хэш-функции, возвращается сообщение «сообщение слишком длинное» и работа прекращается.
  2. mHash = Hash, строка длины hLen.
  3. Если emLen <, возвращается сообщение «ошибка кодирования» и работа прекращается.
  4. Генерируется случайная строка salt длины sLen; если sLen = 0, salt — пустая строка.
  5. M’ =00 00 00 00 00 00 00 00||mHash||salt, строка длины, первые 8 байт которой — нулевые.
  6. H = Hash, строка длины hLen.
  7. Генерируется строка PS состоящая из нулевых байтов. Длина PS может оказаться равной нулю.
  8. DB = PS||0x01||salt, строка длины.
  9. dbMask = MGF, строка длины.
  10. maskedDB = DB ⊕ dbMask.
  11. zBits старших бит в старшем байте maskedDB устанавливаются в 0.
  12. TF = 0xBC.
  13. EM = maskedDB||H||TF
  14. Вывод EM.


Верификация подписи


RSASSA-PSS-Verify, M, S)

Входные данные:
— открытый ключ
M — полученное сообщение, строка
S — подпись, подлежащая проверке, строка длины k
Выходные данные:
"подпись действительна" или «подпись недействительна»
Последовательность действий:
  1. Проверка длины:
    Если длина подписи S больше k байт, то выносится решение «подпись недействительна», и работа прекращается.
  2. RSA-проверка:
    • Присвоим m целочисленное представление строки S.
    m = str-to-int
    • Используем открытый ключ.
    s = m mod n
    • Представим m, как байтовую строку длины emLen.
    EM = int-to-str
    Заметим, что emLen равна, если emBits делится на 8 без остатка и равна k в противном случае. Если же запись числа m занимает больше emLen байт, то выносится решение «подпись недействительна», и работа прекращается.
  3. 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, по меньшей мере.
Выходные данные:
"подпись действительна" или «подпись недействительна»
Последовательность действий:
  1. Если длина M больше максимально возможной длины входной строки выбранной хэш-функции, выносится решение «подпись недействительна» и работа прекращается.
  2. mHash = Hash, строка длины hLen.
  3. Если emLen <, выносится решение «подпись недействительна» и работа прекращается.
  4. Если младший байт EM не равен 0xBC, то выносится решение «подпись недействительна» и работа прекращается.
  5. Старшие байт EM записываются в строку maskedDB, а последующие hLen байт — в строку H.
  6. Если старшие zBits бит старшего байта maskedDB не нулевые, то выносится решение «подпись недействительна» и работа прекращается.
  7. dbMask = MGF, строка длины.
  8. DB = maskedDB ⊕ dbMask.
  9. zBits старших бит в старшем байте DB устанавливаются в 0.
  10. Если старшие байт DB не равны 0 или если, последующий байт, приняв позицию старшего байта равной 1) не равен 0x01, то выносится решение «подпись недействительна» и работа прекращается.
  11. В байтовую строку salt записываются последние sLen байт DB.
  12. M’ =00 00 00 00 00 00 00 00||mHash||salt, строка длины, первые 8 байт которой — нулевые.
  13. H' = Hash, строка длины hLen.
  14. Если H = H', то выносится решение «подпись действительна», иначе выносится решение «подпись недействительна».


Mask Generation Function


Опишем MGF, используемую в PSS-функциях.
MGF принимает на вход байтовую строку произвольной длины и желаемую длину выходной строки и выдаёт байтовую строку желаемой длины. На длины входной и выходной строк могут накладываться ограничения, но они обычно очень велики. MGF детерминирована; выходная строка полностью определяется входной строкой. Выходные данные MGF должны быть псевдослучайными, т.е. зная часть выходной строки, должно быть практичеки невозможно предугадать оставшуюся часть выходной строки. Этого можно добиться, положив в основу MGF хэш-функцию с аналогичным свойством. Данное свойство необходимо, т.к. на него полагается доказательство надёжности алгоритма.
В стандарте PKCS #1 v2.1 в качестве MGF предлагается использовать следующую функцию:

MGF1

Опции:
Hash — хэш-функция, возвращает байтовую строку длины hLen.
Входные данные:
M — преобразуемая строка.
maskLen — требуемая длина выходной байтовой строки, не превышает 2hLen.
Выходные данные:
mask — строка длины maskLen.
Возможные ошибки:
«длина маски слишком велика»
Последовательность действий:
  1. Если maskLen > 2hLen, выводится сообщение «длина маски слишком велика» и работа прекращается.
  2. Пусть T — пустая строка.
  3. В цикле ДЛЯ i ОТ 0 ДО \lceil maskLen/hLen \rceil - 1 ВЫПОЛНЯЕТСЯ:
    • Представим i как байтовую строку C длины 4 байта.
    C = int-to-str
    • M' = M||C.
    • Допишем в конец строки T результат хэширования M'.
    T = T||Hash
  4. Запишем в mask старшие maskLen байт строки T.
  5. Вывод 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


<<< Закрытый ключ