P
Pecho
Доброго времени суток!
Пишу программу, реализующую сеть Фейстеля (3 итерации). Задание к программе требует, чтобы в функции преобразования преобразуемый подблок, после побитового сложения с ключём и преобразования с подстановками, умножался на матрицу.
Вот этот момент и вызывает ошибки и проблемы, прошу посмотреть листинг и помочь с умножением вектора на матрицу.
Привел фрагменты кода, касающиеся именно матриц. В задании даются матрицы размерности 32х32, но здесь для уменьшения размера кода привожу их как 8х8
Язык программирования - Си
Пишу программу, реализующую сеть Фейстеля (3 итерации). Задание к программе требует, чтобы в функции преобразования преобразуемый подблок, после побитового сложения с ключём и преобразования с подстановками, умножался на матрицу.
Вот этот момент и вызывает ошибки и проблемы, прошу посмотреть листинг и помочь с умножением вектора на матрицу.
Привел фрагменты кода, касающиеся именно матриц. В задании даются матрицы размерности 32х32, но здесь для уменьшения размера кода привожу их как 8х8
Язык программирования - Си
C++:
#include <stdio.h>
#include <string.h>
unsigned int L[3]; //массив для матриц
unsigned int vector[1][8]; //подблок, для перемножения на матрицу
unsigned int FuncPreobr(unsigned int SubBlok, unsigned int num)
//функция преобразования,
//SubBlok-поступивший на преобразование подблок,
//num - число итераций сетки Фейстеля, поступает из void Encrypt(), может быть 0,1,2
{
......
//умножение вектора на матрицы
int i;
for(i=0;i<8;i++) vector[0][i] = (SubBlok>>(7-i))&1;//побитно растаскиваем подблок в массив
vector *= L[num];
SubBlok=0;
for(i=0;i<8;i++) SubBlok ^= (vector[0][i]<<(7-i));//обратно
return SubBlok;
}
void Encrypt(unsigned char *l, unsigned char *r)//процедура шифрования
{
.......
}
int main(int argc, char** argv)//точка входа в программу
{
//Матрицы
unsigned int L1[8][8];
unsigned int L2[8][8];
unsigned int L3[8][8];
unsigned int l1[] = {0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,
0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1,0,0,0,0,0};
unsigned int l2[] = {0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,1,
0,1,1,1,1,0,1,0,0,1,1,1,1,1,0,0,1,0,1,0,0,0,0,1,0,1,0};
unsigned int l3[] = {0,0,0,1,1,1,0,0,1,1,0,0,0,1,1,0,1,0,0,1,0,1,1,1,0,1,1,0,1,0,0,1,1,1,1,0,0,
1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0};
int i,j;
for (i=0;i<8;i++)
for (j=0;j<8;j++)
{
L1[i][j]=*(l1+8*i+j);
L2[i][j]=*(l2+8*i+j);
L3[i][j]=*(l3+8*i+j);
}
L[0]=L1;
L[1]=L2;
L[2]=L3;
.........
}