密碼學 - 輪金鑰加變換



高階加密標準 (AES) 使用許多不同的變換來加密和解密資料。其中一種變換是輪金鑰加 (AddRoundKey)。

輪金鑰加需要在加密過程中在資料塊和不同的加密金鑰之間輪換。就像一個秘密程式碼,這個金鑰被故意用來擾亂資料。

工作原理?

輪金鑰加變換是高階加密標準 (AES) 密碼技術中的一個步驟。必須使用此過程來加密和解密資料。其工作原理如下:

  • 金鑰加 - 在輪金鑰加變換中,資料的每個位元組都使用簡單的按位異或 (XOR) 運算與加密金鑰的相應位元組組合。這意味著如果資料中的位和金鑰中相應的位不同,則加密資料中的結果位將設定為 1;否則,它將設定為 0。
  • 金鑰擴充套件 - 此過程在應用輪金鑰加變換之前加密加密金鑰。此過程為每個加密輪建立一個唯一的輪金鑰集。
  • 輪金鑰 - 每個輪金鑰都是從原始加密金鑰建立的,並用於加密特定輪的資料。輪金鑰加變換將輸入的每個位元組與其對應的輪金鑰位元組組合以產生加密輸出。

特點

  • AES 加密的每個週期都有一個唯一的金鑰。
  • 使用輪金鑰加變換,每個資料位元組都與其對應的輪金鑰位元組進行異或運算。
  • 當資料進行異或運算時,未經授權的實體將難以解碼加密的傳輸。
  • 透過為每一輪使用不同的金鑰,AES 提高了加密的複雜性和安全性。

Python 實現

這段 Python 程式碼使用列表推導式和 Python 內建的 zip 函式,迭代資料和輪金鑰的相應位元組,將 XOR 運算子 (\^) 應用於每一對位元組,以實現輪金鑰加。

示例

def addRoundKey(data, round_key):
   return bytes(a ^ b for a, b in zip(data, round_key))

# function execution
data = b'\x12\x34\x56\x78'
round_key = b'\xAB\xCD\xEF\x01'
encrypted_data = addRoundKey(data, round_key)
print("The Encrypted Data:", encrypted_data.hex())

以下是上述示例的輸出:

輸入/輸出

The Encrypted Data: b9f9b979

Java 實現

現在我們將使用 Java 來實現輪金鑰加變換。Java 使用一個簡單的迴圈來迭代資料和輪金鑰的每個位元組,以執行 XOR 運算 (^)。Java 的原始陣列型別 byte[] 用於儲存資料和輪金鑰。因此程式碼如下:

示例

public class AddRoundKey {
   public static byte[] addRoundKey(byte[] data, byte[] roundKey) {
      byte[] encryptedData = new byte[data.length];
      for (int i = 0; i < data.length; i++) {
         encryptedData[i] = (byte) (data[i] ^ roundKey[i]);
      }
      return encryptedData;
   }

   public static void main(String[] args) {
      byte[] data = {(byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78};
      byte[] roundKey = {(byte) 0xAB, (byte) 0xCD, (byte) 0xEF, (byte) 0x01};
      byte[] encryptedData = addRoundKey(data, roundKey);
      System.out.print("Encrypted Data: ");
      for (byte b : encryptedData) {
         System.out.printf("%02X ", b);
      }
   }
}

以下是上述示例的輸出:

輸入/輸出

Encrypted Data: B9F9B979

C++ 實現

此 C++ 實現使用 std::vector 來儲存資料和輪金鑰。一個簡單的 for 迴圈用於迭代資料和輪金鑰的每個位元組,以執行 XOR 運算 (^)。然後,加密後的資料儲存在另一個 std::vector 中。程式碼如下:

示例

#include <iostream>
#include <vector>

std::vector<unsigned char> addRoundKey(const std::vector<unsigned char>& data, const std::vector<unsigned char>& roundKey) {
   std::vector<unsigned char> encryptedData;
   for (size_t i = 0; i < data.size(); ++i) {
      encryptedData.push_back(data[i] ^ roundKey[i]);
   }
   return encryptedData;
}

int main() {
   std::vector<unsigned char> data = {0x12, 0x34, 0x56, 0x78};
   std::vector<unsigned char> roundKey = {0xAB, 0xCD, 0xEF, 0x01};
   std::vector<unsigned char> encryptedData = addRoundKey(data, roundKey);
   std::cout << "Encrypted Data: ";
   for (auto byte : encryptedData) {
      printf("%02X ", byte);
   }
   return 0;
}

以下是上述示例的輸出:

輸入/輸出

Encrypted Data: B9 F9 B9 79 

總結

輪金鑰加變換是高階加密標準 (AES) 密碼技術的重要組成部分。使用按位異或 (XOR) 方法將資料的每個位元組與加密金鑰的相應位元組組合。Python、Java 和 C++ 中都有輪金鑰加的實現。所有實現的過程都是相同的:迭代輪金鑰和相關資料位元組,對結果進行異或運算,最後返回加密資料。

廣告
© . All rights reserved.