密码学 - 移行变换



AES 中对称加密方法的一个线性单元是移行变换。它是一种转置运算,其中状态的行被多次重复移动。此函数的目的是通过随机排列每个 128 位块中的位来提供跨多个轮次的位扩散。

由于这种变换,状态行按如下方式移动:第一行保持不变,第二行向左移动一个字节,第三行向左移动两个字节,最后一行向左移动三个字节。

没有移行阶段的 AES 比 AES 更强;它们在轮次中的值几乎没有变化。这归因于较差的加密质量。

AES 算法中最困难的部分是线性密码分析和差分密码分析,其中两种方法的常用方法都可以用来解决 Rijndael。

根据对抵抗差分和线性密码分析的抵抗力的分析,认为任意未知和密钥相关的替换和置换变换是增强分组密码抵抗差分和线性攻击能力的一个良好因素,因为这些攻击需要已知的变换。

它是如何工作的?

高级加密标准 (AES) 算法的组成部分之一是移行变换。它是数据加密过程中的一个步骤。AES 状态是字节网格,在此阶段,行被循环移动。让我们简化它 -

  • 状态矩阵 - 数据由 AES 算法排列成状态矩阵,这是一个字节网格。通常,此矩阵中有四行四列。
  • 移行步骤 - 在此阶段,状态矩阵中每一行的字节都向左移动。第一行没有移动。第二行向左移动了一个位置,第三行向左移动了两个位置,第四行向左移动了三个位置。由于此移动是循环进行的,因此从一行一端移出的字节将被放回另一端。

示例 - 让我们使用以下状态矩阵为例 -

0x01  0x02  0x03  0x04
0x05  0x06  0x07  0x08
0x09  0x0A  0x0B  0x0C
0x0D  0x0E  0x0F  0x10

移行阶段之后,它变成 -

0x01  0x02  0x03  0x04
0x06  0x07  0x08  0x05
0x0B  0x0C  0x09  0x0A
0x10  0x0D  0x0E  0x0F

如您所见,每一行都向左移动了特定数量的位置。

  • 目的 - 移行阶段通过将扩散包含到加密过程中来增加识别数据中模式的难度。

使用 Python 实现

代码中定义的 shift_rows 函数用于在高级加密标准 (AES) 算法的上下文中实现移行变换。shift_rows 函数以状态矩阵作为输入,执行移行变换,并输出更改后的状态矩阵。

示例

def shift_rows(state):
   for i in range(1, 4):
      state[i] = state[i][i:] + state[i][:i]
   return state

# function execution
state_matrix = [
   [0x01, 0x02, 0x03, 0x04],
   [0x05, 0x06, 0x07, 0x08],
   [0x09, 0x0A, 0x0B, 0x0C],
   [0x0D, 0x0E, 0x0F, 0x10]
]

shifted_state = shift_rows(state_matrix)
for row in shifted_state:
   print(' '.join(format(x, '02X') for x in row))

以下是上述示例的输出 -

输入/输出

01 02 03 04
06 07 08 05
0B 0C 09 0A
10 0D 0E 0F

使用 Java 实现

这段 Java 代码展示了如何在 AES 加密算法的上下文中应用移行变换,方法是更改状态矩阵。它还提供了更改的有效实现。请参见下面的代码 -

示例

// AES Class for shiftrows transformation
public class AES {
   public static byte[][] shiftRows(byte[][] state) {
      for (int i = 1; i < 4; i++) {
         byte[] temp = new byte[4];
         for (int j = 0; j < 4; j++) {
            temp[j] = state[i][(j - i + 4) % 4]; 
         }
         state[i] = temp;
      }
      return state;
   }
   // Main function
   public static void main(String[] args) {
      byte[][] stateMatrix = {
         {0x01, 0x02, 0x03, 0x04},
         {0x05, 0x06, 0x07, 0x08},
         {0x09, 0x0A, 0x0B, 0x0C},
         {0x0D, 0x0E, 0x0F, 0x10}
      };

      byte[][] shiftedState = shiftRows(stateMatrix);

      for (byte[] row : shiftedState) {
         for (byte b : row) {
            System.out.print(String.format("%02X ", b));
         }
         System.out.println();
      }
   }
}

以下是上述示例的输出 -

输入/输出

01 02 03 04 
08 05 06 07 
0B 0C 09 0A 
0E 0F 10 0D 

使用 C++ 实现

这段 C++ 代码演示了移行变换,这是 AES 加密过程中的一个重要阶段。C++ 向量和 std::rotate 函数用于执行循环左移。以下是使用 C++ 的实现 -

示例

#include <iostream>
#include <vector>
#include <algorithm> // Include the algorithm header

std::vector<std::vector<int>> shiftRows(std::vector<std::vector<int>> state) {
   for (int i = 1; i < 4; i++) {
      std::rotate(state[i].begin(), state[i].begin() + i, state[i].end());
   }
   return state;
}

int main() {
   std::vector<std::vector<int>> stateMatrix = {
      {0x01, 0x02, 0x03, 0x04},
      {0x05, 0x06, 0x07, 0x08},
      {0x09, 0x0A, 0x0B, 0x0C},
      {0x0D, 0x0E, 0x0F, 0x10}
   };

   auto shiftedState = shiftRows(stateMatrix);

   for (const auto& row : shiftedState) {
      for (int val : row) {
         std::cout << std::hex << val << " ";
      }
      std::cout << std::endl;
   }
   return 0;
}

以下是上述示例的输出 -

输入/输出

1 2 3 4 
6 7 8 5 
b c 9 a 
10 d e f 

总结

本章介绍了移行变换,这是称为高级加密标准 (AES) 的对称加密过程中的一个重要阶段。AES 加密中的移行变换需要循环移动状态矩阵的行。本章还包括使用 Python、Java 和 C++ 的移行变换的实现,演示了如何使用各种编程语言和方法在 AES 加密的上下文中应用它。

广告