Array Circular left shift



我试图用布尔值数组实现AES。我被困在ShiftRows()函数上,该函数左移4*4矩阵指定的量。

例如,一些随机输入将创建一个128位数组,如下所示:

Enter a message: random bits more!
Before:
01110010        01100001        01101110        01100100
01101111        01101101        00100000        01100010
01101001        01110100        01110011        00100000
01101101        01101111        01110010        01100101

AES算法然后声明每行以下左移:

Row 1: 0 Shift
Row 2: 1 left shift
Row 3: 2 left shifts
Row 4: 3 left shits

理想情况下,在左移操作之后,输出应该是:

After:
01110010        01100001        01101110        01100100
01101101        00100000        01100010        01101111
01110011        00100000        01101001        01110100
01100101        01101101        01101111        01110010

然而,这是我得到的:

After:
01110010        01100001        01101110        01100100
01101101        00100000        01100010        01101111
01110011        00100000        01101001        01110100
01101111        01101101        01110010        01100101

这是我当前运行良好的函数,然而,它在最后一行崩溃了:

for (int i = 1; i < 4; i++) {May have to research further.
for (int j = 0; j < 4 - i; j++) {
temp2D = matrix[i][mod_floor(-i + j, 4)];
matrix[i][mod_floor(-i + j, 4)] = matrix[i][j];
matrix[i][j] = temp2D;
}
}

mod_floor()函数只返回带有楼层划分的mod:

int mod_floor(int shift, int size) {//Size is number of bytes in row
return ((shift % size) + size) % size;
}

我通过硬编码最后一行找到了一个临时修复:

//Manually does final row shift since algorithm is not working properly for last row in matrix.
temp2D = matrix[3][1];
matrix[3][1] = matrix[3][0];
matrix[3][0] = temp2D;
temp2D = matrix[3][2];
matrix[3][2] = matrix[3][0];
matrix[3][0] = temp2D;
temp2D = matrix[3][3];
matrix[3][3] = matrix[3][0];
matrix[3][0] = temp2D;

然而,我不明白为什么它在最后一行崩溃了。我知道我可以创建一个临时矩阵,并复制更新后的字节移位,尽管这会破坏就地算法。

任何帮助都将不胜感激,同时,如果更多的信息可以帮助我更清楚地沟通我的问题,请告诉我。

* *编辑

使用Rotate()效果很好。我将研究为什么我的算法会失效;我认为这与Goswin所说的有关。

您正在交换数字而不是移动。这适用于移动1,因为第一个值随着一次又一次的交换而波动。对于2,因为数字互换位置。但是移动3个单位,你只能交换第一个和第二个数字,而不能交换其他数字。

for (int j = 0; j < 4 - i; j++) {

只处理j = 0i = 3

简化整件事:

  1. 复制整行
  2. 复制后移的行。

让编译器将其优化为将4个数字加载到寄存器中并将它们写回来。

最新更新