我正在使用c进行AES加密程序,同时在混合列块中进行galois域乘法,
离。 [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;
}
假设为
即使通过屏蔽msb解决了上述问题,当在下面的代码中的mixcolumn中使用时,答案似乎是不正确的,它的一般矩阵运算只有乘法被galois乘法替换并且通过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];
}
}
}
你可以找到可能导致错误的任何错误......
答案 0 :(得分:0)
对于 int
如果您要清除int x;
使用x &=7fffffff;
的MSB(仅删除第一位)
对于 short int
如果您要清除short x;
使用x &=7fff;
的MSB(仅删除第一位)
如果short x == 1001011111001010
和
short mask == 0111111111111111;
然后
x &= mask;
==0001011111001010
(或0x18ca)
但是,如果您有 :0x1b3,(或0x1da),但如果出现,则需要0xb3(或0xda),您希望屏蔽前两个字节。
在这种情况下 ,将您的模板设置为0x00ff
您似乎正在使用short int
,然后将代码从int
更改为short
,或者(作为@wildplasser评论)更改为unsigned short
。
您发布的代码示例在多个位置都有无法访问的代码,并且不包含return语句:
int galois_multiply( int a,int b){
int flag,res;
switch (a){
case 1:
return b;
break;//unreachable code
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;
break;//unreachable code
case 3: res= b ^ galois_multiply(2,b);
printf("\nnumber %d returned by galois_multiply function\n",res);
return res;
break;//unreachable code
default:
printf("Invalid number %d passed to galois_multiply function\n",a);
exit(EXIT_FAILURE);
}
//no return statement (prototype specifies one)
}
switch()
语句在使用其他退出方法时不需要break;
语句,例如return x;
答案 1 :(得分:0)
终于抓住了我在案例2中犯下的错误,我已经使用了
flag= b * 0x80;
但我应该使用的是
flag= b & 0x80;
在biary中思考让我觉得这些都是相同的运算符,但在字节级别,故事是完全不同的,*将内容乘以80h而&amp;将按位AND(乘)两个操作数,这就是我需要的。