2016-09-15 30 views
1

我正在编码AES Invert mixcolumns操作,我需要在GF(256)中将数字乘以14。这是我想出了(p是结果和Q 14乘以数量):在GF(256)中乘以14

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <unistd.h> 
int main() 
{ 
    uint8_t p=1, q=0x02; 
    p = (q<<1)^(q<<2)^(q<<3);//*(x³+x²+x) 
    //modulo x⁸+x⁴+x³+x+1 
    if((q>>5)<5&&(q>>5)!=0&&(q>>5)!=3) 
     p^=0x1B; 
    if((q>>5)>1&&(q>>5)<6) 
     p^=0x36; 
    if((q>>5)>3) 
     p^=0x6C; 
    printf("\n\n\t%2.2X\n\n",p); 
    return 0; 
} 

它的工作原理,但我认为还有一个更简单的方式来做到这一点,但我似乎无法找到它。我的主要问题是我做了6次比较。

+0

我不明白的比较的需要,但有更多的比你问,因为它包含了注释的代码'// modulo'?但乘以14很简单,14 = 8 + 4 + 2,所以'p =(q << 3)+(q << 2)+(q << 1);' –

+0

GF(256)如AES标准所规定的那样,减少乘法模不可约多项式,该不可约多项式是x 7 + x 4 + x 3 + x + 1。 –

回答

2

我的主要问题是我做了6个比较。

使用查找表来避免所有的比较。 q>>5只有3位。

static const uint8_t Table1B[8] = { 0, 0x1B, 0x1B, 0, 0x1B, 0, 0, 0 }; 
static const uint8_t Table36[8] = { 0, 0, 0x36, 0x36, 0x36, 0x36, 0, 0 }; 
static const uint8_t Table6C[8] = { 0, 0, 0, 0, 0x6C, 0x6C, 0x6C, 0x6C }; 

q >>= 5; 
p ^= Table1B[q]; 
p ^= Table36[q]; 
p ^= Table6C[q]; 

很有可能可以简化为1个表:Table[0] = Table1B[0]^Table36[0]^Table6C[0]

p ^= Table[q >> 5]; 
+0

会增加性能吗? xoring 0如何工作机器代码明智? –

+0

@ 2A-66-42“是否会增加性能”可能。测试(分析)将显示。要确定,您需要提供平台,编译器,使用的选项和完整的测试用例代码。 “xoring 0如何使机器代码更明智?” 'p^= some_variable_that_happens_to_be_0'花费的时间与'p^= any_variable'一样多。 'p^= a_constant_0;'当然可以优化为NOP。 – chux