【问题标题】:Array Circular left shift数组循环左移
【发布时间】: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。

标签: c++ matrix aes


【解决方案1】:

您正在交换数字而不是移动。这适用于移位 1,因为第一个值会随着反复交换而波动。而对于 2,因为数字只是交换位置。但是移动 3 你只交换第一个和第二个数字,没有别的。

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

i = 3 只处理 j = 0

简化整个事情:

  1. 复制整行
  2. 复制行向后移动。

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

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多