- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優點與缺點
- 密碼學 - 現代
- 密碼學 - 傳統密碼
- 密碼學 - 加密的需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 組成部分
- 密碼系統的攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力破解攻擊
- 密碼系統 - 密碼分析技術
- 密碼學的型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - Feistel分組密碼
- 分組密碼的操作模式
- 分組密碼的操作模式
- 電子密碼本 (ECB) 模式
- 密碼分組連結 (CBC) 模式
- 密碼反饋 (CFB) 模式
- 輸出反饋 (OFB) 模式
- 計數器 (CTR) 模式
- 古典密碼
- 密碼學 - 反向密碼
- 密碼學 - 凱撒密碼
- 密碼學 - ROT13 演算法
- 密碼學 - 置換密碼
- 密碼學 - 加密置換密碼
- 密碼學 - 解密置換密碼
- 密碼學 - 乘法密碼
- 密碼學 - 阿芬密碼
- 密碼學 - 簡單替換密碼
- 密碼學 - 簡單替換密碼的加密
- 密碼學 - 簡單替換密碼的解密
- 密碼學 - 維吉尼亞密碼
- 密碼學 - 維吉尼亞密碼的實現
- 現代密碼
- Base64 編碼與解碼
- 密碼學 - XOR 加密
- 替換技術
- 密碼學 - 單表代換密碼
- 密碼學 - 單表代換密碼的破解
- 密碼學 - 多表代換密碼
- 密碼學 - Playfair 密碼
- 密碼學 - Hill 密碼
- 多表代換密碼
- 密碼學 - 一次性密碼本
- 一次性密碼本的實現
- 密碼學 - 置換技術
- 密碼學 - 柵欄密碼
- 密碼學 - 列置換密碼
- 密碼學 -隱寫術
- 對稱演算法
- 密碼學 - 資料加密
- 密碼學 - 加密演算法
- 密碼學 - 資料加密標準 (DES)
- 密碼學 - 三重 DES
- 密碼學 - 雙重 DES
- 高階加密標準 (AES)
- 密碼學 - AES 結構
- 密碼學 - AES 變換函式
- 密碼學 - 位元組替換變換
- 密碼學 - 行移位變換
- 密碼學 - 列混淆變換
- 密碼學 - 輪金鑰加變換
- 密碼學 - AES 金鑰擴充套件演算法
- 密碼學 - Blowfish 演算法
- 密碼學 - SHA 演算法
- 密碼學 - RC4 演算法
- 密碼學 - Camellia 加密演算法
- 密碼學 - ChaCha20 加密演算法
- 密碼學 - CAST5 加密演算法
- 密碼學 - SEED 加密演算法
- 密碼學 - SM4 加密演算法
- IDEA - 國際資料加密演算法
- 公鑰(非對稱)密碼演算法
- 密碼學 - RSA 演算法
- 密碼學 - RSA 加密
- 密碼學 - RSA 解密
- 密碼學 - 建立 RSA 金鑰
- 密碼學 - 破解 RSA 密碼
- 密碼學 - ECDSA 演算法
- 密碼學 - DSA 演算法
- 密碼學 - Diffie-Hellman 演算法
- 密碼學中的資料完整性
- 密碼學中的資料完整性
- 訊息認證
- 密碼學數字簽名
- 公鑰基礎設施 (PKI)
- 雜湊
- MD5(訊息摘要演算法 5)
- SHA-1(安全雜湊演算法 1)
- SHA-256(安全雜湊演算法 256 位)
- SHA-512(安全雜湊演算法 512 位)
- SHA-3(安全雜湊演算法 3)
- 雜湊密碼
- Bcrypt 雜湊模組
- 現代密碼學
- 量子密碼學
- 後量子密碼學
- 密碼協議
- 密碼學 - SSL/TLS 協議
- 密碼學 - SSH 協議
- 密碼學 - IPsec 協議
- 密碼學 - PGP 協議
- 影像與檔案加密
- 密碼學 - 影像
- 密碼學 - 檔案
- 隱寫術 - 影像
- 檔案加密和解密
- 密碼學 - 檔案加密
- 密碼學 - 檔案解密
- 物聯網中的密碼學
- 物聯網安全挑戰、威脅和攻擊
- 物聯網安全的密碼技術
- 物聯網裝置的通訊協議
- 常用的密碼技術
- 自定義構建密碼演算法(混合密碼)
- 雲密碼學
- 量子密碼學
- 密碼學中的影像隱寫術
- DNA 密碼學
- 密碼學中的一次性密碼 (OTP) 演算法
- 區別
- 密碼學 - MD5 vs SHA1
- 密碼學 - RSA vs DSA
- 密碼學 - RSA vs Diffie-Hellman
- 密碼學 vs 密碼學
- 密碼學 - 密碼學 vs 密碼分析
- 密碼學 - 經典 vs 量子
- 密碼學 vs 隱寫術
- 密碼學 vs 加密
- 密碼學 vs 網路安全
- 密碼學 - 流密碼 vs 分組密碼
- 密碼學 - AES vs DES 密碼
- 密碼學 - 對稱 vs 非對稱
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
密碼學 - Feistel分組密碼
Feistel 密碼是一種框架或設計模型,用於建立不同的對稱分組密碼,包括 DES。此設計框架的元件可以是自反的、不可反的或可反的。加密和解密演算法與 Feistel 分組密碼使用的演算法相同。
Feistel 結構演示了混淆和擴散的實現過程,並且基於 1945 年首次描述的 Shannon 結構。使用替換方法,混淆在加密金鑰和密文之間建立複雜的關係。但是擴散使用置換過程來建立明文和密文之間的複雜連結。
Feistel 密碼提出了交替實現替換和置換的框架。替換使用密文代替明文元素。置換不是像替換那樣用一個元素替換另一個元素,而是重新排列明文的元素。
演算法
列出明文中的每個字元。
將明文轉換為 ASCII 後,將其格式化為 8 位二進位制。
將二進位制明文字串分成左右兩部分 (L1 和 R1)。
對於每一輪,生成兩個隨機二進位制金鑰 (K1 和 K2),每個金鑰的長度都與明文相同。
加密
在 Feistel 密碼加密過程中,明文會經過多輪處理。每一輪都包含替換步驟和置換步驟。請檢視下面的示例,該示例描述了此設計框架中使用的加密結構。
步驟 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 密碼模型對加密和解密使用相同的演算法這一事實可能會讓您感到驚訝。解密時需要注意以下一些重要準則:
如上圖所示,加密文字塊分為兩部分,左部分 (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密碼的流行加密設計理念來幫助保護其敏感資料。即使攻擊者知道密碼演算法,強大的加密密碼也應該阻止攻擊者在沒有金鑰或金鑰集的情況下破譯密碼明文。除了這種密碼模型外,企業還應實施分層的網路安全方法,以幫助阻止攻擊者竊取或洩露其機密資料。