我试图用布尔值数组实现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 = 0
的i = 3
简化整件事:
- 复制整行
- 复制后移的行。
让编译器将其优化为将4个数字加载到寄存器中并将它们写回来。