Конструкция бент-функции
Итак, разберем преобразование Уолша-Адамара. Для начала определим экспоненту булевой функции f:
exp(f) = (-1)f(x)
Очевидно, что при 0 экспонента принимает значение 1, а при 1 – значение (-1).
Определение. Преобразованием Уолша—Адамара булевой функции f от n переменных называется целочисленная функция Wf, заданная на множестве Zn2 равенством
Wf(v) = u Zn2 exp(<u,v>f(u))
В [5, глава 6, §6.5] и [6, глава 2, §2.3] описан алгоритм преобразования Уолша-Адамара 2-го рода:
Посчитать экспоненту булевой функции f.
Делим полученный вектор пополам.
Первую половину складываем со второй и записываем результат в первую половину нового столбца.
Из первой половины вычитаем вторую и записываем результат во вторую половину нового столбца.
Каждые половинки делим еще на две половины.
Повторяем шаги 3-5 до тех пор, пока каждый кусочек не будет состоять из одного элемента.
Таким образом, мы получили вектор после преобразования Уолша-Адамара 2-го рода. Теперь осталось только посчитать нелинейность.
Формула подсчета нелинейности имеет вид:
N(f) = 2n-1 – ½ * max( |Wf (v)| ) ,
где аVn , Wf (v) – значения элементов вектора, полученного после преобразования Уолша-Адамара 2-го рода. Она взята из [1, стр.10] и [2, глава 2, §2.2].
Докажем эту формулу. Вес Хэмминга функции f выглядит так:
wt(f)= x Zn2f(x)= x Zn2(1 - exp(f))/2
Очевидно, что x Zn2 exp(f)=Wf(). Тогда получаем wt(f)=2n−1 − Wf()/2. Из этого следует:
wt(f(x)<a,x>)=2n−1 −Wf(x)<a,x>()/2=2n−1− Wf(a)/2.
Аффинная функция g может задаваться либо g(x)=<a,x>, либо g(x)=<a,x>1. Посчитаем расстояние между функциями f и g в обоих случаях. В первом случае:
dist(f,g)=wt(f(x)<a,x>)=2n−1− Wf(a)/2.
Во втором случае:
dist(f,g)= wt(f(x)<a,x>1)=2n - wt(f(x)<a,x>)=2n−1+ Wf(a)/2.
Таким образом, минимальное расстояние от f до множества аффинных функций равно 2n-1 – ½ * max( |Wf (v)| ). Формула доказана.
Разберем этот алгоритм на примере 1, у которого n=3. Для начала посчитаем экспоненту.
-
f(x)
exp(f)
0
1
0
1
1
-1
1
-1
0
1
1
-1
1
-1
0
1
А теперь выполним преобразование Уолша-Адамара над полученным вектором.
-
1
1
-1
-1
1
-1
-1
1
2
0
-2
0
0
0
0
0
4
0
4
4
0
2
0
-2
0
0
0
0
0
4
4
-4
Как видно, max( |Wf (a)| ) = 4. Значит, нелинейность N(f) равна 2.
Для криптографических целей булева функция должна быть максимально нелинейной. Иначе говоря, она должна как можно меньше быть похожей на аффинную функцию.
Определение. Бент-функцией называется такая булева функция от n переменных (n четно), что модуль каждого коэффициента Уолша-Адамара этой функции равен 2n/2. Коэффициенты Уолша-Адамара – это значения вектора, полученного после преобразования Уолша-Адамара 2-го рода.
Теорема (Мэйоран—МакФарланд). Пусть T : Zn/22 → Zn/22 — любое взаимно однозначное отображение, h ∈ Fn/2 — произвольная функция. Тогда функция f ∈ Fn такая, что f(u’,u’’) = <u’,T(u’’)> h(u’’) является бент-функцией. Здесь введены следующие обозначения: Zn/22 – множество из n/2 аргументов, принимающие значения 0 и 1, Fn – множество булевых функций, u’, u’’ Zn/22 .
Эту теорему осуществляет программа meyoran-mcfarland. Опишем, как она действует. Теорема взята из [3, глава 1, §1.2].
Сначала генерируется случайная перестановка. Этот процесс основан на алгоритме Фишера-Йетса. Он выглядит следующим образом:
Число i идет по порядку от 1 до n, где n – число переменных (четное).
Генерируется случайное число в интервале [1 ; i] (назовем его k).
Меняем местами числа на местах i и k в массиве per, где per – это массив, перед выполнением цикла имеющий вид: <1, 2, 3, …, n>
Повторяем шаги 2,3 до тех пор, пока i не будет больше n.
Алгоритм описан в [4].
Случайная перестановка нам нужна для того, чтобы построить взаимно однозначное отображение Т. То есть благодаря перестановке можно поменять местами все аргументы отображения и записать их в значения.
Чтобы вывести все возможные аргументы функции f от n переменных, нужно перевести по порядку все числа от 0 до 2n-1 из десятичной системы счисления в двоичную. Этот процесс осуществляет процедура conversion.
А для создания значений функции h применяется обыкновенная генерация нулей и единиц, происходящая 2n/2 раз.
Далее действуем точно так же, как и сказано в условии теоремы. То есть сначала считаем скалярное произведение пары u’ и T(u’’), потом складываем полученное произведение и h(u’’) по модулю 2. Полученные значения являются значениями бент-функции f.
Разберем этот алгоритм на примере. Пусть n=4, тогда m=n/2=2. Допустим, что случайным образом сгенерировалась перестановка «2,4,3,1». С помощью этой перестановки меняем местами аргументы и записываем их в значения. То есть отображение Т получается следующим образом:
-
u’’
T(u’’)
00
01
01
11
10
10
11
00
Пусть также случайным образом сгенерировались значения функции h в таком виде:
-
u’’
h(u’’)
00
1
01
1
10
0
11
0
Далее действуем так, как сказано по условию теоремы. Возьмем, к примеру, аргумент функции f, равный 1011. Получается, что u’=10, u’’=11, T(u’’)=00, h(u’’)=0. Из этого следует, что
f(u’,u’’) = <u’,T(u’’)> h(u’’) = 1*0 0*0 0 = 0.
Таким образом, бент-функция f выглядит следующим образом:
-
u’,u’’
f(u’,u’’)
0000
1
0001
1
0010
0
0011
0
0100
0
0101
0
0110
0
0111
0
1000
1
1001
0
1010
1
1011
0
1100
0
1101
1
1110
1
1111
0
