Block-Cipher

如何計算某個密文長度允許的最大純文字長度?

  • August 18, 2012

我在數據庫中加密和儲存敏感值。我在數據庫中有一個設置的最大長度,但為了提供有用的使用者回饋,我想知道對於給定的數據庫長度我應該允許的最大輸入。

我可以拼湊一個蠻力給出答案的測試,但我想更廣泛地了解如何進行計算。

在我的具體情況下,我在帶有 PKCS7 填充的 CBC 模式下使用 Twofish。結果儲存為 base64 編碼字元串。數據庫列是一個 VARCHAR(512) 列。

我知道 base64 的成本約為輸入的 137%,因此,大致而言,512/1.37 = ~373. 但現在在哪裡?是 373,恰好是 23 個塊,最大大小,還是還有更多?

非常感謝您的耐心。:)

好吧,要弄清楚這種事情,如果我們向後工作會更容易。

所以,我們從後面開始(事實上我們可以在一個數據庫欄位中儲存多達 512 個字元),並考慮我們可以儲存多少二進制數據。那麼,base-4 需要 3 個字節的二進制數據,並將其編碼為 4 個字節的 base-64。因此,我們可以將 3*(512/4) = 384 字節的二進制加密數據儲存在 512 字節的 base 64 中。

現在,一旦我們可以儲存多達 384 字節的加密數據,我們就需要考慮對應多少明文。好吧,你沒有特別提到靜脈注射;在這種情況下,我們可能會猜測加密器選擇了一個隨機的 16 字節 IV,並將密文的前 16 個字節設置為該值。第二個要考慮的是加密器是否添加了消息認證碼;這是一個加密檢查值,可讓您檢測其他人是否修改了數據庫欄位。現在,你沒有提到你有一個,所以我們假設你沒有。這給了我們一個 384-16 = 368 字節的密文區域。

最後,您提到您使用 CBC 模式和 PKCS7 填充。CBC 模式總是生成一個 16 的倍數的密文;368 已經是 16 的倍數,所以我們不會在其中失去任何空間。另外,密文的長度正好是填充明文的長度;您提到 PKCS7 填充,它總是添加至少 1 個填充字元;這給了我們一個可以容納的 367 字節明文的最終值。

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