密碼學 - 電子密碼本 (ECB) 模式



電子密碼本 (ECB) 是一種基本的分組密碼操作模式,主要與對稱金鑰加密一起使用。它是一種處理按順序排列的訊息塊列表的簡單方法。

輸入明文中包含多個塊。加密金鑰用於獨立且單獨地加密每個塊(密文)。因此,也可以單獨解密每個加密塊。每種塊都可以由 ECB 支援的不同加密金鑰。

ECB 中的每個明文塊都有一個預定義的密文值與之匹配,反之亦然。因此,使用相同的金鑰,總是可以從相同的明文加密得到相同的密文。這意味著如果明文塊 P1、P2 等使用相同的金鑰多次加密,輸出的密文塊將始終相同。

換句話說,密文值將始終等於明文值。這對於包含某些相同部分的明文也成立。例如,具有相同字母標題並使用相同金鑰加密的明文將包含很大程度上相同的密文部分。

操作

  • 要建立第一個密文塊,使用者取第一個明文塊並使用金鑰對其進行加密。

  • 然後,他使用相同的過程和金鑰處理第二個明文塊,依此類推。

由於 ECB 模式是確定性的,如果明文塊 P1、P2……和 Pm 使用相同的金鑰兩次加密,則生成的密文塊將相同。

實際上,我們可以為給定金鑰的每個可能的明文塊技術上生成一個密文程式碼本。然後,加密只需要查詢必要的明文並選擇相應的密文即可。因此,此過程類似於在密碼本中分配程式碼字,這就是它擁有官方名稱的原因:電子密碼本操作模式 (ECB)。以下是它的視覺化表示 -

ECB Mode

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 位或更多)可能具有足夠的熵或特殊特性來防止程式碼本攻擊。

廣告
© . All rights reserved.