在 GF(256) 中乘以 14
multiplication by 14 in GF(256)
我正在编码 AES 反转混合列操作,我需要在 GF(256) 中将数字乘以 14。这就是我想出的(p 是结果,q 是要乘以 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 次比较。
My main issue here is that I make 6 comparisons.
使用查找 table 避免所有比较。 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:Table[0] = Table1B[0] ^ Table36[0] ^ Table6C[0]
,等等
p ^= Table[q >> 5];
我正在编码 AES 反转混合列操作,我需要在 GF(256) 中将数字乘以 14。这就是我想出的(p 是结果,q 是要乘以 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 次比较。
My main issue here is that I make 6 comparisons.
使用查找 table 避免所有比较。 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:Table[0] = Table1B[0] ^ Table36[0] ^ Table6C[0]
,等等
p ^= Table[q >> 5];