Я работаю над программой шифрования AES, используя c, выполняя умножение поля Галуа в блоке столбцов микширования,
бывший. [https://crypto.stackexchange.com/questions/2402/how-to-solve-mixcolumns][1]
код
for galois field multiplication
int galois_multiply( int a,int b){
int flag,res;
switch (a){
case 1:
return b;
break;
case 2: flag= b * 0x80;
b= b << 1; //left shift
if (flag)
res= b ^ 0x1b;
else
res= b ^0x00;
printf("\nnumber %d returned by galois_multiply function\n",res);
return res;
case 3: res= b ^ galois_multiply(2,b);
printf("\nnumber %d returned by galois_multiply function\n",res);
return res;
default:
printf("Invalid number %d passed to galois_multiply function\n",a);
exit(EXIT_FAILURE);
}
return 0;
}
предположим для
- d4×02 — это d4‹‹1, исключающее ИЛИ с 1b (поскольку установлен старший бит d4), правильный ответ — b3; тогда как с помощью этого кода я получаю 1b3
- bf×03 — это bf‹‹1, исключающее ИЛИ с 1b (поскольку установлен старший бит bf) и bf (поскольку мы умножаем на 3), должно дать da; но с использованием кода результат 1da
даже несмотря на то, что вышеуказанная проблема решается путем маскирования старшего разряда, при использовании в столбце mixcolumn в следующем коде ответ кажется неверным, его общая матричная операция только там, где умножение заменено умножением Галуа, а сложение - операцией XOR.
void mixColumn(unsigned char **state){
int mc[4][4]={{2,3,1,1},{1,2,3,1},{1,1,2,3},{3,1,1,2}};
int res[4][4]={{0}};
int i,j,k;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
res[i][j]=0;
for(k=0;k<4;k++)
res[i][j]= res[i][j] ^ galois_multiply(mc[i][k],state[k][j]);
state[i][j]=res[i][j];
}
}
}
Можете ли вы найти какие-либо ошибки, которые могут вызывать ошибку ...
b= b << 1;
можно записать какb <<= 1;
, аres= b ^0x00;
AS `res = b; - person wildplasser   schedule 26.04.2014short
. Почему вы используетеint
? - person ryyker   schedule 26.04.2014