- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優點與缺點
- 密碼學 - 現代密碼學
- 密碼學 - 傳統密碼
- 密碼學 - 加密的需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 組成部分
- 密碼系統攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力破解攻擊
- 密碼系統 - 密碼分析技術
- 密碼學的型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - 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 與 SHA1
- 密碼學 - RSA 與 DSA
- 密碼學 - RSA 與 Diffie-Hellman
- 密碼學與密碼學
- 密碼學 - 密碼學 vs 密碼分析
- 密碼學 - 經典密碼學與量子密碼學
- 密碼學與隱寫術
- 密碼學與加密
- 密碼學與網路安全
- 密碼學 - 流密碼與分組密碼
- 密碼學 - AES 與 DES 密碼
- 密碼學 - 對稱與非對稱
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
密碼學 - 電子密碼本 (ECB) 模式
電子密碼本 (ECB) 是一種基本的分組密碼操作模式,主要與對稱金鑰加密一起使用。它是一種處理按順序排列的訊息塊列表的簡單方法。
輸入明文中包含多個塊。加密金鑰用於獨立且單獨地加密每個塊(密文)。因此,也可以單獨解密每個加密塊。每種塊都可以由 ECB 支援的不同加密金鑰。
ECB 中的每個明文塊都有一個預定義的密文值與之匹配,反之亦然。因此,使用相同的金鑰,總是可以從相同的明文加密得到相同的密文。這意味著如果明文塊 P1、P2 等使用相同的金鑰多次加密,輸出的密文塊將始終相同。
換句話說,密文值將始終等於明文值。這對於包含某些相同部分的明文也成立。例如,具有相同字母標題並使用相同金鑰加密的明文將包含很大程度上相同的密文部分。
操作
要建立第一個密文塊,使用者取第一個明文塊並使用金鑰對其進行加密。
然後,他使用相同的過程和金鑰處理第二個明文塊,依此類推。
由於 ECB 模式是確定性的,如果明文塊 P1、P2……和 Pm 使用相同的金鑰兩次加密,則生成的密文塊將相同。
實際上,我們可以為給定金鑰的每個可能的明文塊技術上生成一個密文程式碼本。然後,加密只需要查詢必要的明文並選擇相應的密文即可。因此,此過程類似於在密碼本中分配程式碼字,這就是它擁有官方名稱的原因:電子密碼本操作模式 (ECB)。以下是它的視覺化表示 -
ECB 模式的分析
在現實生活中,應用程式資料通常包含可猜測的部分資訊。例如,可以推斷出薪資範圍。如果明文訊息包含在可預測的區域中,攻擊者可以透過反覆試驗從 ECB 中解密密文。
例如,如果薪資數字使用 ECB 模式的密文加密,攻擊者可以在有限次數的嘗試後檢索到薪資數字。由於大多數應用程式都不希望使用確定性密碼,因此不應在其中使用 ECB 模式。
資料加密標準與電子密碼本
IBM 在 1970 年代初期建立了資料加密標準 (DES),並在 1977 年被認可為聯邦資訊處理標準 (FIPS)。DES 可以透過五種不同的方式加密資料。其中包括原始 DES 模式或 ECB。
FIPS 版本 81 現在包含三個新選項:密碼分組連結 (CBC)、密碼反饋 (CFB) 和輸出反饋 (OFB)。後來,NIST 特別出版物 800-38a 更新為包含第五種模式,稱為計數器模式。這些模式的設計理念各不相同,包括是否使用初始化向量,是否使用塊而不是流,以及加密錯誤是否可能傳播到後續塊。
使用 Python 實現
此實現使用簡單的位元組級操作執行 ECB 加密和解密。務必記住,在大多數情況下,ECB 模式不安全,需要替換為更安全的模式,如 CBC 或 GCM。
以下是 ECB 模式加密和解密的簡單 Python 實現 -
示例
# ECB encryption & decryption
def pad(text, block_size):
padding_length = block_size - (len(text) % block_size)
padding = bytes([padding_length] * padding_length)
return text + padding
def unpad(padded_text):
padding_length = padded_text[-1]
return padded_text[:-padding_length]
def xor_bytes(byte1, byte2):
return bytes([a ^ b for a, b in zip(byte1, byte2)])
#Encryption Method
def encrypt_ecb(key, plaintext):
block_size = len(key)
padded_plaintext = pad(plaintext, block_size)
num_blocks = len(padded_plaintext) // block_size
cipher_text = b''
for i in range(num_blocks):
block_start = i * block_size
block_end = block_start + block_size
block = padded_plaintext[block_start:block_end]
encrypted_block = xor_bytes(block, key)
cipher_text += encrypted_block
return cipher_text
# Decryption Method
def decrypt_ecb(key, ciphertext):
block_size = len(key)
num_blocks = len(ciphertext) // block_size
plain_text = b''
for i in range(num_blocks):
block_start = i * block_size
block_end = block_start + block_size
block = ciphertext[block_start:block_end]
decrypted_block = xor_bytes(block, key)
plain_text += decrypted_block
return unpad(plain_text)
# key and plaintext
key = b'ABCDEFGHIJKLMNOP' # 16 bytes key for AES-128
plaintext = b'Hello, Tutorialspoint!'
ciphertext = encrypt_ecb(key, plaintext)
print("Ciphertext:", ciphertext)
decrypted_plaintext = decrypt_ecb(key, ciphertext)
print("Decrypted plaintext:", decrypted_plaintext.decode('utf-8'))
輸出
Ciphertext: b"\t'/(*jg\x1c<>$>$/##1-**1gMBC@AFGDEZ" Decrypted plaintext: Hello, Tutorialspoint!
ECB 模式的缺點
以下是使用 ECB 模式的一些缺點 -
ECB 不使用連結或初始化向量;而是使用基本的替換。由於這些特性,它易於實現。但這也是其最大的弱點。由於兩個相同的明文塊提供兩個完全相同的密文塊,因此它在密碼學上很弱。
當使用相同的加密模式和小塊大小(小於 40 位)時,不推薦使用 ECB。當塊大小較小時,明文中可能會出現一些單詞和短語。這也意味著可能會出現相同的重複部分密文塊,並且密文可以攜帶來自相同明文的模式。當明文模式易於識別時,駭客更有可能發現它們並執行程式碼本攻擊。
即使 ECB 安全性不足,也可以透過新增每個塊的隨機填充位來改進它。較大的塊(64 位或更多)可能具有足夠的熵或特殊特性來防止程式碼本攻擊。