【问题标题】:galois field multiplication for AES mix column block in c languagec语言中AES混合列块的伽罗瓦域乘法
【发布时间】: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 &lt;&lt; 1;可以写成b &lt;&lt;= 1;res= b ^0x00; AS `res = b;
  • 您发布的链接似乎使用了short 大小的变量。你为什么用int
  • 如果二进制更容易让你思考(如果你没有花很多时间使用十六进制,通常是这样),你可以使用二进制文字。 stackoverflow.com/questions/2611764/…

标签: c aes galois-field


【解决方案1】:

终于抓住了我在案例2中犯的错误,我用过

flag= b * 0x80;

但我应该使用的是

flag= b & 0x80;

在二进制中思考让我认为这两个都是相同的运算符,但在字节级别的情况完全不同,* 会将内容乘以 80h,而 & 将按位与(乘)两个操作数,这正是我所需要的。

【讨论】:

    【解决方案2】:

    为了一个 int
    如果您想清除 int x; 的 MSB,请使用 x &amp;=7fffffff;(仅删除第一位)
    对于一个 short int
    如果要清除 short x; 的 MSB,请使用 x &amp;=7fff;(仅删除第一位)

    如果short x == 1001011111001010
    short mask == 0111111111111111; 那么
    x &amp;= mask; ==0001011111001010(或 0x18ca)

    但是,假设您有:0x1b3(或 0x1da),但如果您想要屏蔽前两个字节,则需要 0xb3(或 0xda)。

    在这种情况下,请将您的掩码设置为 0x00ff

    您似乎在short int 工作,然后将您的代码从int 更改为short,或(作为@wildplasser cmets)更改为unsigned short

    您发布的代码示例在几个地方有无法访问的代码,并且不包含返回语句:

    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;

    【讨论】:

    • 感谢 ryyker 在基础知识方面的努力和提示。任何关于如何掩盖 MSB 的建议,请参阅 Oli 的 cmets...
    • 感谢 ryyker,它现在给出了正确的答案.. :) 但是当我尝试在 mixcolumn 方法中使用它时,它似乎给出了不正确的值
    • @Himu - 我建议发布关于该主题的另一个具体问题。另外,请考虑使用建议 HERE 以获得最佳响应。
    猜你喜欢
    • 2015-07-10
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多