Произведение вектора и матрицы. Шифрование. Си

  • Автор темы Pecho
  • Дата начала
P

Pecho

#1
Доброго времени суток!
Пишу программу, реализующую сеть Фейстеля (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;

.........
}
 

a0z

Well-known member
15.03.2011
108
0
#2
vector *= L[num];

щито это? Умножаешь адрес массива на какое-то число?
 
P

Pecho

#3
Ох, ну ты и вспомнил про тему, я про неё уже забыл:rolleyes:

Решил эту проблему с умножением матрицы на вектор, выглядит так:
C++:
#include <stdio.h>
#include <string.h>

unsigned char Key[6]; //ключевой массив
unsigned int L1[32][32]; //массив с 1-й матрицей
unsigned int L2[32][32]; //массив со 2-й матрицей
unsigned int L3[32][32]; //массив с 3-й матрицей
unsigned int vector[1][32]; //подблок, для перемножения на матрицу

void Multi(unsigned int number)//процедура умножения вектора на матрицу
{
int i,j;
unsigned int rez[32], mas[32][32];
if (number==0) for (i=0;i<32;i++) for (j=0;j<32;j++){mas[i][j]=L1[i][j];}
if (number==1) for (i=0;i<32;i++) for (j=0;j<32;j++){mas[i][j]=L2[i][j];}
if (number==2) for (i=0;i<32;i++) for (j=0;j<32;j++){mas[i][j]=L3[i][j];}
for (i=0;i<32;i++) 
{
unsigned int sum=0;
for (j=0;j<32;j++)
{
sum^=vector[0][j] & mas[i][j];
}
rez[i]=sum;
}
for (i=0;i<32;i++) vector[0][i]=rez[i];
}

unsigned int FuncPreobr(unsigned int SubBlok, unsigned int num)//функция преобразования
{
SubBlok ^= ((Key[num]<<24)^(Key[num+1]<<16)^(Key[num+2]<<8)^(Key[num+3]));//побитовое сложение с ключём
SubBlok = (s1[(SubBlok>>24)]<<24)^(s2[(SubBlok>>20)&0xf]<<20)^(s3[(SubBlok>>16)&0xf]<<16)^(s4[(SubBlok>>12)&0xf]<<12)^(s5[(SubBlok>>8)&0xf]<<8)^(s6[SubBlok&0xff]);//подставляем подстановки
//побитовое умножение на матрицы 
int i;
for(i=0;i<32;i++) vector[0][i] = (SubBlok>>(31-i))&1;//побитно растаскиваем подблок в массив
Multi(num);//передача в процедуру умножения вектора на матрицу номера нужной матрицы
SubBlok=0;
for(i=0;i<32;i++) SubBlok ^= (vector[0][i]<<(31-i));//обратно
return SubBlok;
}

void Encrypt(unsigned char *l, unsigned char *r)//процедура шифрования
{
.......
}

int main(int argc, char** argv)//точка входа в программу
{
.......
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
А зачем он размером 1 на 32, а не просто 32 ?
C++:
unsigned int vector[1][32]; //подблок, для перемножения на матрицу
В чем смысл кроется?
 
L

likevlz

#5
Можно пояснить зачем в сети Х. Фейстеля полученный блок преобразований еще умножался на матрицу... С инста все позабылось, вот пытаюсь реализовать на SP сети, зачем у тебя так, не понял.
Можно подробнее?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#6
Не надо задавать новый вопрос в теме, которая к тому же еще и очень древняя. Создай новую тему.