c语言中AES混合列块的galois域乘法

时间:2014-04-26 16:11:17

标签: c aes galois-field

我正在使用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 <&lt; 1,与1b独占(因为设置了d4的高位),正确的是b3;而使用此代码我得到1b3
  • bf×03是bf&lt;&lt; 1&lt; 1&lt; bf(因为bf的高位被设置)和bf(因为我们乘以3),应该给da;但使用代码结果是1da

即使通过屏蔽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];
            }
    }

}

你可以找到可能导致错误的任何错误......

2 个答案:

答案 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(乘)两个操作数,这就是我需要的。