Encryption

移除河豚填充物

  • February 27, 2017

我目前正在試驗 Blowfish 加密。

我注意到解密的消息和原始消息的長度不同。這適用於ECBCBCCTR模式。

在此處輸入圖像描述

從原始消息到解密消息的字節差只是數組末尾的尾隨零。但是,最後的零填充長度似乎有所不同。

在那兒 :

  1. 一種產生與輸入消息大小相同的解密輸出的方法?
  2. 一種計算最後零填充長度的方法(這樣我就可以在最後切斷它們)

有沒有辦法生成與輸入消息大小相同的解密輸出?

是的,點擊率模式應該適用於此。您必須有一個損壞的實現,因為 CTR 模式不需要填充。不過,您可以簡單地使用密文的最左邊字節。如果因此解密失敗,那麼您可以簡單地用零填充密文,解密並刪除(現在是隨機的)填充字節數,以便您的明文長度與密文長度匹配。

請注意,通常還會發送 IV。IV 需要對於 CTR 模式是唯一的(以使計數器始終是唯一的)。這對於像 Blowfish 這樣的 8 字節分組密碼比對於像 AES 這樣的 16 字節分組密碼更麻煩。您將需要使用計數器 IV 或建立 IV 以使密文與明文具有相同的長度。

一種計算最後零填充長度的方法(這樣我就可以在最後切斷它們)。

對於純文字 ASCII 文本,您可以簡單地刪除最後的所有零字節;零是一個稱為 NUL 的控製字元,不應出現在可列印文本中。

請注意,有兩種形式的零填充:一種總是填充,另一種不總是填充(更常用)。你可以加密一個 8 字節的明文塊,看看你得到的是哪一個。

請注意,對於末尾可能包含零字節的二進制消息,零填充不是確定性的,這意味著您無法確定確切的填充量。如果需要,您需要自己實現填充模式,例如 PKCS#5/PKCS#7 填充。


不要使用 Blowfish,使用 16 字節的分組密碼,最好使用經過身份驗證的模式(例如 GCM)中的 AES(儘管它確實添加了身份驗證標籤作為成本)。即使是發明者 Bruce Schneier 也不再推薦 Blowfish。

8 字節塊密碼對 CTR 模式尤其有害。如果您必須堅持使用 Blowfish,您最好使用 CFB 或 OFB 模式。這些也是將分組密碼轉換為流密碼的模式,因此它們不需要填充。

引用自:https://crypto.stackexchange.com/questions/44222