AES加密:行优先与列优先顺序,线性数组如何实现行移位?
AES行移位与一维数组实现方案
你完全不需要必须创建二维数组,用一维数组就能实现AES的列优先结构操作,核心是搞清楚一维数组索引和4x4矩阵行列的映射关系。
列优先结构的索引映射逻辑
AES的16字节块采用列优先存储到一维数组中,对应关系如下:
- 矩阵第0列:数组索引
0, 4, 8, 12(对应矩阵行0到行3) - 矩阵第1列:数组索引
1, 5, 9, 13 - 矩阵第2列:数组索引
2, 6, 10, 14 - 矩阵第3列:数组索引
3, 7, 11, 15
换句话说,矩阵中行row、列col的元素,对应一维数组的索引公式是:col * 4 + row。
一维数组实现行移位(Shift Rows)
行移位的规则是对矩阵每行做循环左移,对应到一维数组的操作如下:
- 第0行:无移位,数组索引
0,4,8,12的元素位置不变 - 第1行:循环左移1位,交换索引
1↔5↔9↔13的元素顺序 - 第2行:循环左移2位,交换索引
2↔10、6↔14的元素 - 第3行:循环左移3位(等价于右移1位),交换索引
3↔11↔15↔7的元素顺序
直接用JS代码实现的话,示例如下:
function shiftRows(state) { const newState = [...state]; // 避免修改原数组 // 处理第1行左移1位 newState[1] = state[5]; newState[5] = state[9]; newState[9] = state[13]; newState[13] = state[1]; // 处理第2行左移2位 newState[2] = state[10]; newState[6] = state[14]; newState[10] = state[2]; newState[14] = state[6]; // 处理第3行左移3位 newState[3] = state[11]; newState[7] = state[15]; newState[11] = state[3]; newState[15] = state[7]; return newState; }
额外说明
如果觉得索引映射容易混淆,也可以临时把一维数组转换成二维数组处理,完成行移位后再转回一维,但直接操作一维数组在性能上更高效,也符合AES算法的底层实现逻辑。
你提到的结构图示:

内容的提问来源于stack exchange,提问作者suchislife801
相关产品推荐
相关产品推荐

