使用AES加密時,必須將明文填充到密碼塊大小。大多數庫和標準使用填充,其中填充字節可以由未填充的明文長度確定。在可能的情況下使用隨機填充字節有什麼好處?在AES加密中填充隨機數據有什麼好處嗎?
我正在實施一個存儲敏感的每用戶和每會話數據的方案。數據通常是JSON編碼的鍵值對,並且可能是短而重複的。我期待PKCS#5的指導,但我計劃使用AES加密算法而不是DES3。我計劃在每個數據項上隨機選擇一個IV,並根據需要確定一個由用戶ID和密碼或會話ID確定的密鑰。
讓我感到驚訝的一件事是明文的PKCS#5填充方案。爲了將密文填充到8字節塊,在末尾添加1到8個字節,填充字節內容反映了填充字節的數量(即,01
,0202
,030303
,直到0808080808080808
)。我自己的填充方案是在明文前面使用隨機字節,並且明文的最後一個字符是添加的填充字節數。
我的推理是在AES-CBC模式下,每個塊都是前面塊的密文的函數。這樣,每個明文都會有一個隨機性元素,爲我提供了另一層來自已知明文攻擊的保護,以及IV和關鍵問題。由於我的明文預計會很短,所以我不介意將整個解密的字符串保存在內存中,並將正面和背面的填充切片填充。
一個缺點是相同的無襯墊明文,IV和密鑰會導致不同的密文,使得單元測試變得困難(但並非不可能 - 我可以使用僞隨機填充發生器進行測試,並且密碼強度更高生產)。
另一種情況是,爲了實施隨機填充,我必須添加至少兩個字節 - 一個計數和一個隨機字節。對於確定性填充,最小值爲一個字節,或者與明文或密文包裝器一起存儲。由於像PKCS#5這樣廣受好評的標準決定使用確定性填充,所以我想知道是否還有其他我錯過的東西,或者我認爲太高的好處。
優秀點。我想我會爲密鑰和IV端保存密碼質量的隨機數。我正在尋找PBKDF2的密鑰派生,但它使用SHA-1。 – jwhitlock 2011-01-21 21:33:42