【发布时间】:2014-04-26 16:11:17
【问题描述】:
我正在使用 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;
}
假设
- d4×02为d4
- bf×03 是 bf
虽然上面的问题是通过屏蔽msb来解决的,但是当在下面代码的mixcolumn中使用时,答案似乎是不正确的,它的一般矩阵运算仅在乘法被伽罗瓦乘法替换,加法被异或操作替换时
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];
}
}
}
你能找出任何可能导致错误的错误吗...
【问题讨论】:
-
好的,听起来你应该屏蔽掉高位。
-
任何建议我应该怎么做,我试过 number & 0x100 ,但没有帮助..
-
我将从使用无符号类型开始。有符号的整数在移位时会做一些丑陋的事情。同样
b= b << 1;可以写成b <<= 1;,res= b ^0x00;AS `res = b; -
您发布的链接似乎使用了
short大小的变量。你为什么用int? -
如果二进制更容易让你思考(如果你没有花很多时间使用十六进制,通常是这样),你可以使用二进制文字。 stackoverflow.com/questions/2611764/…
标签: c aes galois-field