【发布时间】:2022-06-11 00:15:38
【问题描述】:
我正在尝试使用一组布尔值来实现 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;
但是,我不明白为什么它会在最后一行出现故障。我知道我可以创建一个临时矩阵并在更新的字节移位发生时复制它们,尽管这会破坏原位算法。
如果有更多信息可以帮助更清楚地传达我的问题,我们将不胜感激。
【问题讨论】:
-
将第一个元素存储在 temp 中,temp = row[0]。然后对于 i = 1 到 N,row[i - 1] = row[i]。然后对于最后一个值,row[N] = temp.
-
观察到的输出是什么?它有助于显示您的期望和观察到的内容,因此更容易弄清楚可能发生的事情。
-
我认为一旦班次> 1,这将不起作用。例如,如果 i ==1,row[i - 2] = row[i] 将覆盖 row[3] 和因为我只在 temp 中保存了 row[0],所以我们会丢失 row[3]。
-
仅供参考:std::rotate().
-
@Leo,好的,也许您可以按照 ScheffsCat 的建议查看 std::rotate。