SFLASH

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Нет сносок SFLASH — асимметричный алгоритм цифровой подписи рекомендованный проектом NESSIE European в 2003 году. SFLASH основан на Matsumoto-Imai(MI) схеме, так же называемой C*. Алгоритм принадлежит к семейству многомерных схем с открытым ключом, то есть каждая подпись и каждый хеш сообщения представлен элементами конечного поля K. SFLASH был разработан для очень специфичных приложений, где затраты на классические алгоритмы (RSA, Elliptic Curves, DSA и другие) становятся чрезвычайно высокими: они очень медленные и имеют большой размер подписи. Таким образом SFLASH был создан, чтобы удовлетворять потребностям дешевых смарт-карт.

SFLASH гораздо быстрее и проще, чем RSA, как и в создании, так и в проверке (верификации) подписи.Шаблон:Нет АИ

Введение

Во всей статье будут использоваться следующие обозначения:

  1.  — определяет оператор конкатенации.
  2. [λ]rs — оператор, который определяется следующим образом: [λ]rs=(λr,λr+1,...,λs1,λs), где λ=(λ1,...,λm), а целые числа r и s должны удовлетворять: 0rsm.

Параметры алгоритма

Алгоритм SFLASH использует два определенных поля:

  1. K=F128 определяется как K=F2[X]/(X7+X+1). Определим π как биекцию между {0,1}7 и K как: b=(b0,...,b6){0,1}7,π(b)=(b6X6+...+b1X+b0)modX7+X+1
  2. Φ=K[X]/(x67+X5+X2+X+1). Определим φ как биекцию между K67 и Φ как: ω=(ω0,...,ω66)K67,φ(ω)=(ω66X66+...+ω1X+ω0)modX67+X5+X2+X+1
  3. Δ — 80 битная скрытая строка.

Так же алгоритм SFLASH использует две афинные биекции s и t из K67 в K67. Каждое из которых составляет скрытые линейные SL,TL (матрицы 67*67) и постоянные SC,TC(столбец 67*1) соответственно.

Открытые параметры

Открытый ключ заключается в функции G из K67 в K56 определенную как: G(X)=[t(φ1(F(φ(s(X)))))]0391

F — это функция из Φ в Φ определенная как AΦ,F(A)=A12833+1

Формирование ключа

Обозначим next_7bit_random_string строку из 7 бит, которая формируется путём вызова CSPRBG(Cryptographically Secure PseudoRandom Bit Generator) 7 раз. Сначала мы получаем первый бит строки, потом второй и так до седьмого.

1)Генерируем SL
Для генерации инвертированной 67x67 матрицы SL могут быть использованы два метода:
  • Будем заполнять матрицу по одному элементу до тех пор, пока не заполним всю матрицу:
for i=0 to 66 
    for j=0 to 66 
        S_L[i,j]=pi(next_7bit_random_string)
for i=0 to 66
    for j=0 to 66
    {
        if (i<j) then
                 {U_S[i,j]=pi(next_7bit_random_string); L_S[i,j]=0;};
        if (i>j) then
                 {L_S[i,j]=pi(next_7bit_random_string); U_S[i,j]=0;};
        if (i=j) then
                 {repeat (z=next_7bit_random_string)
                         until z!=(0,0,0,0,0,0,0);
                 U_S[i,j]=pi(z);
                 L_S[i,j]=1;};
    };
2)Генерируем SC
Используем CSPRBG для нахождения новых 67 элементов K(от верхней к нижней части столбца матрицы). Каждый элемент K находится с помощью функции:

π(next_7bit_random_string)

3)Генерируем TL
Аналогично как и матрицу SL.
4)Генерируем TC
Аналогично как и столбец SC.
5)Генерируем Δ
С помощью CSPRBG(Cryptographically Secure PseudoRandom Bit Generator) генерируем 80 случайных бит.

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

Пусть M — это наше сообщение, для которого мы хотим найти подпись S. Создание подписи S имеет следующий алгоритм:

Схема генерации подписи в алгоритме SFLASH

1) Пусть M0,M1,M2,M3 — это строки определяющиеся с помощью алгоритма криптографического хеширования SHA-1:

M0=SHA1(M),
M1=SHA1(M00x00),
M2=SHA1(M00x01),
M3=SHA1(M00x02),

2) Найдем V — 392 битную строку как:

V=[M1]0159[M2]0159[M3]071

3) Найдем W — 77 битную строку как:

W=[SHA1(VΔ)]076

4) Найдем Y — строку из 56 элементов K как:

Y=(π([V]06),π([V]713),...,π([V]385391))

5) Найдем R — строку из 11 элементов K как:

R=(π([W]06),π([W]713),...,π([W]7076))

6) Найдем B — элемент Φ как:

B=φ(t1(YR))

7) Найдем A — элемент Φ как:

A=F1(B), где F — функция из Φ в Φ определенная как: AΦ,F(A)=A12833+1

8) Найдем X=(X0,...,X66) — строка 67 элементов K:

X=(X0,...,X66)=s1(φ1(A))

9) Подпись S — 469 битная строка полученная как:

S=π1(X0)...π1(X66)

Проверка (верификация) подписи

Даны сообщение M (строка бит) и подпись S (256-битовая строка). Следующий алгоритм используется для определения валидности подписи S сообщения M:

Схема проверки(верификации) подписи в алгоритме SFLASH

1) Пусть M0,M1,M2,M3 — это строки определяющиеся с помощью алгоритма криптографического хеширования SHA-1:

M0=SHA1(M),
M1=SHA1(M00x00),
M2=SHA1(M00x01),
M3=SHA1(M00x02),

2) Найдем V — 392 битную строку как:

V=[M1]0159[M2]0159[M3]071

3) Найдем Y — строку из 56 элементов K как:

Y=(π([V]06),π([V]713),...,π([V]385391))

4) Найдем Y' — строку из 56 элементов K как:

Y=G(π([S]06),π([S]713),...,π([S]385391))

5) Сравниваем получившиеся строки Y и Y'. Если они равны, то подпись принимается, в противном случае — отклоняется.

Литература

Ссылки

Шаблон:Rq