我有一个用于AES类型实现的sbox,比如
int box[4][4] = {{0xA,0x3,0xC,0xB},
{0xE,0xF,0x2,0xE},
{0x6,0x4,0x0,0xF},
{0xC,0x4,0xF,0x3}};
我想得到十六进制数的前2位和后2位,然后用sbox中的位置替换它
int x = 0xA //Because A has a binary representation from hex as 1010
然后行号将成为“10”的前2位,列号将成为“10”的后2位,因此int x将转到sbox并替换为“0xF”
我怎么能得到一点A,并用它来查找我的sbox?
最佳答案
x = box[x & 3][(x >> 2) & 3];
可以工作,假设当你说“行号将成为前2位”时,你指的是四个中的两个低阶位[即,右2];否则(当你说“前2”时,你指的是“左2”),x = box[(x >> 2) & 3][x & 3];
就是你所需要的。
但是,一般来说,二维数组访问比一维数组访问慢,因此我将使用一维数组,而不是将这两对位作为单独的索引进行隔离相反,使用x的低位4位作为1D索引这样就不会有任何额外的移位,掩蔽,乘法和加法的二维偏移地址计算。
如果“前2位”是指“最右边的2位”。。。
int box[16] = {0xA,0xE,0x6,0xC, 0x3,0xF,0x4,0x4, 0xC,0x2,0x0,0xF, 0xB,0xE,0xF,0x3};
如果“前2位”是指“最左边的2位”。。。
int box[16] = {0xA,0x3,0xC,0xB, 0xE,0xF,0x2,0xE, 0x6,0x4,0x0,0xF, 0xC,0x4,0xF,0x3};
然后,使用盒子。。。
x = box[x & 0xF]; // use the bottom 4 bits as single index
希望有帮助:-)