Способ шифрования данных
DATA ENCRYPTION METHOD

Область техники, к которой относится изобретение
Предполагаемое изобретение относится к способам шифрования данных, в частности к блочному шифрованию данных с применением вычислительных платформ с SIMD-архитектурой.
Уровень техники
Шифрование является традиционным способом обеспечения конфиденциальности данных при их передаче и хранении. К одним из наиболее распространенных методов шифрования относятся алгоритмы, основанные на применении блочных шифров. Такие шифры оперируют фрагментами данных фиксированной длины - блоками, и сочетают в себе стойкость и высокую скорость работы.
Тенденция на увеличение объемов хранимой информации и скорости передаваемых данных требует от используемых блочных шифров высокой производительности. Эффективным методом увеличения быстродействия алгоритма шифрования является использование параллельных вычислений. Одним из способов организации параллельных вычислений в случае программной реализации алгоритма является использование SIMD-технологий, в основе которых лежит применение одной инструкции процессора для одновременной обработки нескольких фрагментов данных, предварительно размещенных на одном регистре.
SIMD-технологии получили широкое распространение и поддерживаются на большинстве современных вычислительных платформ, в том числе на процессорах общего назначения Intel и AMD. В настоящее время существует несколько типовых наборов SIMD-инструкций, каждый из которых предназначен для работы с регистрами определенной длины.
Применительно к программной реализации алгоритмов блочного шифрования, SIMD-технологии, как правило, используются для эффективной обработки сразу нескольких входных блоков данных. С помощью SIMD-технологий алгоритм шифрования, предназначенный для обработки одного блока, выполняют одновременно для нескольких блоков. Эффективность такого подхода напрямую зависит от возможности параллельного выполнения использующихся в алгоритме шифрования преобразований и операций, которая, в свою очередь, определяется наличием в вычислительной платформе соответствующих им SIMD-инструкций. В случае возможности распараллеливания каждой из операций такой подход позволяет выполнять обработку нескольких блоков данных за время, необходимое для обработки одного блока данных, то есть производительность алгоритма растет пропорциональному количеству одновременно обрабатываемых блоков. Поскольку число одновременно обрабатываемых блоков определяется длиной используемых регистров, производительность в этом случае растет пропорционально увеличению длины используемых регистров.
Национальный стандарт Российской Федерации ГОСТ Р 34.12-2015 специфицирует два блочных шифра: «Кузнечик» и «Магма» [1]. Для алгоритма шифрования «Магма» известен способ выполнения, допускающий эффективное применение SIMD-технологий в случае его программной реализации [2]. Под эффективностью здесь и далее будем подразумевать достаточно высокую скорость выполнения относительно других способов и пропорциональный рост производительности программных реализаций на основе способа при увеличении длины используемых регистров.
Рассмотрим существующие способы выполнения алгоритма зашифрования блочного шифра «Кузнечик». При описании преобразований шифра «Кузнечик» будем придерживаться обозначений, принятых в [1], опуская при этом, для простоты, вспомогательные преобразования, введенные для установления соответствия между двоичными строками, числами и элементами поля.
Известен способ выполнения алгоритма зашифрования блочного шифра «Кузнечик» в соответствии с его описанием в [1]. Недостатками способа являются низкая производительность алгоритма в случае его программного исполнения без использования SIMD-технологий, а также невозможность эффективного применения существующих SIMD-инструкций при реализации способа.
Известен способ выполнения алгоритма зашифрования блочного шифра «Кузнечик» на основе использования таблиц большого размера [3]. Все вычисления при использовании такого способа сводятся к операциям загрузки данных из больших таблиц и побитовому сложению двоичных строк. Способ обладает достаточно высокой скоростью работы в случае его программного исполнения даже без применения SIMD-технологий, а в случае их применения производительность способа может быть дополнительно увеличена.
Недостатком способа является неэффективность применения существующих SIMD-инструкций для параллельного выполнения операций загрузки данных из больших таблиц, что приводит к тому, что производительность реализаций на основе способа растет непропорционально увеличению длины используемых регистров.
Другим недостатком является потенциальная уязвимость программных реализаций на основе способа к атакам по времени обращения к кэш-памяти вычислительной платформы [4], что приводит к недопустимости применения этих реализаций в случае возможности осуществления такого рода атак.
8
8
Известен способ выполнения нелинейного преобразования алгоритма «Кузнечик», являющегося частью алгоритма зашифрования, основанный на декомпозиции этого преобразования [5]. Согласно данному способу, преобразование π: V→V, использующееся в блочном шифре «Кузнечик» для определения нелинейного преобразования [1], вычисляют следующим образом:
где
4
4
3
8
8
0
1
4
4
- операция умножения в поле GF(2)[Х]/(Х⊕X⊕1), а линейные преобразования α, ω вида V→V и нелинейные преобразования ν, ν, σ, φ, I вида V→V определены в [5].
4
4
Данный способ расширяет возможности применения SIMD-технологий в случае программной реализации преобразования π. В частности, он позволяет свести ряд вычислений к преобразованиям вида V→V, имеющим эффективную реализацию с помощью SIMD-технологий.
8
8
4
4
3
Недостатком способа является наличие преобразований вида V→V и операций умножения в поле GF(2)[Х]/(Х⊕X⊕1), имеющих относительно высокую сложность реализации в случае применения SIMD-технологий.
Наиболее близким к предлагаемому способу является способ выполнения алгоритма зашифрования блочного шифра «Кузнечик» с помощью слайсинг техники, представленный в [3]. Способ основан на применении преобразований, эквивалентных имеющимся в шифре, но обладающих при этом более эффективной реализацией с использованием SIMD-технологий.
Согласно данному способу, алгоритм зашифрования блочного шифра «Кузнечик» выполняют в соответствии с соотношениями, приведенными в [1]:
где
1
10
128
K, …, K∈V - итерационные ключи.
8
8
16
Вычисление преобразования :(V)→V основывают на алгоритме, приведенном в [1]:
8
8
7
6
где «⋅» - операция умножения в поле GF(2)[Х]/(Х⊕X⊕X⊕Х⊕1).
При этом для возможности эффективной реализации преобразования  с использованием SIMD-технологий в данный алгоритм вносят ряд изменений.
4
8
Для каждой константы const ∈ {1, 148, 32, 133, 16, 194, 192, 251} вводят преобразования вида V→V:
где
Операции умножения в поле, имеющиеся в (4), выполняют на основе преобразований из (5) и соотношений:
4
8
4
Эффективность использования преобразований из (5) обуславливается тем, что любое преобразование вида V→V может быть реализовано с помощью таблицы, состоящей из 2 элементов, длиной 8 бит каждый. Вычисление преобразования в этом случае сводится к загрузке выходного значения из таблицы по входному значению, используемому в качестве индекса для выбора соответствующего элемента таблицы. Преимуществом применения таблиц такого размера является возможность эффективного распараллеливания операции загрузки из этих таблиц при помощи существующих SIMD-инструкций. Данное замечание справедливо и для таблиц, состоящих из меньшего числа элементов и/или из элементов меньшей длины.
8
8
4
8
Вычисление преобразования π: V→V основывают на алгоритме, предложенном в [5] и описанном в (1). Для повышения эффективности реализации преобразования π с использованием SIMD-технологий вводят следующие преобразования вида V→V:
Преобразования α и ω выполняют на основе преобразований (8) и соотношений, справедливых в силу линейности α и ω:
0
1
0
1
0
1
4
4
4
8
Поскольку преобразования α, α, ω, ω, ν, ν, σ, φ, I имеют вид V→V, V→V, их вычисление может быть эффективно распараллелено при помощи существующих SIMD-инструкций по аналогии с преобразованиями (5).
Описанный способ принимается за прототип. Преимуществом способа является возможность эффективного применения существующих SIMD-инструкций для используемых операций, в том числе для загрузки данных из используемых таблиц. Это приводит к пропорциональному росту скорости программных реализаций на основе способа при увеличении длины используемых регистров.
Еще одним преимуществом способа является возможность получения на его основе программных реализаций, стойких к атакам по времени обращения к кэш-памяти вычислительной платформы, в силу задействования только малых по размеру вспомогательных таблиц.
4
4
3
Недостатком способа является его относительно невысокая производительность, обусловленная, в том числе, выполнением преобразования  без учета взаимосвязи между константными элементами поля, содержащимися в (4), а также необходимостью выполнения трудоемкой операции умножения в поле GF(2)[Х]/(Х⊕X⊕1) при вычислении преобразования π.
Раскрытие изобретения
Техническим результатом является повышение производительности процесса зашифрования.
При этом предлагаемый способ сохраняет возможность эффективного применения SIMD-технологий при его реализации, выражающуюся в пропорциональном росте производительности в случае увеличения длины используемых регистров, а также сохраняет возможность получения реализаций на основе способа, стойких к атакам по времени обращения к кэш-памяти вычислительной платформы.
1
2
s
Предлагаемый способ шифрования s сообщений m, m, …, m, представленных в двоичном виде и имеющих длину равную 128 бит каждый, где s=t⋅n, причем t, n - натуральные числа, реализуемый посредством вычислительной системы, имеющей процессор с SIMD-архитектурой, заключается в том, что
вычисляют
u=0;
ut+1
ut+2
ut+3
ut+t
128
(А) вычисляют параллельно с использованием SIMD-инструкций процессора значения c, c, c, …, c∈V:
где
128
128,
128
X[k]:V→V X[k](x)=k⊕x, причем k, x∈V;
128
128
S:V→V,  причем
i
8
x∈V, i=0, 1,…, 15;
128
128
128
16
L: V→V, L(x)=R(x), причем x∈V;
причем
i
8
x∈V, i=0, 1,…, 15;
1
10
128
K, …, K∈V - итерационные ключи;
p
V - множество всех двоичных строк длины р;
р - неотрицательное целое число;
8
8
причем для получения значения π(α)∈V, для произвольного a∈V, вычисляют
4
2
2
256
3
3
r=T(r)+T(r),
6
4
5
256
3
2
r=T(r)+T(r),
256
где «+» - операция сложения в кольце вычетов по модулю 256;
- операция побитового "И";
- операция побитового "И" с отрицанием одного из аргументов;
«⊕» - операция побитового сложения;
4
8
8
8
8
8
8
8
8
8
преобразование RSHIFT вида V→V преобразование CMPR вида V×V→V и преобразование BLEND вида V×V×V→V вычисляют в соответствии с соотношениями
i
1
где значения y∈V, i=0, 1, 2, 3,
i
1
значения x∈V, i=0, 1,…, 7,
1
8
1
2
3
4
4
4
0
1
1
5
6
4
8
где MSB: V→V,  преобразования T, Т, T вида V→V и преобразования α, α, T, T, T вида V→V вычисляют путем загрузки данных из вспомогательных таблиц, содержащих векторы значений этих преобразований:
0
α=(0, 112, 58, 74, 20, 100, 46, 94, 154, 234, 160, 208, 142, 254, 180, 196),
1
α=(0, 2, 17, 19, 116, 118, 101, 103, 24, 26, 9, 11, 108, 110, 125, 127),
1
Т=(32, 20, 48, 34, 36, 2, 54, 50, 0, 4, 38, 16, 18, 6, 22, 52),
2
Т=(0, 15, 14, 3, 13, 6, 2, 8, 12, 11, 5, 10, 1, 4, 7, 9),
3
Т=(0, 15, 1, 12, 2, 9, 13, 7, 3, 4, 10, 5, 14, 11, 8, 6),
4
Т=(14, 8, 5, 14, 2, 13, 9, 1, 3, 5, 3, 5, 12, 13, 12, 15),
5
Т=(52, 22, 0, 4, 20, 54, 50, 16, 48, 38, 34, 32, 2, 18, 6, 36),
6
Т=(220, 0, 152, 147, 153, 146, 215, 78, 214, 11, 69, 1, 68, 10, 79, 221),
где векторы значений приведены в виде
ƒ=(ƒ(0), ƒ(1), …, ƒ(15)),
4
где ƒ - произвольное преобразование, множеством входных аргументов которого является V;
для получения значения  для произвольных
15
14
0
8
а, а, …, а∈V, вычисляют
1
3
13
t=а⊕а,
2=
8
256
8
tа+a,
3
1
15
1
2
2
8
t=a⊕a⊕t⊕BLEND(t, t⊕195, a),
4
2
14
t=a⊕a,
5
4
256
4
t=t+t,
6
5
5
4
1
4
12
8
t=BLEND(t, t⊕195, t)⊕t⊕a⊕a⊕a,
7
6
10
t=a⊕a,
8
7
256
7
t=t+t,
9
5
11
7,
t=a⊕a⊕t
4
4
8
где преобразование LSHIFT вида V→V вычисляют в соответствии с соотношением
4
4
8
LSHIFT: V→V,
i
1
x∈V, i=0, 1, …, 3;
148,0
148,1
195,0
195,1
4
8
преобразования MULT, MULT, MULT, MULT вида V→V
вычисляют путем загрузки данных из вспомогательных таблиц, содержащих векторы значений этих преобразований:
148,0
MULT=(0, 148, 235, 127, 21, 129, 254, 106, 42, 190, 193, 85, 63, 171, 212, 64),
148,1
MULT=(0, 84, 168, 252, 147, 199, 59, 111, 229, 177, 77, 25, 118, 34, 222, 138),
195,0
MULT=(0, 195, 69, 134, 138, 73, 207, 12, 215, 20, 146, 81, 93, 158, 24, 219),
195,1
MULT=(0, 109, 218, 183, 119, 26, 173, 192, 238, 131, 52, 89, 153, 244, 67, 46),
где векторы значений приведены в виде
ƒ=(ƒ(0), ƒ(1), …, ƒ(15)),
4
где ƒ - произвольное преобразование, множеством входных аргументов которого является V;
вычисляют
u=u+1;
если u<n, то переходят к этапу (А);
i
получают зашифрованные сообщения c, i=1, 2, …, s.
Результат достигается за счет сведения базовых преобразований алгоритма зашифрования блочного шифра «Кузнечик» к эквивалентным преобразованиям, имеющим более эффективную реализацию с помощью существующих SIMD-инструкций, а также за счет учета особенностей базовых преобразований с целью минимизации количества требуемых для их выполнения операций.
Согласно предлагаемому способу, алгоритм зашифрования блочного шифра «Кузнечик» выполняют в соответствии с (2). Преобразования X, S, L вычисляют в соответствии с (3).
8
8
7
6
Рассмотрим способ выполнения преобразования  Заметим, что в силу свойства дистрибутивности операции умножения относительно сложения в поле GF(2)[X]/(X⊕X⊕XX⊕1), а также в силу равенств, справедливых
133⋅х=(1⊕16⊕148)⋅х=1⋅x⊕16⋅х⊕148⋅х,
32⋅х=(16⋅2)⋅х=16⋅(2⋅х),
251⋅х=(148⋅2⊕16)⋅х=148⋅(2⋅х)⊕16⋅х,
192⋅х=(194⊕2)⋅х=194⋅х⊕2⋅х,
194⋅х=(195⊕1)⋅х=195⋅х⊕1⋅х,
4
4
4
16⋅х=195⋅MSB(х)⊕LSHIFT(LSB(х)),
15
14
0
8
преобразование  для любых а, а, …, а∈V может быть вычислено следующим образом:
Для выполнения операций умножения в поле введем следующие преобразования:
где
1
8
1
i
1
MSB:V→V,  x∈V, i=0, 1, ..., 7
С учетом (10) и равенства
2⋅128=195,
8
8
7
6
где 2, 128, 195∈GF(2)[X]/(X⊕X⊕Х⊕X⊕1),
получаем, что
256
256
2⋅х=BLEND(x+х, (х+х)⊕195, х),
148,0
4
148,1
4
148⋅х=MULT(LSB(х))⊕MULT(MSB(х)),
195,0
4
195,1
4
195⋅х=MULT(LSB(x))⊕MULT(MSB(x)),
256
где «+» - операция сложения в кольце вычетов по модулю 256.
4
4
4
Для выполнения преобразования LSHIFT воспользуемся (6). Для выполнения преобразований MSB, LSB воспользуемся соотношениями
где  - операция побитового "И",
4
8
8
RSHIFT:V→V,
j
1
i
1
причем y∈V, i=0, 1, 2, 3 - не зависящие от x∈V, i=0, 1, …, 7 значения.
В результате способ вычисления преобразования  принимает следующий вид:
15
14
0
8
- на вход преобразованию  поступают значения а, a,…, а∈V;
- вычисляют значения
4
8
148,0
148,1
195,0
195,1
4
4
8
8
8
8
8
8
256
Предложенный способ позволяет вычислять преобразование  при помощи пяти преобразований вида V→V: MULT, MULT, MULT, MULT, LSHIFT; преобразования RSHIFT вида V→V; преобразования BLEND вида V×V×V→V; а также операций сложения в кольце вычетов по модулю 256 («+»), побитового "И" () и побитового сложения («⊕»).
148,0
148,1
195,0
195,1
Преобразования MULT, MULT, MULT, MULT могут быть вычислены с помощью вспомогательных таблиц, содержащих векторы значений этих преобразований:
148,0
MULT=(0, 148, 235, 127, 21, 129, 254, 106, 42, 190, 193, 85, 63, 171, 212, 64),
148,1
MULT=(0, 84, 168, 252, 147, 199, 59, 111, 229, 177, 77, 25, 118, 34, 222, 138),
195,0
MULT=(0, 195, 69, 134, 138, 73, 207, 12, 215, 20, 146, 81, 93, 158, 24, 219),
195,1
MULT=(0, 109, 218, 183, 119, 26, 173, 192, 238, 131, 52, 89, 153, 244, 67, 46),
где векторы значений получены из (10) и приведены в виде
ƒ=(ƒ(0), ƒ(1), …, ƒ(15)),
4
где ƒ - произвольное преобразование, множеством входных аргументов которого является V.
Рассмотрим способ выполнения преобразования π. Согласно [5], преобразование π может быть вычислено в соответствии с (1).
4
4
3
Для выполнения операции умножения в поле GF(2)[Х]/(Х⊕X⊕1) перейдем от векторного представления элементов поля к степенному представлению. Для этого введем преобразования:
4
4
3
где X=2 - элемент поля GF(2)[Х]/(Х⊕X⊕1), являющийся образующим элементом мультипликативной группы этого поля.
4
Тогда  y∈V, х≠0, у≠0:
С учетом (8), (9) и (13), а также соотношений
преобразование π может быть вычислено как
-1
-1
1
Перейдем от величины а' к величине а''=EXP(ν(a')). С учетом того, что
0
8
ω(σ(0))=220∈V,
получаем, что
Введем преобразования
Тогда
Для выполнения преобразования MOD заметим, что
4
256
, y∈V, х≠0, у≠0: LOG(х)+LOG(у)∈{2, 3,…,30},
8
4
256
4
=2, 3, …, 30∈V: MOD(х)=LSB(х+MSB(x))
4
4
Для выполнения преобразований α, LSB, MSB воспользуемся (9) и (11).
Для вычисления кусочно-заданных функций воспользуемся соотношениями:
где «¬» - операция побитового отрицания,
В результате, способ вычисления преобразования π принимает следующий вид:
8
- на вход преобразованию π поступает значение а∈V;
- вычисляют значения
4
4
2
3
4
4
8
0
1
1
5
6
4
8
8
8
8
8
8
8
8
8
256
Предложенный способ позволяет вычислять преобразование π при помощи трех преобразований вида V→V: Т, Т, Т; пяти преобразований вида V→V: α, α, T, Т, Т; преобразования RSHIFT вида V→V; преобразования CMPR вида V×V→V; преобразования BLEND вида V×V×V→V; а также операций сложения в кольце вычетов по модулю 256 («+»), побитового "И" (), побитового "И" с отрицанием одного из аргументов («х(¬у)») и побитового сложения («⊕»).
0
1
1
2
3
4
5
6
Преобразования α, α, T, Т, Т, Т, Т, Т могут быть вычислены с помощью вспомогательных таблиц, содержащих векторы значений этих преобразований:
0
α=(0, 112, 58, 74, 20, 100, 46, 94, 154, 234, 160, 208, 142, 254, 180, 196),
1
α=(0, 2, 17, 19, 116, 118, 101, 103, 24, 26, 9, 11, 108, 110, 125, 127),
1
T=(32, 20, 48, 34, 36, 2, 54, 50, 0, 4, 38, 16, 18, 6, 22, 52),
2
T=(0, 15, 14, 3, 13, 6, 2, 8, 12, 11, 5, 10, 1, 4, 7, 9),
3
T=(0, 15, 1, 12, 2, 9, 13, 7, 3, 4, 10, 5, 14, 11, 8, 6),
4
Т=(14, 8, 5, 14, 2, 13, 9, 1, 3, 5, 3, 5, 12, 13, 12, 15),
5
Т=(52, 22, 0, 4, 20, 54, 50, 16, 48, 38, 34, 32, 2, 18, 6, 36),
6
Т=(220, 0, 152, 147, 153, 146, 215, 78, 214, 11, 69, 1, 68, 10, 79, 221),
где векторы значений получены из формул (8), (14) и приведены в виде
ƒ=(ƒ(0), ƒ(1), …, ƒ(15)),
4
где ƒ - произвольное преобразование, множеством входных аргументов которого является V.
Итоговое количество преобразований и операций, необходимых для вычисления преобразований  и π предлагаемым способом, а также способом, выбранным в качестве прототипа, приведено в табл. 1. Для наглядности, однотипные преобразования, предполагающие одинаковый способ выполнения при реализации, например, использование вспомогательных таблиц, объединены в одной строке, при этом численные значения в соответствующей строке означают суммарное количество применений преобразований данного типа в конкретном способе.
4
4
3
Для возможности сравнения предлагаемого способа со способом, выбранным в качестве прототипа, используется следующий вариант выполнения умножения в поле GF(2)[Х]/(Х⊕X⊕1), допускающий применение SIMD-инструкций для каждой из имеющихся операций:
4
- на вход операции умножения поступают значения x, y∈V;
- вычисляют значения
где
1
2
3
4
8
LSHIFT, LSHIFT, LSHIFT:V→V,
i
1
x∈V, i=0, 1, 2, 3,
Тогда алгоритм вычисления преобразования π согласно способу, выбранному в качестве прототипа, принимает следующий вид:
8
- на вход преобразованию π поступает значение a∈V;
- вычисляют значения
4
4
3
причем умножение в поле GF(2)[X]/(X⊕X⊕1) выполняют описанным выше способом.
Преобразование  в прототипе выполняется в соответствии с (4), (5), (7).
Таким образом, практически по каждому типу преобразований и операций, использующемуся в прототипе, удается добиться существенного сокращения количества преобразований и операций этого типа в случае применения предлагаемого способа. При этом в предлагаемом способе появляется необходимость выполнения незначительного числа новых типов преобразований и операций, однако, малочисленность и эффективность этих операций позволяет утверждать, что негативный эффект от их введения значительно меньше позитивного эффекта от сокращения количества имеющихся в прототипе преобразований и операций.
В связи с тем, что предлагаемый способ и способ, выбранный в качестве прототипа, отличаются только в части вычисления преобразования  и π, а производительность выполнения этих преобразований выше в предлагаемом способе, общая производительность предлагаемого способа превосходит общую производительность прототипа. Следует отметить, что данное соотношение производительности способов справедливо как в случае обработки одного блока данных, так и в случае параллельной обработки нескольких блоков данных с помощью SIMD-инструкций.
При этом предлагаемый способ сохраняет важные свойства прототипа. Сохраняется пропорциональный рост скорости программных реализаций на основе способа при увеличении длины используемых регистров, поскольку все использующиеся в предлагаемом способе преобразования и операции эффективно распараллеливаются с помощью существующих SIMD-инструкций. Также сохраняется возможность получения на основе способа реализаций, стойких к атакам по времени обращения к кэш-памяти вычислительной платформы, поскольку в предлагаемом способе используются только малые по размеру вспомогательные таблицы и, как следствие, появляется возможность задействования только инструкций с фиксированным временем выполнения.
Осуществление изобретения
Для осуществления предложенного способа рассмотрим вариант его программной реализации на вычислительной платформе с SIMD-архитектурой.
В качестве вычислительной платформы с SIMD-архитектурой используем процессор общего назначения Intel Core i7-4700. Для повышения эффективности параллельных вычислений задействуем регистры максимальной для данной модели процессора длины - 256 бит. Для работы с этими регистрами используем SIMD-инструкций из наборов AVX и AVX2.
1
10
128
1
2
32
128
Рассмотрим пример одновременного зашифрования 32 блоков данных, длиной 128 бит каждый. Будем считать, что итерационные ключи K, …, K∈V уже вычислены и алгоритм зашифрования получает их на вход вместе с шифруемыми данными а, а, …, а∈V.
Для осуществления предложенного способа выполняют следующие предварительные процедуры:
148,0
148,1
195,0
195,1
0
1
1
2
3
4
5
6
- для каждого преобразования MULT, MULT, MULT, MULT, α, α, T, T, T, T, T, T формируют переменную длиной 256 бит, необходимую для табличного вычисления соответствующего преобразования, и
- побайтно заполняют младшие 128 бит каждой переменной элементами вектора значений соответствующего преобразования, причем в младшем (первом) байте размещают первый элемент вектора значений, во втором байте - второй элемент вектора значений и т.д.;
- заполняют старшие 128 бит переменной аналогично младшим 128 битам переменной;
- для константы mask формируют переменную длиной 256 бит и побайтно заполняют ее значениями константы mask;
- для итерационного ключа формируют переменную rk к длиной 256 бит;
1
2
16
- для данных формируют 16 переменных длиной 256 бит каждая: data, data, …, data, и
i
1
2
32
128
1
2
- побайтно заполняют переменную data, i=1, 2, …, 16, размещая в ней i-е байты каждого из 32 блоков а, а, …, а∈V: в младшем (первом) байте размещают i-й байт блока а, во втором байте размещают i-й байт блока а и т.д.
i
Для одновременного зашифрования блоков a, i=1, 2, …, 32, в соответствии с формулой:
K1, …, K10
128
128
E : V→V,
К1,…, K10
i
10
9
2
1
i
Е (a)=X[K]LSX[K]…LSX[K]LSX[K(a),
1
2
16
j
последовательно осуществляют изменение значений переменных data, data, …, data, соответствующее выполнению преобразований: X[K], j=1, 2, …, 10, L и S.
j
Для выполнения преобразования X[K], j=1, 2, …, 10: для каждого i=1, 2, …, 16
j
- побайтно заполняют переменную rk значениями i-го байта ключа K;
i
i
- вычисляют data:=data⊕rk.
Для выполнения линейного преобразования L: для каждого i=0, 1, …, 15 последовательно вычисляют
где  представляет собой параллельное применение преобразования  к j-м байтам аргументов  для получения j-го байта результата преобразования  j=1, 2, …, 32.
Преобразование  выполняют в соответствии (12), а параллельное применение  осуществляют с использованием следующих SIMD-инструкций:
148,0
148,1
195,0
195,1
- "vpshufb" для реализации преобразований MULT, MULT, MULT, MULT;
- "vpblendvb" для реализации преобразования BLEND;
4
- "vpsrlw" для реализации преобразования RSHIFT;
4
- "vpsllw" для реализации преобразования LSHIFT;
256
- "vpaddb" для реализации операции «+»;
- "vpand" для реализации операции
- "vpxor" для реализации операции «⊕».
148,0
148,1
195,0
195,1
При реализации преобразований MULT, MULT, MULT, MULT, и задействовании константы mask используют введенные для них переменные.
Для осуществления нелинейного преобразования S: для каждого i=1, 2, …, 16 вычисляют
i
i
data:=π'(data),
где π' представляет собой параллельное применение преобразования π к j-му байту аргумента π' для получения j-го байта результата π', j=1, 2, …, 32.
Преобразование π выполняют в соответствии с (15), а параллельное применение π осуществляют с использованием следующих SIMD-инструкций:
0
1
1
2
3
4
5
6
- "vpshufb" для реализации преобразований α, α, Т, Т, Т, Т, Т, Т;
- "vpblendvb" для реализации преобразования BLEND;
4
- "vpsrlw" для реализации преобразования RSHIFT;
- "vpcmpeqb" для реализации преобразования CMPR;
256
- "vpaddb" для реализации операции «+»;
- "vpand" для реализации операции
- "vpandn" для реализации операции
- "vpxor" для реализации операции «⊕».
0
1
1
2
3
4
5
6
При реализации преобразований α, α, Т, Т, Т, Т, Т, Т и задействовании константы mask используют введенные для них переменные.
1
2
32
128
1
2
16
1
2
16
i
1
2
16
1
2
Для получения зашифрованных блоков b, b, …, b∈V из итоговых значений переменных data, data, …, data, выполняют перекомпоновку байт, обратную той, что применялась при начальном заполнении переменных data, data, …, data, для чего побайтно заполняют блок b, i=1, 2, …, 32, размещая в нем i-e байты каждой из 16 переменных data, data, …, data, причем в младшем (первом) байте размещают i-й байт переменной data, во втором байте размещают i-й байт переменной data и т.д.
В случае необходимости применения алгоритма зашифрования к большему числу блоков данных выполняют разбиение всех входных блоков на группы, состоящие не более чем из 32 блоков, после чего обрабатывают каждую группу в отдельности. При этом, если обрабатываемая группа содержит менее 32 блоков, ее предварительно дополняют произвольными блоками в количестве, необходимом для получения 32 блоков в группе, а результат зашифрования добавленных блоков игнорируют.
Скорость описанной программной реализации алгоритма зашифрования блочного шифра «Кузнечик», основанной на предлагаемом способе, составляет 360 Мбайт/с при выполнении вычислений в одном потоке на одном ядре процессора Intel Core i7-4700. Программная реализация алгоритма зашифрования блочного шифра «Кузнечик», основанная на способе, выбранном в качестве прототипа, согласно [3], имеет скорость равную 300 Мбайт/с на аналогичной вычислительной платформе. Таким образом, прирост производительности предлагаемого способа относительно прототипа составляет порядка 20%.
Источники информации, принятые во внимание при составлении заявки
1. ГОСТ Р 34.12-2015. Информационная технология, Криптографическая защита информации, Блочные шифры. Москва, Стандартинформ, 2016.
2. Евразийский патент №021803, приоритет от 25.04.2012 г.
3. Rybkin A. S. On software implementation of Kuznyechik on Intel CPUs. Математические вопросы криптографии, 9:2 (2018), с. 117-127.
4. Bernstein D. J. Cache-timing attacks on AES. 2005 (статья по адресу: https://cr.yp.to/antiforgery/cachetiming-20050414.pdf).
5. Biryukov, A., Perrin, L., Udovenko, A. Reverse-engineering the S-box of Streebog, Kuznyechik and STRIBOBrl. In Annual International Conference on the Theory and Applications of Cryptographic Techniques (2016), 372-402, Springer, Berlin, Heidelberg.