SFLASH

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

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

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

Введение

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

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

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

Алгоритм 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)))))]0→391

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=SHA−1(M),
M1=SHA−1(M0‖0x00),
M2=SHA−1(M0‖0x01),
M3=SHA−1(M0‖0x02),

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

V=[M1]0→159‖[M2]0→159‖[M3]0→71

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

W=[SHA−1(V‖Δ)]0→76

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

Y=(π([V]0→6),π([V]7→13),...,π([V]385→391))

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

R=(π([W]0→6),π([W]7→13),...,π([W]70→76))

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

B=φ(t−1(Y‖R))

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

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

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

X=(X0,...,X66)=s−1(φ−1(A))

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

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

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

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

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

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

M0=SHA−1(M),
M1=SHA−1(M0‖0x00),
M2=SHA−1(M0‖0x01),
M3=SHA−1(M0‖0x02),

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

V=[M1]0→159‖[M2]0→159‖[M3]0→71

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

Y=(π([V]0→6),π([V]7→13),...,π([V]385→391))

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

Y′=G(π([S]0→6),π([S]7→13),...,π([S]385→391))

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

Литература

Ссылки

Шаблон:Rq