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

标签 c encryption binary hex bit

我有一个像

这样的 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?

最佳答案

x = box[x & 3][(x >> 2) & 3]; 将工作假设当你说“行号将成为前 2 位”你的意思是两个四个中的低位[即右边的两个];否则(当您说“第一个 2”时,您的意思是“剩下的 2”),x = box[(x >> 2) & 3][x & 3]; 就是您所需要的。

但是,一般来说,您的二维数组访问比一维数组访问慢,所以我会使用一维数组而不是将两对位隔离为单独的索引。而是使用 x 的低 4 位作为一维索引。则不会有任何额外的移位和屏蔽或二维偏移地址计算的乘法和加法。

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

希望对您有所帮助:-)

关于c - 如何获取十六进制数的位 AES 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22266647/

相关文章:

binary - n 位可以表示多少个值?

c - 重构此 C 代码的最佳方法? CS50 - mario.c(更多)

c - 在递归函数中使用 fprintf 时遇到问题

security - 端到端加密和同步

javascript - node.js中需要解密的数据如何加密?

encryption - Travis-CI 需要什么来解密我的 fork 上的安全变量?

python - django 如何处理二进制 post 数据?

windows - 用于查看组合字符串和 float 据的十六进制编辑器

c - 如果未设置规范模式,非阻塞读取会失败吗?

c - 在 for 循环中使用 scanf