You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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算法的底层实现逻辑。

你提到的结构图示:
AES块列优先存储示例
行移位步骤困惑图示

内容的提问来源于stack exchange,提问作者suchislife801

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:33:22