如何获取十六进制数AES实现的位

时间:2014-03-08 07:51:52

标签: c encryption binary hex bits

我有一个用于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

然后行号将成为A“10”的前2位,列号将成为A“10”的后2位,因此int x将转到sbox并替换为“0xF”

我怎么能得到A的一些并用它来查找我的sbox?

1 个答案:

答案 0 :(得分:1)

x = box[x & 3][(x >> 2) & 3];假设当你说"行号将成为前2位"你的意思是四个中的两个低阶位[即,右边两个];否则(当你说"前2"你的意思是#34;左2"),x = box[(x >> 2) & 3][x & 3];就是你所需要的。

但是,一般情况下,您的二维数组访问比一维数组访问慢,所以我会使用一维数组而不是将两对位隔离为单独的索引。而是使用x的低4位作为1D索引。然后就不会有任何额外的移位和掩蔽或乘法以及2D偏移地址计算的添加。

如果"前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

希望有所帮助: - )