密碼學 - Feistel分組密碼



Feistel 密碼是一種框架或設計模型,用於建立不同的對稱分組密碼,包括 DES。此設計框架的元件可以是自反的、不可反的或可反的。加密和解密演算法與 Feistel 分組密碼使用的演算法相同。

Feistel 結構演示了混淆和擴散的實現過程,並且基於 1945 年首次描述的 Shannon 結構。使用替換方法,混淆在加密金鑰和密文之間建立複雜的關係。但是擴散使用置換過程來建立明文和密文之間的複雜連結。

Feistel 密碼提出了交替實現替換和置換的框架。替換使用密文代替明文元素。置換不是像替換那樣用一個元素替換另一個元素,而是重新排列明文的元素。

演算法

  • 列出明文中的每個字元。

  • 將明文轉換為 ASCII 後,將其格式化為 8 位二進位制。

  • 將二進位制明文字串分成左右兩部分 (L1 和 R1)。

  • 對於每一輪,生成兩個隨機二進位制金鑰 (K1 和 K2),每個金鑰的長度都與明文相同。

加密

在 Feistel 密碼加密過程中,明文會經過多輪處理。每一輪都包含替換步驟和置換步驟。請檢視下面的示例,該示例描述了此設計框架中使用的加密結構。

Feistel Block Cipher Encryption
  • 步驟 1 - 明文被分成固定大小的塊,在此初始階段一次只處理一個塊。加密技術的兩個輸入是明文塊和金鑰 K。

  • 步驟 2 - 將明文塊分成兩部分。明文塊將有兩個不同的表示:LE0 代表塊的左半部分,RE0 代表右半部分。為了建立密文塊,明文塊的兩部分 (LE0 和 RE0) 將經歷多輪明文處理。

對於每一輪,加密函式都應用於金鑰 Ki 以及明文塊的右半部分 REi。接下來,左半部分 LEj 與函式結果進行異或運算。在密碼學中,邏輯運算子 XOR 用於比較兩個輸入位並生成一個輸出位。對於下一輪,XOR 函式的輸出成為新的右半部分 RE i+1。對於下一輪,左半部分 LEi+1 取代之前的右半部分 REi。

相同的函式(透過將輪函式應用於明文塊的右半部分來實現替換函式)將在每一輪執行。塊的左半部分用於對函式的輸出進行異或運算。之後,使用置換函式交換這兩半部分。給出下一輪的置換結果。實際上,Feistel 密碼模型類似於前面討論的 Shannon 結構,因為它交替使用替換和置換過程。

Feistel 密碼的設計特徵

使用分組密碼時,會考慮以下 Feistel 密碼設計特徵:

  • 塊大小 - 較大的塊大小被認為可以使分組密碼更安全。較大的塊大小,但會減慢加密和解密過程的執行速度。分組密碼通常包含 64 位塊,而較新的版本,例如 AES(高階加密標準),則具有 128 位塊。

  • 簡單的分析 - 透過使分組密碼易於分析,可以發現和修復密碼分析漏洞,從而導致強演算法的開發。

  • 金鑰大小 - 與塊大小類似,較高的金鑰大小被認為更安全,但它們還會導致加密和解密過程花費時間才能完成。現代密碼中,之前的 64 位金鑰已被 128 位金鑰取代。

  • 輪數 - 輪數也會影響分組密碼的安全性。更多輪數可以提高安全性,但也會使加密更難以破解。因此,輪數取決於公司想要的資料保護型別。

  • 輪函式 - 複雜的輪函式會提高分組密碼的安全性。

  • 子金鑰生成函式 - 對於經驗豐富的密碼分析人員來說,具有更復雜的子金鑰生成函式的密碼更難以解密。

  • 快速的軟體加密和解密 - 使用可以提高分組密碼執行速度的軟體是有利的。

解密

Feistel 密碼模型對加密和解密使用相同的演算法這一事實可能會讓您感到驚訝。解密時需要注意以下一些重要準則:

Feistel Block Cipher Decryption

如上圖所示,加密文字塊分為兩部分,左部分 (LD0) 和右部分 (RD0)。

輪函式使用金鑰Kn-1對密碼塊的右半部分進行運算,就像加密演算法一樣。密文塊的左半部分與函式的結果進行異或運算。異或運算的結果成為新的右半部分(RD1),RD0與LD0交換位置,用於後續迴圈。事實上,每一輪都使用相同的函式,並在完成一定數量的輪次後得到明文塊。

Python實現

讓我們藉助Python的binascii和random模組來實現Feistel分組密碼:

此Python程式展示了Feistel密碼演算法的加密和解密過程。為了恢復原始明文,它首先加密輸入,然後對其進行解密。

示例

import binascii
import random

def random_key(p):
   key = ""
   p = int(p)
   for _ in range(p):
      temp = random.randint(0, 1)
      temp = str(temp)
      key = key + temp
   return key

def exor_func(a, b):
   temp = ""
   for i in range(len(a)):
      if a[i] == b[i]:
         temp += "0"
      else:
         temp += "1"
   return temp

def convert_bin_to_dec(binary):
   string = int(binary, 2)
   return string

plaintext = "Hello Everyone"
print("Plain Text is:", plaintext)

plaintext_Ascii = [ord(x) for x in plaintext]
plaintext_Bin = [format(y, '08b') for y in plaintext_Ascii]
plaintext_Bin = "".join(plaintext_Bin)

n = len(plaintext_Bin) // 2
L1 = plaintext_Bin[0:n]
R1 = plaintext_Bin[n::]
m = len(R1)

K1 = random_key(m)
K2 = random_key(m)

f1 = exor_func(R1, K1)
R2 = exor_func(f1, L1)
L2 = R1

f2 = exor_func(R2, K2)
R3 = exor_func(f2, L2)
L3 = R2

bin_data = L3 + R3
str_data = ''

for i in range(0, len(bin_data), 7):
   temp_data = bin_data[i:i + 7]
   decimal_data = convert_bin_to_dec(temp_data)
   str_data = str_data + chr(decimal_data)

print("Cipher Text:", str_data)

L4 = L3
R4 = R3

f3 = exor_func(L4, K2)
L5 = exor_func(R4, f3)
R5 = L4

f4 = exor_func(L5, K1)
L6 = exor_func(R5, f4)
R6 = L5
plaintext1 = L6 + R6

plaintext1 = int(plaintext1, 2)
Rplaintext = binascii.unhexlify('%x' % plaintext1)
print("Decrypted Plain Text is: ", Rplaintext)

輸出

Plain Text is: Hello Everyone
Cipher Text: '$Mau*ALLd;7B
Decrypted Plain Text is:  b'Hello Everyone'

總結

組織機構可以使用稱為Feistel密碼的流行加密設計理念來幫助保護其敏感資料。即使攻擊者知道密碼演算法,強大的加密密碼也應該阻止攻擊者在沒有金鑰或金鑰集的情況下破譯密碼明文。除了這種密碼模型外,企業還應實施分層的網路安全方法,以幫助阻止攻擊者竊取或洩露其機密資料。

廣告
© . All rights reserved.