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

Тема в разделе "C/C++/C#", создана пользователем Pecho, 15 фев 2011.

  1. Pecho

    Pecho Гость

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

    .........
    }
     
Загрузка...

Поделиться этой страницей