密碼學 - 移行變換



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 加密的上下文中應用它。

廣告
© . All rights reserved.