1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

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

  1. Pecho

    Pecho Гость

    Репутация:
    0
    Доброго времени суток!
    Пишу программу, реализующую сеть Фейстеля (3 итерации). Задание к программе требует, чтобы в функции преобразования преобразуемый подблок, после побитового сложения с ключём и преобразования с подстановками, умножался на матрицу.

    Вот этот момент и вызывает ошибки и проблемы, прошу посмотреть листинг и помочь с умножением вектора на матрицу.

    Привел фрагменты кода, касающиеся именно матриц. В задании даются матрицы размерности 32х32, но здесь для уменьшения размера кода привожу их как 8х8

    Язык программирования - Си
    Код:
    #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;
    
    .........
    }
     
  2. a0z

    a0z Well-Known Member

    Репутация:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    108
    Симпатии:
    0
    vector *= L[num];

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

    Pecho Гость

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

    Решил эту проблему с умножением матрицы на вектор, выглядит так:
    Код:
    #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)//точка входа в программу
    {
    .......
    }
     
  4. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    А зачем он размером 1 на 32, а не просто 32 ?
    Код:
    unsigned int vector[1][32]; //подблок, для перемножения на матрицу
    В чем смысл кроется?
     
  5. likevlz

    likevlz Гость

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

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Не надо задавать новый вопрос в теме, которая к тому же еще и очень древняя. Создай новую тему.
     
Загрузка...

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